Skip to content

Commit

Permalink
[#5874] Add support for H2's new enum types
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaseder committed Mar 23, 2018
1 parent 7054a60 commit cf0e018
Show file tree
Hide file tree
Showing 16 changed files with 1,512 additions and 1,180 deletions.
58 changes: 58 additions & 0 deletions jOOQ-meta/src/main/java/org/jooq/util/h2/H2Database.java
Expand Up @@ -48,6 +48,7 @@
import static org.jooq.util.h2.information_schema.tables.Tables.TABLES; import static org.jooq.util.h2.information_schema.tables.Tables.TABLES;
import static org.jooq.util.h2.information_schema.tables.TypeInfo.TYPE_INFO; import static org.jooq.util.h2.information_schema.tables.TypeInfo.TYPE_INFO;


import java.io.StringReader;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
Expand All @@ -62,13 +63,15 @@
import org.jooq.SQLDialect; import org.jooq.SQLDialect;
import org.jooq.SortOrder; import org.jooq.SortOrder;
import org.jooq.impl.DSL; import org.jooq.impl.DSL;
import org.jooq.tools.csv.CSVReader;
import org.jooq.util.AbstractDatabase; import org.jooq.util.AbstractDatabase;
import org.jooq.util.AbstractIndexDefinition; import org.jooq.util.AbstractIndexDefinition;
import org.jooq.util.ArrayDefinition; import org.jooq.util.ArrayDefinition;
import org.jooq.util.CatalogDefinition; import org.jooq.util.CatalogDefinition;
import org.jooq.util.ColumnDefinition; import org.jooq.util.ColumnDefinition;
import org.jooq.util.DefaultCheckConstraintDefinition; import org.jooq.util.DefaultCheckConstraintDefinition;
import org.jooq.util.DefaultDataTypeDefinition; import org.jooq.util.DefaultDataTypeDefinition;
import org.jooq.util.DefaultEnumDefinition;
import org.jooq.util.DefaultIndexColumnDefinition; import org.jooq.util.DefaultIndexColumnDefinition;
import org.jooq.util.DefaultRelations; import org.jooq.util.DefaultRelations;
import org.jooq.util.DefaultSequenceDefinition; import org.jooq.util.DefaultSequenceDefinition;
Expand Down Expand Up @@ -463,6 +466,61 @@ protected List<PackageDefinition> getPackages0() throws SQLException {
@Override @Override
protected List<EnumDefinition> getEnums0() throws SQLException { protected List<EnumDefinition> getEnums0() throws SQLException {
List<EnumDefinition> result = new ArrayList<EnumDefinition>(); List<EnumDefinition> result = new ArrayList<EnumDefinition>();

Result<Record4<String, String, String, String>> records = create()
.select(
Columns.TABLE_SCHEMA,
Columns.TABLE_NAME,
Columns.COLUMN_NAME,
Columns.COLUMN_TYPE)
.from(COLUMNS)
.where(
Columns.COLUMN_TYPE.like("ENUM(%)%").and(
Columns.TABLE_SCHEMA.in(getInputSchemata())))
.orderBy(
Columns.TABLE_SCHEMA.asc(),
Columns.TABLE_NAME.asc(),
Columns.COLUMN_NAME.asc())
.fetch();

for (Record record : records) {
SchemaDefinition schema = getSchema(record.get(Columns.TABLE_SCHEMA));

String table = record.get(Columns.TABLE_NAME);
String column = record.get(Columns.COLUMN_NAME);
String name = table + "_" + column;
String columnType = record.get(Columns.COLUMN_TYPE);

// [#1237] Don't generate enum classes for columns in MySQL tables
// that are excluded from code generation
TableDefinition tableDefinition = getTable(schema, table);
if (tableDefinition != null) {
ColumnDefinition columnDefinition = tableDefinition.getColumn(column);

if (columnDefinition != null) {

// [#1137] Avoid generating enum classes for enum types that
// are explicitly forced to another type
if (getConfiguredForcedType(columnDefinition, columnDefinition.getType()) == null) {
DefaultEnumDefinition definition = new DefaultEnumDefinition(schema, name, "");

CSVReader reader = new CSVReader(
new StringReader(columnType.replaceAll("(^enum\\()|(\\).*$)", ""))
,',' // Separator
,'\'' // Quote character
,true // Strict quotes
);

for (String string : reader.next()) {
definition.addLiteral(string);
}

result.add(definition);
}
}
}
}

return result; return result;
} }


Expand Down
31 changes: 30 additions & 1 deletion jOOQ-meta/src/main/java/org/jooq/util/h2/H2TableDefinition.java
Expand Up @@ -38,7 +38,9 @@
package org.jooq.util.h2; package org.jooq.util.h2;


import static org.jooq.impl.DSL.choose; import static org.jooq.impl.DSL.choose;
import static org.jooq.impl.DSL.falseCondition;
import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.inline;
import static org.jooq.impl.DSL.name;
import static org.jooq.impl.DSL.zero; import static org.jooq.impl.DSL.zero;
import static org.jooq.tools.StringUtils.defaultString; import static org.jooq.tools.StringUtils.defaultString;
import static org.jooq.util.h2.information_schema.tables.Columns.COLUMNS; import static org.jooq.util.h2.information_schema.tables.Columns.COLUMNS;
Expand All @@ -49,6 +51,7 @@


import org.jooq.Param; import org.jooq.Param;
import org.jooq.Record; import org.jooq.Record;
import org.jooq.exception.DataAccessException;
import org.jooq.util.AbstractTableDefinition; import org.jooq.util.AbstractTableDefinition;
import org.jooq.util.ColumnDefinition; import org.jooq.util.ColumnDefinition;
import org.jooq.util.DataTypeDefinition; import org.jooq.util.DataTypeDefinition;
Expand All @@ -65,6 +68,8 @@
*/ */
public class H2TableDefinition extends AbstractTableDefinition { public class H2TableDefinition extends AbstractTableDefinition {


private static Boolean is1_4_197;

public H2TableDefinition(SchemaDefinition schema, String name, String comment) { public H2TableDefinition(SchemaDefinition schema, String name, String comment) {
super(schema, name, comment); super(schema, name, comment);
} }
Expand All @@ -84,6 +89,7 @@ public List<ColumnDefinition> getElements0() throws SQLException {
Columns.COLUMN_NAME, Columns.COLUMN_NAME,
Columns.ORDINAL_POSITION, Columns.ORDINAL_POSITION,
Columns.TYPE_NAME, Columns.TYPE_NAME,
is1_4_197() ? Columns.COLUMN_TYPE : inline("").as(Columns.COLUMN_TYPE),
choose().when(Columns.NUMERIC_PRECISION.eq(maxP).and(Columns.NUMERIC_SCALE.eq(maxS)), zero()) choose().when(Columns.NUMERIC_PRECISION.eq(maxP).and(Columns.NUMERIC_SCALE.eq(maxS)), zero())
.otherwise(Columns.CHARACTER_MAXIMUM_LENGTH).as(Columns.CHARACTER_MAXIMUM_LENGTH), .otherwise(Columns.CHARACTER_MAXIMUM_LENGTH).as(Columns.CHARACTER_MAXIMUM_LENGTH),
Columns.NUMERIC_PRECISION.decode(maxP, zero(), Columns.NUMERIC_PRECISION).as(Columns.NUMERIC_PRECISION), Columns.NUMERIC_PRECISION.decode(maxP, zero(), Columns.NUMERIC_PRECISION).as(Columns.NUMERIC_PRECISION),
Expand Down Expand Up @@ -113,7 +119,8 @@ public List<ColumnDefinition> getElements0() throws SQLException {
record.get(Columns.NUMERIC_PRECISION), record.get(Columns.NUMERIC_PRECISION),
record.get(Columns.NUMERIC_SCALE), record.get(Columns.NUMERIC_SCALE),
record.get(Columns.IS_NULLABLE, boolean.class), record.get(Columns.IS_NULLABLE, boolean.class),
isIdentity ? null : record.get(Columns.COLUMN_DEFAULT)); isIdentity ? null : record.get(Columns.COLUMN_DEFAULT),
name(getSchema().getName(), getName() + "_" + record.get(Columns.COLUMN_NAME)));


ColumnDefinition column = new DefaultColumnDefinition( ColumnDefinition column = new DefaultColumnDefinition(
getDatabase().getTable(getSchema(), getName()), getDatabase().getTable(getSchema(), getName()),
Expand All @@ -128,4 +135,26 @@ public List<ColumnDefinition> getElements0() throws SQLException {


return result; return result;
} }


boolean is1_4_197() {
if (is1_4_197 == null) {

// [#5874] The COLUMNS.COLUMN_TYPE column was introduced in H2 1.4.197
try {
create(true)
.select(Columns.COLUMN_TYPE)
.from(COLUMNS)
.where(falseCondition())
.fetch();

is1_4_197 = true;
}
catch (DataAccessException e) {
is1_4_197 = false;
}
}

return is1_4_197;
}
} }

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit cf0e018

Please sign in to comment.