From 403fa2d28495ca0c3689f0613c46e5f38e2477c7 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Tue, 6 Jun 2017 12:14:41 +0200 Subject: [PATCH] [#6307] Support H2 --- .../java/org/jooq/util/h2/H2Database.java | 77 +++++++++++++++++++ .../org/jooq/util/mysql/MySQLDatabase.java | 1 + 2 files changed, 78 insertions(+) diff --git a/jOOQ-meta/src/main/java/org/jooq/util/h2/H2Database.java b/jOOQ-meta/src/main/java/org/jooq/util/h2/H2Database.java index 306be82b1e..72da0df98f 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/h2/H2Database.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/h2/H2Database.java @@ -48,23 +48,31 @@ import static org.jooq.util.h2.information_schema.tables.TypeInfo.TYPE_INFO; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import org.jooq.DSLContext; +import org.jooq.Field; import org.jooq.Record; import org.jooq.Record4; import org.jooq.Result; import org.jooq.SQLDialect; +import org.jooq.SortOrder; import org.jooq.impl.DSL; import org.jooq.util.AbstractDatabase; +import org.jooq.util.AbstractIndexDefinition; import org.jooq.util.ArrayDefinition; import org.jooq.util.CatalogDefinition; import org.jooq.util.ColumnDefinition; import org.jooq.util.DefaultCheckConstraintDefinition; import org.jooq.util.DefaultDataTypeDefinition; +import org.jooq.util.DefaultIndexColumnDefinition; import org.jooq.util.DefaultRelations; import org.jooq.util.DefaultSequenceDefinition; import org.jooq.util.DomainDefinition; import org.jooq.util.EnumDefinition; +import org.jooq.util.IndexColumnDefinition; +import org.jooq.util.IndexDefinition; import org.jooq.util.PackageDefinition; import org.jooq.util.RoutineDefinition; import org.jooq.util.SchemaDefinition; @@ -93,6 +101,75 @@ public class H2Database extends AbstractDatabase { return DSL.using(getConnection(), SQLDialect.H2); } + @Override + protected List getIndexes0() throws SQLException { + List result = new ArrayList(); + + // Same implementation as in MySQLDatabase + Map> indexes = create() + .select( + Indexes.TABLE_SCHEMA, + Indexes.TABLE_NAME, + Indexes.INDEX_NAME, + Indexes.NON_UNIQUE, + Indexes.COLUMN_NAME, + Indexes.ORDINAL_POSITION, + Indexes.ASC_OR_DESC) + .from(INDEXES) + .where(Indexes.TABLE_SCHEMA.in(getInputSchemata())) + .orderBy( + Indexes.TABLE_SCHEMA, + Indexes.TABLE_NAME, + Indexes.INDEX_NAME, + Indexes.ORDINAL_POSITION) + .fetchGroups( + new Field[] { + Indexes.TABLE_SCHEMA, + Indexes.TABLE_NAME, + Indexes.INDEX_NAME, + Indexes.NON_UNIQUE + }, + new Field[] { + Indexes.COLUMN_NAME, + Indexes.ORDINAL_POSITION + }); + + for (Entry> entry : indexes.entrySet()) { + final Record index = entry.getKey(); + final Result columns = entry.getValue(); + + final SchemaDefinition tableSchema = getSchema(index.get(Indexes.TABLE_SCHEMA)); + final String indexName = index.get(Indexes.INDEX_NAME); + final String tableName = index.get(Indexes.TABLE_NAME); + final TableDefinition table = getTable(tableSchema, tableName); + final boolean unique = !index.get(Indexes.NON_UNIQUE, boolean.class); + + if (table != null) { + result.add(new AbstractIndexDefinition(tableSchema, indexName, table, unique) { + List indexColumns = new ArrayList(); + + { + for (Record column : columns) { + indexColumns.add(new DefaultIndexColumnDefinition( + this, + table.getColumn(column.get(Indexes.COLUMN_NAME)), + SortOrder.ASC, + column.get(Indexes.ORDINAL_POSITION, int.class) + )); + } + } + + @Override + protected List getIndexColumns0() { + return indexColumns; + } + }); + } + } + + return result; + } + @Override protected void loadPrimaryKeys(DefaultRelations relations) throws SQLException { for (Record record : fetchKeys("PRIMARY KEY")) { diff --git a/jOOQ-meta/src/main/java/org/jooq/util/mysql/MySQLDatabase.java b/jOOQ-meta/src/main/java/org/jooq/util/mysql/MySQLDatabase.java index 2654efb359..5b0620a1d3 100644 --- a/jOOQ-meta/src/main/java/org/jooq/util/mysql/MySQLDatabase.java +++ b/jOOQ-meta/src/main/java/org/jooq/util/mysql/MySQLDatabase.java @@ -104,6 +104,7 @@ public class MySQLDatabase extends AbstractDatabase { protected List getIndexes0() throws SQLException { List result = new ArrayList(); + // Same implementation as in H2Database Map> indexes = create() .select( Statistics.TABLE_SCHEMA,