aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Moger <james.moger@gmail.com>2011-12-05 17:01:37 -0500
committerJames Moger <james.moger@gmail.com>2011-12-05 17:01:37 -0500
commit53bdab2caad16bec8425dc173780b39bbccfc375 (patch)
tree4ad7f9eceefce08d95afcabeabfd3d7b322467b2
parent4ebfeaac5790760c01fa1af11525b4964445bf93 (diff)
downloadiciql-53bdab2caad16bec8425dc173780b39bbccfc375.tar.gz
iciql-53bdab2caad16bec8425dc173780b39bbccfc375.zip
Fixed joins on primitives
-rw-r--r--docs/05_releases.mkd8
-rw-r--r--src/com/iciql/Constants.java4
-rw-r--r--src/com/iciql/QueryJoin.java37
-rw-r--r--src/com/iciql/QueryJoinCondition.java40
-rw-r--r--tests/com/iciql/test/IciqlSuite.java3
-rw-r--r--tests/com/iciql/test/JoinTest.java132
6 files changed, 219 insertions, 5 deletions
diff --git a/docs/05_releases.mkd b/docs/05_releases.mkd
index a28751d..17b5e04 100644
--- a/docs/05_releases.mkd
+++ b/docs/05_releases.mkd
@@ -6,12 +6,16 @@
**%VERSION%** ([zip](http://code.google.com/p/iciql/downloads/detail?name=%ZIP%)|[jar](http://code.google.com/p/iciql/downloads/detail?name=%JAR%)) &nbsp; *released %BUILDDATE%*
+- Fixed joins on primitives
+
+### Older Releases
+
+**0.7.2** &nbsp; *released 2011-11-30*
+
- generated models are now serializable with a default serial version id of 1
- Updated to H2 1.3.162
- Updated to HSQL 2.2.6 (100% unit test pass now that [this bug](https://sourceforge.net/tracker/?func=detail&aid=3390047&group_id=23316&atid=378131) was fixed)
-### Older Releases
-
**0.7.1** &nbsp; *released 2011-08-31*
- api change release (API v7)
diff --git a/src/com/iciql/Constants.java b/src/com/iciql/Constants.java
index dfc18af..0bd7663 100644
--- a/src/com/iciql/Constants.java
+++ b/src/com/iciql/Constants.java
@@ -25,11 +25,11 @@ public class Constants {
// The build script extracts this exact line so be careful editing it
// and only use A-Z a-z 0-9 .-_ in the string.
- public static final String VERSION = "0.7.2";
+ public static final String VERSION = "0.7.3-SNAPSHOT";
// The build script extracts this exact line so be careful editing it
// and only use A-Z a-z 0-9 .-_ in the string.
- public static final String VERSION_DATE = "2011-11-30";
+ public static final String VERSION_DATE = "PENDING";
// The build script extracts this exact line so be careful editing it
// and only use A-Z a-z 0-9 .-_ in the string.
diff --git a/src/com/iciql/QueryJoin.java b/src/com/iciql/QueryJoin.java
index bb614eb..dbb3d15 100644
--- a/src/com/iciql/QueryJoin.java
+++ b/src/com/iciql/QueryJoin.java
@@ -31,6 +31,43 @@ public class QueryJoin {
this.join = join;
}
+ public QueryJoinCondition<Boolean> on(boolean x) {
+ return addPrimitive(x);
+ }
+
+ public QueryJoinCondition<Byte> on(byte x) {
+ return addPrimitive(x);
+ }
+
+ public QueryJoinCondition<Short> on(short x) {
+ return addPrimitive(x);
+ }
+
+ public QueryJoinCondition<Integer> on(int x) {
+ return addPrimitive(x);
+ }
+
+ public QueryJoinCondition<Long> on(long x) {
+ return addPrimitive(x);
+ }
+
+ public QueryJoinCondition<Float> on(float x) {
+ return addPrimitive(x);
+ }
+
+ public QueryJoinCondition<Double> on(double x) {
+ return addPrimitive(x);
+ }
+
+ private <A> QueryJoinCondition<A> addPrimitive(A x) {
+ A alias = query.getPrimitiveAliasByValue(x);
+ if (alias == null) {
+ // this will result in an unmapped field exception
+ return new QueryJoinCondition<A>(query, join, x);
+ }
+ return new QueryJoinCondition<A>(query, join, alias);
+ }
+
public <A> QueryJoinCondition<A> on(A x) {
return new QueryJoinCondition<A>(query, join, x);
}
diff --git a/src/com/iciql/QueryJoinCondition.java b/src/com/iciql/QueryJoinCondition.java
index e5620d5..b49e35b 100644
--- a/src/com/iciql/QueryJoinCondition.java
+++ b/src/com/iciql/QueryJoinCondition.java
@@ -17,6 +17,7 @@
package com.iciql;
+
/**
* This class represents a query with join and an incomplete condition.
*
@@ -36,6 +37,45 @@ public class QueryJoinCondition<A> {
this.x = x;
}
+ public Query<?> is(boolean y) {
+ return addPrimitive(y);
+ }
+
+ public Query<?> is(byte y) {
+ return addPrimitive(y);
+ }
+
+ public Query<?> is(short y) {
+ return addPrimitive(y);
+ }
+
+ public Query<?> is(int y) {
+ return addPrimitive(y);
+ }
+
+ public Query<?> is(long y) {
+ return addPrimitive(y);
+ }
+
+ public Query<?> is(float y) {
+ return addPrimitive(y);
+ }
+
+ public Query<?> is(double y) {
+ return addPrimitive(y);
+ }
+
+ @SuppressWarnings("unchecked")
+ private Query<?> addPrimitive(Object o) {
+ A alias = query.getPrimitiveAliasByValue((A) o);
+ if (alias == null) {
+ join.addConditionToken(new Condition<A>(x, (A) o, CompareType.EQUAL));
+ } else {
+ join.addConditionToken(new Condition<A>(x, alias, CompareType.EQUAL));
+ }
+ return query;
+ }
+
public Query<?> is(A y) {
join.addConditionToken(new Condition<A>(x, y, CompareType.EQUAL));
return query;
diff --git a/tests/com/iciql/test/IciqlSuite.java b/tests/com/iciql/test/IciqlSuite.java
index 88b8f33..3c98d69 100644
--- a/tests/com/iciql/test/IciqlSuite.java
+++ b/tests/com/iciql/test/IciqlSuite.java
@@ -84,7 +84,8 @@ import com.iciql.util.Utils;
@RunWith(Suite.class)
@SuiteClasses({ AliasMapTest.class, AnnotationsTest.class, BooleanModelTest.class, ClobTest.class,
ConcurrencyTest.class, EnumsTest.class, ModelsTest.class, PrimitivesTest.class,
- RuntimeQueryTest.class, SamplesTest.class, UpdateTest.class, UpgradesTest.class, UUIDTest.class })
+ RuntimeQueryTest.class, SamplesTest.class, UpdateTest.class, UpgradesTest.class, JoinTest.class,
+ UUIDTest.class })
public class IciqlSuite {
private static final TestDb[] TEST_DBS = {
diff --git a/tests/com/iciql/test/JoinTest.java b/tests/com/iciql/test/JoinTest.java
new file mode 100644
index 0000000..eab1376
--- /dev/null
+++ b/tests/com/iciql/test/JoinTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2011 James Moger.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.iciql.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.iciql.Db;
+import com.iciql.Iciql.IQColumn;
+import com.iciql.Iciql.IQTable;
+
+/**
+ * Tests of Joins.
+ */
+public class JoinTest {
+
+ Db db;
+
+ @Before
+ public void setup() {
+ db = IciqlSuite.openNewDb();
+ }
+
+ @After
+ public void tearDown() {
+ db.close();
+ }
+
+ @Test
+ public void testPrimitiveJoin() throws Exception {
+ db.insertAll(UserId.getList());
+ db.insertAll(UserNote.getList());
+
+ final UserId u = new UserId();
+ final UserNote n = new UserNote();
+
+ List<UserNote> notes = db.from(u).innerJoin(n).on(u.id).is(n.userId).where(u.id).is(2)
+ .select(new UserNote() {
+ {
+ userId = n.userId;
+ noteId = n.noteId;
+ text = n.text;
+ }
+ });
+
+ db.dropTable(UserId.class);
+ db.dropTable(UserNote.class);
+
+ assertEquals(3, notes.size());
+ }
+
+ @IQTable
+ public static class UserId {
+
+ @IQColumn(primaryKey = true)
+ public int id;
+
+ @IQColumn(length = 10)
+ public String name;
+
+ public UserId() {
+ // public constructor
+ }
+
+ public UserId(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public String toString() {
+ return name + " (" + id + ")";
+ }
+
+ public static List<UserId> getList() {
+ UserId[] list = { new UserId(1, "Tom"), new UserId(2, "Dick"), new UserId(3, "Harry") };
+ return Arrays.asList(list);
+ }
+ }
+
+ @IQTable
+ public static class UserNote {
+
+ @IQColumn(autoIncrement = true, primaryKey = true)
+ public int noteId;
+
+ @IQColumn
+ public int userId;
+
+ @IQColumn(length = 10)
+ public String text;
+
+ public UserNote() {
+ // public constructor
+ }
+
+ public UserNote(int userId, String text) {
+ this.userId = userId;
+ this.text = text;
+ }
+
+ public String toString() {
+ return text;
+ }
+
+ public static List<UserNote> getList() {
+ UserNote[] list = { new UserNote(1, "A"), new UserNote(2, "B"), new UserNote(3, "C"),
+ new UserNote(1, "D"), new UserNote(2, "E"), new UserNote(3, "F"), new UserNote(1, "G"),
+ new UserNote(2, "H"), new UserNote(3, "I"), };
+ return Arrays.asList(list);
+ }
+ }
+}