Skip to content

Commit 32ad991

Browse files
authored
Merge pull request #16 from ergon/feature/array-metamodel-generation
support arrays in metamodel generation
2 parents 8c26550 + 774e31c commit 32ad991

File tree

2 files changed

+65
-49
lines changed

2 files changed

+65
-49
lines changed

gradle-plugin/src/main/java/ch/ergon/adam/gradleplugin/util/AdamTableDefinition.java

+60-49
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package ch.ergon.adam.gradleplugin.util;
22

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

3433
private DataTypeDefinition dataTypeDefinition(Field field) {
3534
return new DefaultDataTypeDefinition(getDatabase(), getSchema(),
36-
typeName(field.getDataType()), field.getLength(), field.getPrecision(), field.getScale(),
35+
typeName(field), field.getLength(), field.getPrecision(), field.getScale(),
3736
field.isNullable(), field.getDefaultValue(), getUserType(field));
3837
}
3938

40-
private String typeName(DataType type) {
41-
var jooqType = switch (type) {
42-
case BIGINT -> SQLDataType.BIGINT;
43-
case BIGINTUNSIGNED -> SQLDataType.BIGINTUNSIGNED;
44-
case BINARY -> SQLDataType.BINARY;
45-
case BIT -> SQLDataType.BIT;
46-
case BLOB -> SQLDataType.BLOB;
47-
case BOOLEAN -> SQLDataType.BOOLEAN;
48-
case CHAR -> SQLDataType.CHAR;
49-
case CLOB -> SQLDataType.CLOB;
50-
case DATE -> SQLDataType.DATE;
51-
case DECIMAL -> SQLDataType.DECIMAL;
52-
case DECIMAL_INTEGER -> SQLDataType.DECIMAL_INTEGER;
53-
case DOUBLE -> SQLDataType.DOUBLE;
54-
case ENUM -> SQLDataType.VARCHAR;
55-
case FLOAT -> SQLDataType.FLOAT;
56-
case INTEGER -> SQLDataType.INTEGER;
57-
case INTEGERUNSIGNED -> SQLDataType.INTEGERUNSIGNED;
58-
case INTERVALDAYTOSECOND -> SQLDataType.INTERVALDAYTOSECOND;
59-
case INTERVALYEARTOMONTH -> SQLDataType.INTERVALYEARTOMONTH;
60-
case INTERVALYEARTOSECOND -> SQLDataType.INTERVAL;
61-
case LOCALDATE -> SQLDataType.LOCALDATE;
62-
case LOCALDATETIME -> SQLDataType.LOCALDATETIME;
63-
case LOCALTIME -> SQLDataType.LOCALTIME;
64-
case LONGNVARCHAR -> SQLDataType.LONGNVARCHAR;
65-
case LONGVARBINARY -> SQLDataType.LONGVARBINARY;
66-
case LONGVARCHAR -> SQLDataType.LONGVARCHAR;
67-
case NCHAR -> SQLDataType.NCHAR;
68-
case NCLOB -> SQLDataType.NCLOB;
69-
case NUMERIC -> SQLDataType.NUMERIC;
70-
case NVARCHAR -> SQLDataType.NVARCHAR;
71-
case OFFSETDATETIME -> SQLDataType.OFFSETDATETIME;
72-
case OFFSETTIME -> SQLDataType.OFFSETTIME;
73-
case REAL -> SQLDataType.REAL;
74-
case SMALLINT -> SQLDataType.SMALLINT;
75-
case SMALLINTUNSIGNED -> SQLDataType.SMALLINTUNSIGNED;
76-
case TIME -> SQLDataType.TIME;
77-
case TIMESTAMP -> SQLDataType.TIMESTAMP;
78-
case TIMESTAMPWITHTIMEZONE -> SQLDataType.TIMESTAMPWITHTIMEZONE;
79-
case TIMEWITHTIMEZONE -> SQLDataType.TIMEWITHTIMEZONE;
80-
case TINYINT -> SQLDataType.TINYINT;
81-
case TINYINTUNSIGNED -> SQLDataType.TINYINTUNSIGNED;
82-
case UUID -> SQLDataType.UUID;
83-
case VARBINARY -> SQLDataType.VARBINARY;
84-
case VARCHAR -> SQLDataType.VARCHAR;
85-
};
86-
return jooqType.getTypeName();
39+
private String typeName(Field field) {
40+
var jooqType = switch (field.getDataType()) {
41+
case BIGINT -> SQLDataType.BIGINT;
42+
case BIGINTUNSIGNED -> SQLDataType.BIGINTUNSIGNED;
43+
case BINARY -> SQLDataType.BINARY;
44+
case BIT -> SQLDataType.BIT;
45+
case BLOB -> SQLDataType.BLOB;
46+
case BOOLEAN -> SQLDataType.BOOLEAN;
47+
case CHAR -> SQLDataType.CHAR;
48+
case CLOB -> SQLDataType.CLOB;
49+
case DATE -> SQLDataType.DATE;
50+
case DECIMAL -> SQLDataType.DECIMAL;
51+
case DECIMAL_INTEGER -> SQLDataType.DECIMAL_INTEGER;
52+
case DOUBLE -> SQLDataType.DOUBLE;
53+
case ENUM -> SQLDataType.VARCHAR;
54+
case FLOAT -> SQLDataType.FLOAT;
55+
case INTEGER -> SQLDataType.INTEGER;
56+
case INTEGERUNSIGNED -> SQLDataType.INTEGERUNSIGNED;
57+
case INTERVALDAYTOSECOND -> SQLDataType.INTERVALDAYTOSECOND;
58+
case INTERVALYEARTOMONTH -> SQLDataType.INTERVALYEARTOMONTH;
59+
case INTERVALYEARTOSECOND -> SQLDataType.INTERVAL;
60+
case LOCALDATE -> SQLDataType.LOCALDATE;
61+
case LOCALDATETIME -> SQLDataType.LOCALDATETIME;
62+
case LOCALTIME -> SQLDataType.LOCALTIME;
63+
case LONGNVARCHAR -> SQLDataType.LONGNVARCHAR;
64+
case LONGVARBINARY -> SQLDataType.LONGVARBINARY;
65+
case LONGVARCHAR -> SQLDataType.LONGVARCHAR;
66+
case NCHAR -> SQLDataType.NCHAR;
67+
case NCLOB -> SQLDataType.NCLOB;
68+
case NUMERIC -> SQLDataType.NUMERIC;
69+
case NVARCHAR -> SQLDataType.NVARCHAR;
70+
case OFFSETDATETIME -> SQLDataType.OFFSETDATETIME;
71+
case OFFSETTIME -> SQLDataType.OFFSETTIME;
72+
case REAL -> SQLDataType.REAL;
73+
case SMALLINT -> SQLDataType.SMALLINT;
74+
case SMALLINTUNSIGNED -> SQLDataType.SMALLINTUNSIGNED;
75+
case TIME -> SQLDataType.TIME;
76+
case TIMESTAMP -> SQLDataType.TIMESTAMP;
77+
case TIMESTAMPWITHTIMEZONE -> SQLDataType.TIMESTAMPWITHTIMEZONE;
78+
case TIMEWITHTIMEZONE -> SQLDataType.TIMEWITHTIMEZONE;
79+
case TINYINT -> SQLDataType.TINYINT;
80+
case TINYINTUNSIGNED -> SQLDataType.TINYINTUNSIGNED;
81+
case UUID -> SQLDataType.UUID;
82+
case VARBINARY -> SQLDataType.VARBINARY;
83+
case VARCHAR -> SQLDataType.VARCHAR;
84+
};
85+
86+
String typeName = jooqType.getTypeName();
87+
if (field.isArray()) {
88+
return getArrayTypeName(typeName);
89+
}
90+
return typeName;
91+
}
92+
93+
/**
94+
* Keep in sync with default case in {@link org.jooq.meta.AbstractDatabase#isArrayType(String dataType)}.
95+
*/
96+
private String getArrayTypeName(String typeName) {
97+
return typeName + " ARRAY";
8798
}
8899

89100
private boolean isIdentity(Field field) {

integration-test-db/src/main/resources/adam/schema/test.table.yml

+5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ fields:
2525
dataType: ENUM
2626
enumName: test_status
2727
nullable: true
28+
- name: "col7"
29+
dataType: ENUM
30+
enumName: test_status
31+
array: true
32+
nullable: true
2833
foreignKeys: []
2934
indexes:
3035
- name: "test_table_col1_key"

0 commit comments

Comments
 (0)