@SuppressWarnings("unchecked")
private <X, Z> List<X> select(Z x, boolean distinct) {
Class<?> clazz = x.getClass();
- if (Utils.isSimpleType(clazz)) {
- return selectSimple((X) x, distinct);
+ if (Db.isToken(x)) {
+ // selecting a function
+ return selectFunction((X) x, distinct);
+ } else {
+ // selecting a column
+ SelectColumn<T> col = getColumnByReference(x);
+ if (col == null) {
+ col = getColumnByReference(getPrimitiveAliasByValue(x));
+ }
+ if (col != null) {
+ return (List<X>) selectColumn(col, clazz, distinct);
+ }
}
+
+ // selecting into a new object type
Class<?> enclosingClass = clazz.getEnclosingClass();
if (enclosingClass != null) {
// anonymous inner class
}
@SuppressWarnings("unchecked")
- private <X> List<X> selectSimple(X x, boolean distinct) {
+ private <X> List<X> selectFunction(X x, boolean distinct) {
SQLStatement stat = getSelectStatement(distinct);
appendSQL(stat, null, x);
appendFromWhere(stat);
ResultSet rs = stat.executeQuery();
List<X> result = Utils.newArrayList();
- Class<? extends DataTypeAdapter<?>> typeAdapter = Utils.getDataTypeAdapter(x.getClass().getAnnotations());
try {
// SQLite returns pre-closed ResultSets for query results with 0 rows
if (!rs.isClosed()) {
while (rs.next()) {
- X value = (X) db.getDialect().deserialize(rs, 1, x.getClass(), typeAdapter);
+ X value = (X) rs.getObject(1);
+ result.add(value);
+ }
+ }
+ } catch (Exception e) {
+ throw IciqlException.fromSQL(stat.getSQL(), e);
+ } finally {
+ JdbcUtils.closeSilently(rs, true);
+ }
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ private <X> List<X> selectColumn(SelectColumn<T> col, Class<X> clazz, boolean distinct) {
+ SQLStatement stat = getSelectStatement(distinct);
+ col.appendSQL(stat);
+ appendFromWhere(stat);
+ ResultSet rs = stat.executeQuery();
+ List<X> result = Utils.newArrayList();
+ Class<? extends DataTypeAdapter<?>> typeAdapter = col.getFieldDefinition().typeAdapter;
+ try {
+ // SQLite returns pre-closed ResultSets for query results with 0 rows
+ if (!rs.isClosed()) {
+ while (rs.next()) {
+ X value = (X) db.getDialect().deserialize(rs, 1, clazz, typeAdapter);
result.add(value);
}
}
SupportedTypes s2 = db.from(SupportedTypes.SAMPLE).where(SupportedTypes.SAMPLE.id).is(1).selectFirst();
assertEquals(40, s2.myString.length());
}
+
+ @Test
+ public void testColumnSelection() {
+ List<SupportedTypes> original = SupportedTypes.createList();
+ db.insertAll(original);
+ List<String> myStrings = db.from(SupportedTypes.SAMPLE)
+ .select(SupportedTypes.SAMPLE.myString);
+ assertEquals(10, myStrings.size());
+
+ List<Integer> ids = db.from(SupportedTypes.SAMPLE)
+ .orderByDesc(SupportedTypes.SAMPLE.id)
+ .selectDistinct(SupportedTypes.SAMPLE.id);
+ assertEquals(10, ids.size());
+ assertEquals("[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]", ids.toString());
+ }
}
}\r
db.close();\r
}\r
+\r
+ @Test\r
+ public void testPrimitiveColumnSelection() {\r
+ Db db = IciqlSuite.openNewDb();\r
+\r
+ // insert random models in reverse order\r
+ List<PrimitivesModel> models = PrimitivesModel.getList();\r
+ PrimitivesModel model = models.get(0);\r
+ Collections.reverse(models);\r
+ // insert them in reverse order\r
+ db.insertAll(models);\r
+\r
+ PrimitivesModel p = new PrimitivesModel();\r
+ List<Long> list = db.from(p)/*.orderByDesc(p.myLong)*/.select(p.myLong);\r
+ assertEquals(models.size(), list.size());\r
+ assertEquals("[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]", list.toString());\r
+ }\r
}\r