Skip to content

Commit c7c8cd3

Browse files
committed
Support enum types
1 parent 61df1b5 commit c7c8cd3

File tree

7 files changed

+111
-16
lines changed

7 files changed

+111
-16
lines changed

vertx-sql-client-template/src/main/asciidoc/index.adoc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,12 @@ The generated mapper can be used to perform param mapping like explained in <<pa
311311
{@link examples.TemplateExamples#bindingParamsWithParamsMapper}
312312
----
313313

314+
=== Java enum types mapping
315+
316+
You can map Java enum types when the client supports it (e.g the Reactive PostgreSQL client).
317+
318+
Usually Java enum types are mapped to string / numbers and possibly custom database enumerated types.
319+
314320
=== Naming format
315321

316322
The default template use the same case for parameters and columns. You can override the default names in the `Column`

vertx-sql-client-template/src/main/java/io/vertx/sqlclient/template/generator/RowMapperGen.java

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@
55
import io.vertx.codegen.PropertyInfo;
66
import io.vertx.codegen.annotations.DataObject;
77
import io.vertx.codegen.type.AnnotationValueInfo;
8+
import io.vertx.codegen.type.ClassKind;
89
import io.vertx.codegen.type.ClassTypeInfo;
910
import io.vertx.codegen.type.DataObjectInfo;
11+
import io.vertx.codegen.type.EnumTypeInfo;
1012
import io.vertx.codegen.type.MapperInfo;
1113
import io.vertx.codegen.type.PrimitiveTypeInfo;
1214
import io.vertx.codegen.type.TypeInfo;
15+
import io.vertx.sqlclient.Row;
1316
import io.vertx.sqlclient.template.annotations.Column;
1417
import io.vertx.sqlclient.template.annotations.RowMapped;
1518

@@ -18,6 +21,7 @@
1821
import java.util.Collection;
1922
import java.util.Collections;
2023
import java.util.Optional;
24+
import java.util.function.Function;
2125

2226
/**
2327
* @author <a href="mailto:julien@julienviet.com">Julien Viet</a>
@@ -82,21 +86,21 @@ private void genFromSingleValued(DataObjectModel model, PrintWriter writer) {
8286
String rowType = rowType(prop.getType());
8387
switch (prop.getKind()) {
8488
case VALUE: {
85-
String meth = getter(prop.getType());
89+
Function<String, String> meth = getter_(prop.getType(), false);
8690
if (meth != null) {
8791
bilto4(writer, meth, prop, wrapExpr(prop.getType(), "(" + rowType + ")val"));
8892
}
8993
break;
9094
}
9195
case LIST: {
92-
String meth = getArrayType(prop.getType());
96+
Function<String, String> meth = getter_(prop.getType(), true);
9397
if (meth != null) {
9498
bilto4(writer, meth, prop, "java.util.Arrays.stream((" + rowType + "[])val).map(elt -> " + wrapExpr(prop.getType(), "elt") + ").collect(java.util.stream.Collectors.toCollection(java.util.ArrayList::new))");
9599
}
96100
break;
97101
}
98102
case SET: {
99-
String meth = getArrayType(prop.getType());
103+
Function<String, String> meth = getter_(prop.getType(), true);
100104
if (meth != null) {
101105
bilto4(writer, meth, prop, "java.util.Arrays.stream((" + rowType + "[])val).map(elt -> " + wrapExpr(prop.getType(), "elt") + ").collect(java.util.stream.Collectors.toCollection(java.util.HashSet::new))");
102106
}
@@ -111,12 +115,12 @@ private void genFromSingleValued(DataObjectModel model, PrintWriter writer) {
111115
.filter(prop -> PK.contains(prop.getKind()))
112116
.filter(prop -> prop.isAdder() && !prop.isSetter())
113117
.forEach(prop -> {
114-
String meth = getArrayType(prop.getType());
115-
String rowType = rowType(prop.getType());
118+
Function<String, String> meth = getter_(prop.getType(), true);
116119
if (meth != null) {
117120
String columnName = getMappingName(prop, Column.class.getName());
118121
if (columnName != null) {
119-
writer.print(" val = row." + meth + "(\"" + columnName + "\");\n");
122+
String rowType = rowType(prop.getType());
123+
writer.print(" val = " + meth.apply(columnName) + ";\n");
120124
writer.print(" if (val != null) {\n");
121125
writer.print(" for (" + rowType + " elt : (" + rowType + "[])val) {\n");
122126
writer.print(" obj." + prop.getAdderMethod() + "(" + wrapExpr(prop.getType(), "elt") + ");\n");
@@ -127,10 +131,10 @@ private void genFromSingleValued(DataObjectModel model, PrintWriter writer) {
127131
});
128132
}
129133

130-
private void bilto4(PrintWriter writer, String meth, PropertyInfo prop, String converter) {
134+
private void bilto4(PrintWriter writer, Function<String, String> getter, PropertyInfo prop, String converter) {
131135
String columnName = getMappingName(prop, Column.class.getName());
132136
if (columnName != null) {
133-
writer.print(" val = row." + meth + "(\"" + columnName + "\");\n");
137+
writer.print(" val = " + getter.apply(columnName) + ";\n");
134138
writer.print(" if (val != null) {\n");
135139
writer.print(" obj." + prop.getSetterMethod() + "(" + converter + ");\n");
136140
writer.print(" }\n");
@@ -163,6 +167,21 @@ private static String rowType(TypeInfo type) {
163167
return type.getName();
164168
}
165169

170+
private static Function<String, String> getter_(TypeInfo type, boolean isArray) {
171+
if (type.getKind() == ClassKind.ENUM) {
172+
if (isArray) {
173+
return col -> "row.get(" + type.getName() + "[].class, \"" + col + "\")";
174+
} else {
175+
return col -> "row.get(" + type.getName() + ".class, \"" + col + "\")";
176+
}
177+
}
178+
String getter = getter(type);
179+
if (getter != null) {
180+
return col -> "row." + getter + (isArray ? "Array" : "") + "(\"" + col + "\")";
181+
}
182+
return null;
183+
}
184+
166185
private static String getter(TypeInfo type) {
167186
switch (type.getKind()) {
168187
case PRIMITIVE:
@@ -204,12 +223,4 @@ private static String getter(TypeInfo type) {
204223
}
205224
return null;
206225
}
207-
208-
private static String getArrayType(TypeInfo type) {
209-
String s = getter(type);
210-
if (s != null) {
211-
s += "Array";
212-
}
213-
return s;
214-
}
215226
}

vertx-sql-client-template/src/test/generated/io/vertx/sqlclient/template/TestDataObjectParamMapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public java.util.Map<String, Object> apply(TestDataObject obj) {
3636
params.put("addedStringMethodMappedDataObjects", obj.getAddedStringMethodMappedDataObjects());
3737
params.put("addedStrings", obj.getAddedStrings());
3838
params.put("addedTemporals", obj.getAddedTemporals());
39+
params.put("addedTimeUnits", obj.getAddedTimeUnits());
3940
params.put("addedUUIDs", obj.getAddedUUIDs());
4041
params.put("booleanList", obj.getBooleanList());
4142
params.put("booleanMethodMappedDataObject", obj.getBooleanMethodMappedDataObject());
@@ -121,6 +122,9 @@ public java.util.Map<String, Object> apply(TestDataObject obj) {
121122
params.put("temporal", obj.getTemporal());
122123
params.put("temporalList", obj.getTemporalList());
123124
params.put("temporalSet", obj.getTemporalSet());
125+
params.put("timeUnit", obj.getTimeUnit());
126+
params.put("timeUnitList", obj.getTimeUnitList());
127+
params.put("timeUnitSet", obj.getTimeUnitSet());
124128
params.put("uuid", obj.getUUID());
125129
params.put("uuidList", obj.getUUIDList());
126130
params.put("uuidSet", obj.getUUIDSet());

vertx-sql-client-template/src/test/generated/io/vertx/sqlclient/template/TestDataObjectRowMapper.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,18 @@ public TestDataObject apply(io.vertx.sqlclient.Row row) {
349349
if (val != null) {
350350
obj.setTemporalSet(java.util.Arrays.stream((java.time.temporal.Temporal[])val).map(elt -> elt).collect(java.util.stream.Collectors.toCollection(java.util.HashSet::new)));
351351
}
352+
val = row.get(java.util.concurrent.TimeUnit.class, "timeUnit");
353+
if (val != null) {
354+
obj.setTimeUnit((java.util.concurrent.TimeUnit)val);
355+
}
356+
val = row.get(java.util.concurrent.TimeUnit[].class, "timeUnitList");
357+
if (val != null) {
358+
obj.setTimeUnitList(java.util.Arrays.stream((java.util.concurrent.TimeUnit[])val).map(elt -> elt).collect(java.util.stream.Collectors.toCollection(java.util.ArrayList::new)));
359+
}
360+
val = row.get(java.util.concurrent.TimeUnit[].class, "timeUnitSet");
361+
if (val != null) {
362+
obj.setTimeUnitSet(java.util.Arrays.stream((java.util.concurrent.TimeUnit[])val).map(elt -> elt).collect(java.util.stream.Collectors.toCollection(java.util.HashSet::new)));
363+
}
352364
val = row.getUUID("uuid");
353365
if (val != null) {
354366
obj.setUUID((java.util.UUID)val);
@@ -517,6 +529,12 @@ public TestDataObject apply(io.vertx.sqlclient.Row row) {
517529
obj.addAddedTemporal(elt);
518530
}
519531
}
532+
val = row.get(java.util.concurrent.TimeUnit[].class, "addedTimeUnits");
533+
if (val != null) {
534+
for (java.util.concurrent.TimeUnit elt : (java.util.concurrent.TimeUnit[])val) {
535+
obj.addAddedTimeUnit(elt);
536+
}
537+
}
520538
val = row.getUUIDArray("addedUUIDs");
521539
if (val != null) {
522540
for (java.util.UUID elt : (java.util.UUID[])val) {

vertx-sql-client-template/src/test/java/io/vertx/sqlclient/template/DataObjectParamsTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.time.ZoneOffset;
3939
import java.util.Map;
4040
import java.util.UUID;
41+
import java.util.concurrent.TimeUnit;
4142
import java.util.function.Consumer;
4243

4344
import static org.junit.Assert.assertEquals;
@@ -88,6 +89,15 @@ public void testString(TestContext ctx) {
8889
});
8990
}
9091

92+
@Test
93+
public void testEnum(TestContext ctx) {
94+
TestDataObject obj = new TestDataObject();
95+
obj.setTimeUnit(TimeUnit.MICROSECONDS);;
96+
testGet(ctx, "VARCHAR", "timeUnit", obj, row -> {
97+
assertEquals("MICROSECONDS", row.getValue("value"));
98+
});
99+
}
100+
91101
private void testGet(TestContext ctx, String sqlType, String paramName, TestDataObject obj, Consumer<Row> checker) {
92102
Async async = ctx.async();
93103
SqlTemplate<Map<String, Object>, RowSet<Row>> template = SqlTemplate.forQuery(connection, "SELECT ${" + paramName + "} :: " + sqlType + " \"value\"");

vertx-sql-client-template/src/test/java/io/vertx/sqlclient/template/DataObjectTypesTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import java.util.HashSet;
5151
import java.util.Map;
5252
import java.util.UUID;
53+
import java.util.concurrent.TimeUnit;
5354
import java.util.function.Function;
5455

5556
/**
@@ -182,6 +183,14 @@ public void testString(TestContext ctx) {
182183
testGet(ctx, "VARCHAR[]", new String[]{string}, Collections.singletonList(string), "addedStrings", TestDataObject::getAddedStrings);
183184
}
184185

186+
@Test
187+
public void testEnum(TestContext ctx) {
188+
testGet(ctx, "VARCHAR", TimeUnit.MILLISECONDS.name(), TimeUnit.MILLISECONDS, "timeUnit", TestDataObject::getTimeUnit);
189+
testGet(ctx, "VARCHAR[]", new String[]{TimeUnit.MILLISECONDS.name()}, Collections.singletonList(TimeUnit.MILLISECONDS), "timeUnitList", TestDataObject::getTimeUnitList);
190+
testGet(ctx, "VARCHAR[]", new String[]{TimeUnit.MILLISECONDS.name()}, Collections.singleton(TimeUnit.MILLISECONDS), "timeUnitSet", TestDataObject::getTimeUnitSet);
191+
testGet(ctx, "VARCHAR[]", new String[]{TimeUnit.MILLISECONDS.name()}, Collections.singletonList(TimeUnit.MILLISECONDS), "addedTimeUnits", TestDataObject::getAddedTimeUnits);
192+
}
193+
185194
@Test
186195
public void testJsonObject(TestContext ctx) {
187196
testGet(ctx, "JSON", jsonObject, jsonObject, "jsonObject", TestDataObject::getJsonObject);

vertx-sql-client-template/src/test/java/io/vertx/sqlclient/template/TestDataObject.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.List;
2828
import java.util.Set;
2929
import java.util.UUID;
30+
import java.util.concurrent.TimeUnit;
3031

3132
@DataObject
3233
@RowMapped
@@ -67,6 +68,7 @@ public class TestDataObject {
6768
private StringWrapper stringMethodMappedDataObject;
6869
private JsonObjectWrapper jsonObjectMethodMappedDataObject;
6970
private JsonArrayWrapper jsonArrayMethodMappedDataObject;
71+
private TimeUnit timeUnit;
7072

7173
private List<Boolean> booleanList;
7274
private List<Short> shortList;
@@ -95,6 +97,7 @@ public class TestDataObject {
9597
private List<StringWrapper> stringMethodMappedDataObjectList;
9698
private List<JsonObjectWrapper> jsonObjectMethodMappedDataObjectList;
9799
private List<JsonArrayWrapper> jsonArrayMethodMappedDataObjectList;
100+
private List<TimeUnit> timeUnitList;
98101

99102
private Set<Boolean> booleanSet;
100103
private Set<Short> shortSet;
@@ -123,6 +126,7 @@ public class TestDataObject {
123126
private Set<StringWrapper> stringMethodMappedDataObjectSet;
124127
private Set<JsonObjectWrapper> jsonObjectMethodMappedDataObjectSet;
125128
private Set<JsonArrayWrapper> jsonArrayMethodMappedDataObjectSet;
129+
private Set<TimeUnit> timeUnitSet;
126130

127131
private List<Boolean> addedBooleans = new ArrayList<>();
128132
private List<Short> addedShorts = new ArrayList<>();
@@ -151,6 +155,7 @@ public class TestDataObject {
151155
private List<StringWrapper> stringAddedMethodMappedDataObjects = new ArrayList<>();
152156
private List<JsonObjectWrapper> jsonObjectAddedMethodMappedDataObjects = new ArrayList<>();
153157
private List<JsonArrayWrapper> jsonArrayAddedMethodMappedDataObjects = new ArrayList<>();
158+
private List<TimeUnit> addedTimeUnits = new ArrayList<>();
154159

155160
public boolean isPrimitiveBoolean() {
156161
return primitiveBoolean;
@@ -416,6 +421,14 @@ public void setJsonArrayMethodMappedDataObject(JsonArrayWrapper jsonArrayMethodM
416421
this.jsonArrayMethodMappedDataObject = jsonArrayMethodMappedDataObject;
417422
}
418423

424+
public TimeUnit getTimeUnit() {
425+
return timeUnit;
426+
}
427+
428+
public void setTimeUnit(TimeUnit timeUnit) {
429+
this.timeUnit = timeUnit;
430+
}
431+
419432
public List<Boolean> getBooleanList() {
420433
return booleanList;
421434
}
@@ -632,6 +645,14 @@ public void setJsonArrayMethodMappedDataObjectList(List<JsonArrayWrapper> jsonAr
632645
this.jsonArrayMethodMappedDataObjectList = jsonArrayMethodMappedDataObjectList;
633646
}
634647

648+
public List<TimeUnit> getTimeUnitList() {
649+
return timeUnitList;
650+
}
651+
652+
public void setTimeUnitList(List<TimeUnit> timeUnitList) {
653+
this.timeUnitList = timeUnitList;
654+
}
655+
635656
public Set<Boolean> getBooleanSet() {
636657
return booleanSet;
637658
}
@@ -848,6 +869,14 @@ public void setJsonArrayMethodMappedDataObjectSet(Set<JsonArrayWrapper> jsonArra
848869
this.jsonArrayMethodMappedDataObjectSet = jsonArrayMethodMappedDataObjectSet;
849870
}
850871

872+
public Set<TimeUnit> getTimeUnitSet() {
873+
return timeUnitSet;
874+
}
875+
876+
public void setTimeUnitSet(Set<TimeUnit> timeUnitSet) {
877+
this.timeUnitSet = timeUnitSet;
878+
}
879+
851880
public void addAddedBoolean(Boolean value) {
852881
addedBooleans.add(value);
853882
}
@@ -1063,4 +1092,12 @@ public void addAddedJsonArrayMethodMappedDataObject(JsonArrayWrapper value) {
10631092
public List<JsonArrayWrapper> getAddedJsonArrayMethodMappedDataObjects() {
10641093
return jsonArrayAddedMethodMappedDataObjects;
10651094
}
1095+
1096+
public void addAddedTimeUnit(TimeUnit value) {
1097+
addedTimeUnits.add(value);
1098+
}
1099+
1100+
public List<TimeUnit> getAddedTimeUnits() {
1101+
return addedTimeUnits;
1102+
}
10661103
}

0 commit comments

Comments
 (0)