]> source.dussan.org Git - iciql.git/commitdiff
Improved fluent/type-safety of join statements
authorJames Moger <james.moger@gmail.com>
Tue, 6 Dec 2011 13:51:45 +0000 (08:51 -0500)
committerJames Moger <james.moger@gmail.com>
Tue, 6 Dec 2011 13:51:45 +0000 (08:51 -0500)
docs/04_examples.mkd
docs/05_releases.mkd
src/com/iciql/Query.java
src/com/iciql/QueryJoin.java
src/com/iciql/QueryJoinCondition.java
tests/com/iciql/test/JoinTest.java

index d4f98da142753b96be71ddc9ff34a6cc8590f1f1..480e29dca91d96aef6d550e03d6f63a2f5b54aa3 100644 (file)
@@ -80,6 +80,14 @@ db.from(p).where(p.productId).atLeast(10).delete();
 %BEGINCODE%\r
 final Customer c = new Customer();\r
 final Order o = new Order();\r
+\r
+List&lt;Customer&gt; customersWithLargeOrders =\r
+    db.from(c).\r
+    innerJoin(o).on(c.customerId).is(o.customerId).\r
+    where(o.total).greaterThan(new BigDecimal("500.00")).\r
+    groupBy(c.customerId).select();\r
+\r
+\r
 List&lt;CustOrder&gt; orders =\r
     db.from(c).\r
     innerJoin(o).on(c.customerId).is(o.customerId).\r
index 94d0e9a03cbf09b576407f5df3d7ab0ddef160ef..6d6054cf7b2bb6a846a7591c5691a9c7e34f29ed 100644 (file)
@@ -8,6 +8,7 @@
 \r
 - Fixed joins on primitives\r
 - Fixed group by on primitives\r
+- Improved fluent/type-safety of joins\r
 \r
 ### Older Releases\r
 \r
index 2f5141d329509224b35e95201b3ce20e240384c3..b43f774c567c9cdecb7221522f7808e22abf88b5 100644 (file)
@@ -725,7 +725,7 @@ public class Query<T> {
         */\r
 \r
        @SuppressWarnings({ "unchecked", "rawtypes" })\r
-       public <U> QueryJoin innerJoin(U alias) {\r
+       public <A> QueryJoin<T> innerJoin(A alias) {\r
                TableDefinition<T> def = (TableDefinition<T>) db.define(alias.getClass());\r
                SelectTable<T> join = new SelectTable(db, this, alias, false);\r
                def.initSelectObject(join, alias, aliasMap);\r
index dbb3d15ff171b338f598ccbd08ce936c4481559e..652d937c49c11f59314fb2c0f6d8cfc32e296985 100644 (file)
@@ -21,54 +21,54 @@ package com.iciql;
  * This class represents a query with a join.\r
  */\r
 \r
-public class QueryJoin {\r
+public class QueryJoin<T> {\r
 \r
-       private Query<?> query;\r
-       private SelectTable<?> join;\r
+       private Query<T> query;\r
+       private SelectTable<T> join;\r
 \r
-       QueryJoin(Query<?> query, SelectTable<?> join) {\r
+       QueryJoin(Query<T> query, SelectTable<T> join) {\r
                this.query = query;\r
                this.join = join;\r
        }\r
 \r
-       public QueryJoinCondition<Boolean> on(boolean x) {\r
+       public QueryJoinCondition<T, Boolean> on(boolean x) {\r
                return addPrimitive(x);\r
        }\r
 \r
-       public QueryJoinCondition<Byte> on(byte x) {\r
+       public QueryJoinCondition<T, Byte> on(byte x) {\r
                return addPrimitive(x);\r
        }\r
 \r
-       public QueryJoinCondition<Short> on(short x) {\r
+       public QueryJoinCondition<T, Short> on(short x) {\r
                return addPrimitive(x);\r
        }\r
 \r
-       public QueryJoinCondition<Integer> on(int x) {\r
+       public QueryJoinCondition<T, Integer> on(int x) {\r
                return addPrimitive(x);\r
        }\r
 \r
-       public QueryJoinCondition<Long> on(long x) {\r
+       public QueryJoinCondition<T, Long> on(long x) {\r
                return addPrimitive(x);\r
        }\r
 \r
-       public QueryJoinCondition<Float> on(float x) {\r
+       public QueryJoinCondition<T, Float> on(float x) {\r
                return addPrimitive(x);\r
        }\r
 \r
-       public QueryJoinCondition<Double> on(double x) {\r
+       public QueryJoinCondition<T, Double> on(double x) {\r
                return addPrimitive(x);\r
        }\r
 \r
-       private <A> QueryJoinCondition<A> addPrimitive(A x) {           \r
+       private <A> QueryJoinCondition<T, A> addPrimitive(A x) {                \r
                A alias = query.getPrimitiveAliasByValue(x);\r
                if (alias == null) {\r
                        // this will result in an unmapped field exception\r
-                       return new QueryJoinCondition<A>(query, join, x);\r
+                       return new QueryJoinCondition<T, A>(query, join, x);\r
                }\r
-               return new QueryJoinCondition<A>(query, join, alias);\r
+               return new QueryJoinCondition<T, A>(query, join, alias);\r
        }\r
 \r
-       public <A> QueryJoinCondition<A> on(A x) {\r
-               return new QueryJoinCondition<A>(query, join, x);\r
+       public <A> QueryJoinCondition<T, A> on(A x) {\r
+               return new QueryJoinCondition<T, A>(query, join, x);\r
        }\r
 }\r
index b49e35bdf552e432242bb7b6518a1110947ece6f..6dfd21880c2fbba5253d0514b0ca4808be334e49 100644 (file)
@@ -25,48 +25,48 @@ package com.iciql;
  *            the incomplete condition data type\r
  */\r
 \r
-public class QueryJoinCondition<A> {\r
+public class QueryJoinCondition<T, A> {\r
 \r
-       private Query<?> query;\r
-       private SelectTable<?> join;\r
+       private Query<T> query;\r
+       private SelectTable<T> join;\r
        private A x;\r
 \r
-       QueryJoinCondition(Query<?> query, SelectTable<?> join, A x) {\r
+       QueryJoinCondition(Query<T> query, SelectTable<T> join, A x) {\r
                this.query = query;\r
                this.join = join;\r
                this.x = x;\r
        }\r
 \r
-       public Query<?> is(boolean y) {\r
+       public Query<T> is(boolean y) {\r
                return addPrimitive(y);\r
        }       \r
 \r
-       public Query<?> is(byte y) {\r
+       public Query<T> is(byte y) {\r
                return addPrimitive(y);\r
        }       \r
 \r
-       public Query<?> is(short y) {\r
+       public Query<T> is(short y) {\r
                return addPrimitive(y);\r
        }       \r
 \r
-       public Query<?> is(int y) {\r
+       public Query<T> is(int y) {\r
                return addPrimitive(y);\r
        }\r
        \r
-       public Query<?> is(long y) {\r
+       public Query<T> is(long y) {\r
                return addPrimitive(y);\r
        }       \r
 \r
-       public Query<?> is(float y) {\r
+       public Query<T> is(float y) {\r
                return addPrimitive(y);\r
        }       \r
 \r
-       public Query<?> is(double y) {\r
+       public Query<T> is(double y) {\r
                return addPrimitive(y);\r
        }       \r
 \r
        @SuppressWarnings("unchecked")\r
-       private Query<?> addPrimitive(Object o) {               \r
+       private Query<T> addPrimitive(Object o) {               \r
                A alias = query.getPrimitiveAliasByValue((A) o);\r
                if (alias == null) {\r
                        join.addConditionToken(new Condition<A>(x, (A) o, CompareType.EQUAL));\r
@@ -76,7 +76,7 @@ public class QueryJoinCondition<A> {
                return query;           \r
        }\r
 \r
-       public Query<?> is(A y) {\r
+       public Query<T> is(A y) {\r
                join.addConditionToken(new Condition<A>(x, y, CompareType.EQUAL));\r
                return query;\r
        }\r
index 018d721ea6771c301324bd33d8cd3c386124f45b..ceb2ad5cff58ce88748abced626da83de06e7535 100644 (file)
@@ -28,7 +28,6 @@ import org.junit.Test;
 import com.iciql.Db;
 import com.iciql.Iciql.IQColumn;
 import com.iciql.Iciql.IQTable;
-import com.iciql.util.IciqlLogger;
 
 /**
  * Tests of Joins.
@@ -79,7 +78,7 @@ public class JoinTest {
                final UserNote n = new UserNote();
 
                // this query returns 1 UserId if the user has a note
-               List<UserId> users = (List<UserId>) db.from(u).innerJoin(n).on(u.id).is(n.userId).groupBy(u.id).where(u.id).is(2).select();
+               List<UserId> users = db.from(u).innerJoin(n).on(u.id).is(n.userId).groupBy(u.id).where(u.id).is(2).select();
                
                db.dropTable(UserId.class);
                db.dropTable(UserNote.class);