Sfoglia il codice sorgente

Allow selecting a column from a table

tags/release-2.0.0
James Moger 8 anni fa
parent
commit
27979f0790

+ 1
- 0
releases.moxie Vedi File

@@ -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

+ 4
- 0
src/main/java/com/iciql/Db.java Vedi File

@@ -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);
}

+ 40
- 5
src/main/java/com/iciql/Query.java Vedi File

@@ -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);
}
}

+ 15
- 0
src/test/java/com/iciql/test/ModelsTest.java Vedi File

@@ -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());
}
}

+ 17
- 0
src/test/java/com/iciql/test/PrimitivesTest.java Vedi File

@@ -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());
}
}

Loading…
Annulla
Salva