Skip to content

Commit

Permalink
Merge pull request #16 from ergon/feature/array-metamodel-generation
Browse files Browse the repository at this point in the history
support arrays in metamodel generation
  • Loading branch information
jmatj authored Dec 4, 2024
2 parents 8c26550 + 774e31c commit 32ad991
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 49 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package ch.ergon.adam.gradleplugin.util;

import ch.ergon.adam.core.db.schema.DataType;
import ch.ergon.adam.core.db.schema.Field;
import ch.ergon.adam.core.db.schema.Table;
import org.jooq.Name;
Expand Down Expand Up @@ -33,57 +32,69 @@ protected List<ColumnDefinition> getElements0() throws SQLException {

private DataTypeDefinition dataTypeDefinition(Field field) {
return new DefaultDataTypeDefinition(getDatabase(), getSchema(),
typeName(field.getDataType()), field.getLength(), field.getPrecision(), field.getScale(),
typeName(field), field.getLength(), field.getPrecision(), field.getScale(),
field.isNullable(), field.getDefaultValue(), getUserType(field));
}

private String typeName(DataType type) {
var jooqType = switch (type) {
case BIGINT -> SQLDataType.BIGINT;
case BIGINTUNSIGNED -> SQLDataType.BIGINTUNSIGNED;
case BINARY -> SQLDataType.BINARY;
case BIT -> SQLDataType.BIT;
case BLOB -> SQLDataType.BLOB;
case BOOLEAN -> SQLDataType.BOOLEAN;
case CHAR -> SQLDataType.CHAR;
case CLOB -> SQLDataType.CLOB;
case DATE -> SQLDataType.DATE;
case DECIMAL -> SQLDataType.DECIMAL;
case DECIMAL_INTEGER -> SQLDataType.DECIMAL_INTEGER;
case DOUBLE -> SQLDataType.DOUBLE;
case ENUM -> SQLDataType.VARCHAR;
case FLOAT -> SQLDataType.FLOAT;
case INTEGER -> SQLDataType.INTEGER;
case INTEGERUNSIGNED -> SQLDataType.INTEGERUNSIGNED;
case INTERVALDAYTOSECOND -> SQLDataType.INTERVALDAYTOSECOND;
case INTERVALYEARTOMONTH -> SQLDataType.INTERVALYEARTOMONTH;
case INTERVALYEARTOSECOND -> SQLDataType.INTERVAL;
case LOCALDATE -> SQLDataType.LOCALDATE;
case LOCALDATETIME -> SQLDataType.LOCALDATETIME;
case LOCALTIME -> SQLDataType.LOCALTIME;
case LONGNVARCHAR -> SQLDataType.LONGNVARCHAR;
case LONGVARBINARY -> SQLDataType.LONGVARBINARY;
case LONGVARCHAR -> SQLDataType.LONGVARCHAR;
case NCHAR -> SQLDataType.NCHAR;
case NCLOB -> SQLDataType.NCLOB;
case NUMERIC -> SQLDataType.NUMERIC;
case NVARCHAR -> SQLDataType.NVARCHAR;
case OFFSETDATETIME -> SQLDataType.OFFSETDATETIME;
case OFFSETTIME -> SQLDataType.OFFSETTIME;
case REAL -> SQLDataType.REAL;
case SMALLINT -> SQLDataType.SMALLINT;
case SMALLINTUNSIGNED -> SQLDataType.SMALLINTUNSIGNED;
case TIME -> SQLDataType.TIME;
case TIMESTAMP -> SQLDataType.TIMESTAMP;
case TIMESTAMPWITHTIMEZONE -> SQLDataType.TIMESTAMPWITHTIMEZONE;
case TIMEWITHTIMEZONE -> SQLDataType.TIMEWITHTIMEZONE;
case TINYINT -> SQLDataType.TINYINT;
case TINYINTUNSIGNED -> SQLDataType.TINYINTUNSIGNED;
case UUID -> SQLDataType.UUID;
case VARBINARY -> SQLDataType.VARBINARY;
case VARCHAR -> SQLDataType.VARCHAR;
};
return jooqType.getTypeName();
private String typeName(Field field) {
var jooqType = switch (field.getDataType()) {
case BIGINT -> SQLDataType.BIGINT;
case BIGINTUNSIGNED -> SQLDataType.BIGINTUNSIGNED;
case BINARY -> SQLDataType.BINARY;
case BIT -> SQLDataType.BIT;
case BLOB -> SQLDataType.BLOB;
case BOOLEAN -> SQLDataType.BOOLEAN;
case CHAR -> SQLDataType.CHAR;
case CLOB -> SQLDataType.CLOB;
case DATE -> SQLDataType.DATE;
case DECIMAL -> SQLDataType.DECIMAL;
case DECIMAL_INTEGER -> SQLDataType.DECIMAL_INTEGER;
case DOUBLE -> SQLDataType.DOUBLE;
case ENUM -> SQLDataType.VARCHAR;
case FLOAT -> SQLDataType.FLOAT;
case INTEGER -> SQLDataType.INTEGER;
case INTEGERUNSIGNED -> SQLDataType.INTEGERUNSIGNED;
case INTERVALDAYTOSECOND -> SQLDataType.INTERVALDAYTOSECOND;
case INTERVALYEARTOMONTH -> SQLDataType.INTERVALYEARTOMONTH;
case INTERVALYEARTOSECOND -> SQLDataType.INTERVAL;
case LOCALDATE -> SQLDataType.LOCALDATE;
case LOCALDATETIME -> SQLDataType.LOCALDATETIME;
case LOCALTIME -> SQLDataType.LOCALTIME;
case LONGNVARCHAR -> SQLDataType.LONGNVARCHAR;
case LONGVARBINARY -> SQLDataType.LONGVARBINARY;
case LONGVARCHAR -> SQLDataType.LONGVARCHAR;
case NCHAR -> SQLDataType.NCHAR;
case NCLOB -> SQLDataType.NCLOB;
case NUMERIC -> SQLDataType.NUMERIC;
case NVARCHAR -> SQLDataType.NVARCHAR;
case OFFSETDATETIME -> SQLDataType.OFFSETDATETIME;
case OFFSETTIME -> SQLDataType.OFFSETTIME;
case REAL -> SQLDataType.REAL;
case SMALLINT -> SQLDataType.SMALLINT;
case SMALLINTUNSIGNED -> SQLDataType.SMALLINTUNSIGNED;
case TIME -> SQLDataType.TIME;
case TIMESTAMP -> SQLDataType.TIMESTAMP;
case TIMESTAMPWITHTIMEZONE -> SQLDataType.TIMESTAMPWITHTIMEZONE;
case TIMEWITHTIMEZONE -> SQLDataType.TIMEWITHTIMEZONE;
case TINYINT -> SQLDataType.TINYINT;
case TINYINTUNSIGNED -> SQLDataType.TINYINTUNSIGNED;
case UUID -> SQLDataType.UUID;
case VARBINARY -> SQLDataType.VARBINARY;
case VARCHAR -> SQLDataType.VARCHAR;
};

String typeName = jooqType.getTypeName();
if (field.isArray()) {
return getArrayTypeName(typeName);
}
return typeName;
}

/**
* Keep in sync with default case in {@link org.jooq.meta.AbstractDatabase#isArrayType(String dataType)}.
*/
private String getArrayTypeName(String typeName) {
return typeName + " ARRAY";
}

private boolean isIdentity(Field field) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ fields:
dataType: ENUM
enumName: test_status
nullable: true
- name: "col7"
dataType: ENUM
enumName: test_status
array: true
nullable: true
foreignKeys: []
indexes:
- name: "test_table_col1_key"
Expand Down

0 comments on commit 32ad991

Please sign in to comment.