diff --git a/src/main/java/com/iciql/Query.java b/src/main/java/com/iciql/Query.java index e9404ec0..5d4ee738 100644 --- a/src/main/java/com/iciql/Query.java +++ b/src/main/java/com/iciql/Query.java @@ -914,6 +914,37 @@ public void appendSQL(SQLStatement stat, Object alias, Object value) { addParameter(stat, alias, value); } + /** + * INTERNAL + * + * @param stat the statement + * @param alias the alias object (can be null) + * @param value the value + */ + public void appendSelectSQL(SQLStatement stat, Object alias, Object value) { + if (Function.count() == value) { + stat.appendSQL("COUNT(*)"); + return; + } + if (RuntimeParameter.PARAMETER == value) { + stat.appendSQL("?"); + addParameter(stat, alias, value); + return; + } + Token token = Db.getToken(value); + if (token != null) { + token.appendSQL(stat, this); + return; + } + SelectColumn col = getColumnByReference(value); + if (col != null) { + col.appendSQL(stat); + return; + } + stat.appendSQL("?"); + addParameter(stat, alias, value); + } + /** * INTERNAL * diff --git a/src/main/java/com/iciql/TableDefinition.java b/src/main/java/com/iciql/TableDefinition.java index 05cdbf69..0976ebfa 100644 --- a/src/main/java/com/iciql/TableDefinition.java +++ b/src/main/java/com/iciql/TableDefinition.java @@ -1185,10 +1185,10 @@ void appendSelectList(SQLStatement stat, Query query, X x) { if (def.isPrimitive) { Object obj = def.getValue(x); Object alias = query.getPrimitiveAliasByValue(obj); - query.appendSQL(stat, x, alias); + query.appendSelectSQL(stat, x, alias); } else { Object obj = def.getValue(x); - query.appendSQL(stat, x, obj); + query.appendSelectSQL(stat, x, obj); } } } diff --git a/src/test/java/com/iciql/test/EnumsTest.java b/src/test/java/com/iciql/test/EnumsTest.java index e0f307d1..b2ba2c9e 100644 --- a/src/test/java/com/iciql/test/EnumsTest.java +++ b/src/test/java/com/iciql/test/EnumsTest.java @@ -20,6 +20,7 @@ import com.iciql.IciqlException; import com.iciql.test.models.EnumModels; import com.iciql.test.models.EnumModels.EnumIdModel; +import com.iciql.test.models.EnumModels.EnumJoin; import com.iciql.test.models.EnumModels.EnumOrdinalModel; import com.iciql.test.models.EnumModels.EnumStringModel; import com.iciql.test.models.EnumModels.Genus; @@ -59,6 +60,7 @@ public void testEnumQueries() { testIntEnums(new EnumOrdinalModel()); testStringEnums(new EnumStringModel()); testStringEnumIds(new EnumStringModel()); + testStringEnumsSelectObject(); } private void testIntEnums(EnumModels e) { @@ -136,6 +138,65 @@ private void testStringEnumIds(EnumModels e) { } + private void testStringEnumsSelectObject() { + final EnumOrdinalModel eom = new EnumOrdinalModel(); + final EnumStringModel esm = new EnumStringModel(); + // ensure all records inserted + List enumJoinList = db.from(eom) + .innerJoin(esm).on(eom.id).is(esm.id) + .orderBy(eom.id) + .select( + new EnumJoin() { + { + id = eom.id; + genus = esm.genus(); + } + }); + + assertEquals(5, enumJoinList.size()); + assertEquals(enumJoinList.get(0).id.intValue(), 100); + assertEquals(enumJoinList.get(0).genus, Genus.PINUS); + assertEquals(enumJoinList.get(1).id.intValue(), 200); + assertEquals(enumJoinList.get(1).genus, Genus.QUERCUS); + assertEquals(enumJoinList.get(2).id.intValue(), 300); + assertEquals(enumJoinList.get(2).genus, Genus.BETULA); + assertEquals(enumJoinList.get(3).id.intValue(), 400); + assertEquals(enumJoinList.get(3).genus, Genus.JUGLANS); + assertEquals(enumJoinList.get(4).id.intValue(), 500); + assertEquals(enumJoinList.get(4).genus, Genus.ACER); + + List enumJoinWhereList = db.from(eom) + .innerJoin(esm).on(eom.id).is(esm.id) + .where(esm.tree()).is(Tree.OAK) + .select( + new EnumJoin() { + { + id = eom.id; + genus = esm.genus(); + } + }); + + assertEquals(1, enumJoinWhereList.size()); + assertEquals(enumJoinWhereList.get(0).id.intValue(), 200); + assertEquals(enumJoinWhereList.get(0).genus, Genus.QUERCUS); + + List enumJoinGroupByList = db.from(eom) + .innerJoin(esm).on(eom.id).is(esm.id) + .where(esm.tree()).is(Tree.BIRCH) + .groupBy(eom.id, esm.genus()) + .select( + new EnumJoin() { + { + id = eom.id; + genus = esm.genus(); + } + }); + + assertEquals(1, enumJoinGroupByList.size()); + assertEquals(enumJoinGroupByList.get(0).id.intValue(), 300); + assertEquals(enumJoinGroupByList.get(0).genus, Genus.BETULA); + } + @Test public void testMultipleEnumInstances() { BadEnums b = new BadEnums(); diff --git a/src/test/java/com/iciql/test/models/EnumModels.java b/src/test/java/com/iciql/test/models/EnumModels.java index de223284..06802d25 100644 --- a/src/test/java/com/iciql/test/models/EnumModels.java +++ b/src/test/java/com/iciql/test/models/EnumModels.java @@ -220,4 +220,9 @@ public static List createList() { new EnumStringModel(100, Tree.PINE, Genus.PINUS)); } } + + public static class EnumJoin { + public Integer id; + public Genus genus; + } }