summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--releases.moxie1
-rw-r--r--src/main/java/com/iciql/Db.java4
-rw-r--r--src/main/java/com/iciql/Query.java45
-rw-r--r--src/test/java/com/iciql/test/ModelsTest.java15
-rw-r--r--src/test/java/com/iciql/test/PrimitivesTest.java17
5 files changed, 77 insertions, 5 deletions
diff --git a/releases.moxie b/releases.moxie
index df08871..6a448cb 100644
--- a/releases.moxie
+++ b/releases.moxie
@@ -15,6 +15,7 @@ r30: {
changes: ~
additions:
- Added groupBy methods to QueryWhere (issue-20)
+ - Allow selecting a column from a table
dependencyChanges: ~
contributors:
- James Moger
diff --git a/src/main/java/com/iciql/Db.java b/src/main/java/com/iciql/Db.java
index 088fc30..d0756bc 100644
--- a/src/main/java/com/iciql/Db.java
+++ b/src/main/java/com/iciql/Db.java
@@ -140,6 +140,10 @@ public class Db implements AutoCloseable {
return x;
}
+ static <X> boolean isToken(X x) {
+ return TOKENS.containsKey(x);
+ }
+
static Token getToken(Object x) {
return TOKENS.get(x);
}
diff --git a/src/main/java/com/iciql/Query.java b/src/main/java/com/iciql/Query.java
index 1dbbc4e..f8fd4ca 100644
--- a/src/main/java/com/iciql/Query.java
+++ b/src/main/java/com/iciql/Query.java
@@ -389,9 +389,21 @@ public class Query<T> {
@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
@@ -426,18 +438,41 @@ public class Query<T> {
}
@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);
}
}
diff --git a/src/test/java/com/iciql/test/ModelsTest.java b/src/test/java/com/iciql/test/ModelsTest.java
index ff27bf5..a5474df 100644
--- a/src/test/java/com/iciql/test/ModelsTest.java
+++ b/src/test/java/com/iciql/test/ModelsTest.java
@@ -160,4 +160,19 @@ public class ModelsTest {
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());
+ }
}
diff --git a/src/test/java/com/iciql/test/PrimitivesTest.java b/src/test/java/com/iciql/test/PrimitivesTest.java
index 0e8bf20..938fd32 100644
--- a/src/test/java/com/iciql/test/PrimitivesTest.java
+++ b/src/test/java/com/iciql/test/PrimitivesTest.java
@@ -99,4 +99,21 @@ public class PrimitivesTest {
}
db.close();
}
+
+ @Test
+ public void testPrimitiveColumnSelection() {
+ Db db = IciqlSuite.openNewDb();
+
+ // insert random models in reverse order
+ List<PrimitivesModel> models = PrimitivesModel.getList();
+ PrimitivesModel model = models.get(0);
+ Collections.reverse(models);
+ // insert them in reverse order
+ db.insertAll(models);
+
+ PrimitivesModel p = new PrimitivesModel();
+ List<Long> list = db.from(p)/*.orderByDesc(p.myLong)*/.select(p.myLong);
+ assertEquals(models.size(), list.size());
+ assertEquals("[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]", list.toString());
+ }
}