From f9780b8b92778f5bd43cf1d21d83c1999060df56 Mon Sep 17 00:00:00 2001
From: "Brian S. O'Neill" <bronee@gmail.com>
Date: Tue, 10 Feb 2009 19:54:31 +0000
Subject: Fix for JDBC prepared statement values when query has an exists
 filter.

---
 src/main/java/com/amazon/carbonado/filter/AndFilter.java  |  4 ++--
 .../java/com/amazon/carbonado/filter/ClosedFilter.java    |  4 ++--
 .../java/com/amazon/carbonado/filter/ExistsFilter.java    |  4 ++--
 src/main/java/com/amazon/carbonado/filter/Filter.java     | 15 +++++++++++++--
 src/main/java/com/amazon/carbonado/filter/OpenFilter.java |  4 ++--
 src/main/java/com/amazon/carbonado/filter/OrFilter.java   |  4 ++--
 .../java/com/amazon/carbonado/filter/PropertyFilter.java  |  4 ++--
 .../java/com/amazon/carbonado/repo/jdbc/WhereBuilder.java | 11 +++++++++++
 8 files changed, 36 insertions(+), 14 deletions(-)

(limited to 'src/main/java/com')

diff --git a/src/main/java/com/amazon/carbonado/filter/AndFilter.java b/src/main/java/com/amazon/carbonado/filter/AndFilter.java
index 6da6896..3ab9c48 100644
--- a/src/main/java/com/amazon/carbonado/filter/AndFilter.java
+++ b/src/main/java/com/amazon/carbonado/filter/AndFilter.java
@@ -68,7 +68,7 @@ public class AndFilter<S extends Storable> extends BinaryOpFilter<S> {
     }
 
     @Override
-    <T extends Storable> Filter<T> asJoinedFromAny(ChainedProperty<T> joinProperty) {
+    public <T extends Storable> Filter<T> asJoinedFromAny(ChainedProperty<T> joinProperty) {
         return mLeft.asJoinedFromAny(joinProperty).and(mRight.asJoinedFromAny(joinProperty));
     }
 
@@ -117,7 +117,7 @@ public class AndFilter<S extends Storable> extends BinaryOpFilter<S> {
     }
 
     @Override
-    public int hashCode() {
+    int generateHashCode() {
         return mLeft.hashCode() * 31 + mRight.hashCode();
     }
 
diff --git a/src/main/java/com/amazon/carbonado/filter/ClosedFilter.java b/src/main/java/com/amazon/carbonado/filter/ClosedFilter.java
index 4f4b51a..0ee1b5a 100644
--- a/src/main/java/com/amazon/carbonado/filter/ClosedFilter.java
+++ b/src/main/java/com/amazon/carbonado/filter/ClosedFilter.java
@@ -117,7 +117,7 @@ public class ClosedFilter<S extends Storable> extends Filter<S> {
     }
 
     @Override
-    <T extends Storable> ClosedFilter<T> asJoinedFromAny(ChainedProperty<T> joinProperty) {
+    public <T extends Storable> ClosedFilter<T> asJoinedFromAny(ChainedProperty<T> joinProperty) {
         return getClosedFilter(joinProperty.getPrimeProperty().getEnclosingType());
     }
 
@@ -155,7 +155,7 @@ public class ClosedFilter<S extends Storable> extends Filter<S> {
     }
 
     @Override
-    public int hashCode() {
+    int generateHashCode() {
         return getStorableType().hashCode();
     }
 
diff --git a/src/main/java/com/amazon/carbonado/filter/ExistsFilter.java b/src/main/java/com/amazon/carbonado/filter/ExistsFilter.java
index 2a7af93..98ac530 100644
--- a/src/main/java/com/amazon/carbonado/filter/ExistsFilter.java
+++ b/src/main/java/com/amazon/carbonado/filter/ExistsFilter.java
@@ -197,7 +197,7 @@ public class ExistsFilter<S extends Storable> extends Filter<S> {
     }
 
     @Override
-    <T extends Storable> ExistsFilter<T> asJoinedFromAny(ChainedProperty<T> joinProperty) {
+    public <T extends Storable> ExistsFilter<T> asJoinedFromAny(ChainedProperty<T> joinProperty) {
         ChainedProperty<T> newProperty = joinProperty.append(getChainedProperty());
         return getCanonical(newProperty, mSubFilter, mNot);
     }
@@ -255,7 +255,7 @@ public class ExistsFilter<S extends Storable> extends Filter<S> {
     }
 
     @Override
-    public int hashCode() {
+    int generateHashCode() {
         int hash = mProperty.hashCode() * 31 + mSubFilter.hashCode();
         return mNot ? ~hash : hash;
     }
diff --git a/src/main/java/com/amazon/carbonado/filter/Filter.java b/src/main/java/com/amazon/carbonado/filter/Filter.java
index bec0c6b..a51f796 100644
--- a/src/main/java/com/amazon/carbonado/filter/Filter.java
+++ b/src/main/java/com/amazon/carbonado/filter/Filter.java
@@ -153,6 +153,8 @@ public abstract class Filter<S extends Storable> implements Serializable, Append
 
     private final Class<S> mType;
 
+    private transient int mHashCode;
+
     // Root FilterValues, built on demand, which is immutable.
     private transient volatile FilterValues<S> mFilterValues;
 
@@ -643,7 +645,8 @@ public abstract class Filter<S extends Storable> implements Serializable, Append
     /**
      * Allows join from any property type, including one-to-many joins.
      */
-    abstract <T extends Storable> Filter<T> asJoinedFromAny(ChainedProperty<T> joinProperty);
+    public abstract <T extends Storable> Filter<T>
+        asJoinedFromAny(ChainedProperty<T> joinProperty);
 
     /**
      * Removes a join property prefix from all applicable properties of this
@@ -766,7 +769,15 @@ public abstract class Filter<S extends Storable> implements Serializable, Append
     abstract void markReduced();
 
     @Override
-    public abstract int hashCode();
+    public final int hashCode() {
+        int hashCode = mHashCode;
+        if (hashCode == 0) {
+            mHashCode = hashCode = generateHashCode();
+        }
+        return hashCode;
+    }
+
+    abstract int generateHashCode();
 
     @Override
     public abstract boolean equals(Object obj);
diff --git a/src/main/java/com/amazon/carbonado/filter/OpenFilter.java b/src/main/java/com/amazon/carbonado/filter/OpenFilter.java
index da23e6c..7201e26 100644
--- a/src/main/java/com/amazon/carbonado/filter/OpenFilter.java
+++ b/src/main/java/com/amazon/carbonado/filter/OpenFilter.java
@@ -117,7 +117,7 @@ public class OpenFilter<S extends Storable> extends Filter<S> {
     }
 
     @Override
-    <T extends Storable> OpenFilter<T> asJoinedFromAny(ChainedProperty<T> joinProperty) {
+    public <T extends Storable> OpenFilter<T> asJoinedFromAny(ChainedProperty<T> joinProperty) {
         return getOpenFilter(joinProperty.getPrimeProperty().getEnclosingType());
     }
 
@@ -155,7 +155,7 @@ public class OpenFilter<S extends Storable> extends Filter<S> {
     }
 
     @Override
-    public int hashCode() {
+    int generateHashCode() {
         return getStorableType().hashCode();
     }
 
diff --git a/src/main/java/com/amazon/carbonado/filter/OrFilter.java b/src/main/java/com/amazon/carbonado/filter/OrFilter.java
index 15019b6..0d9fa2a 100644
--- a/src/main/java/com/amazon/carbonado/filter/OrFilter.java
+++ b/src/main/java/com/amazon/carbonado/filter/OrFilter.java
@@ -68,7 +68,7 @@ public class OrFilter<S extends Storable> extends BinaryOpFilter<S> {
     }
 
     @Override
-    <T extends Storable> Filter<T> asJoinedFromAny(ChainedProperty<T> joinProperty) {
+    public <T extends Storable> Filter<T> asJoinedFromAny(ChainedProperty<T> joinProperty) {
         return mLeft.asJoinedFromAny(joinProperty).or(mRight.asJoinedFromAny(joinProperty));
     }
 
@@ -132,7 +132,7 @@ public class OrFilter<S extends Storable> extends BinaryOpFilter<S> {
     }
 
     @Override
-    public int hashCode() {
+    int generateHashCode() {
         return mLeft.hashCode() * 31 + mRight.hashCode();
     }
 
diff --git a/src/main/java/com/amazon/carbonado/filter/PropertyFilter.java b/src/main/java/com/amazon/carbonado/filter/PropertyFilter.java
index 2cecca3..0183bbf 100644
--- a/src/main/java/com/amazon/carbonado/filter/PropertyFilter.java
+++ b/src/main/java/com/amazon/carbonado/filter/PropertyFilter.java
@@ -237,7 +237,7 @@ public class PropertyFilter<S extends Storable> extends Filter<S> {
     }
 
     @Override
-    <T extends Storable> PropertyFilter<T> asJoinedFromAny(ChainedProperty<T> joinProperty) {
+    public <T extends Storable> PropertyFilter<T> asJoinedFromAny(ChainedProperty<T> joinProperty){
         ChainedProperty<T> newProperty = joinProperty.append(getChainedProperty());
 
         if (isConstant()) {
@@ -406,7 +406,7 @@ public class PropertyFilter<S extends Storable> extends Filter<S> {
     }
 
     @Override
-    public int hashCode() {
+    int generateHashCode() {
         return mProperty.hashCode() * 31 + mOp.hashCode() + mBindID;
     }
 
diff --git a/src/main/java/com/amazon/carbonado/repo/jdbc/WhereBuilder.java b/src/main/java/com/amazon/carbonado/repo/jdbc/WhereBuilder.java
index 80f895e..9023397 100644
--- a/src/main/java/com/amazon/carbonado/repo/jdbc/WhereBuilder.java
+++ b/src/main/java/com/amazon/carbonado/repo/jdbc/WhereBuilder.java
@@ -208,13 +208,24 @@ class WhereBuilder<S extends Storable> extends Visitor<S, FetchException, Object
 
         if (subFilter != null && !subFilter.isOpen()) {
             mStatementBuilder.append(" AND (");
+
             WhereBuilder wb = new WhereBuilder
                 (mStatementBuilder, oneToManyNode, mAliasGenerator);
+
             FetchException e = (FetchException) subFilter.accept(wb, null);
             if (e != null) {
                 return e;
             }
+
             mStatementBuilder.append(')');
+
+            // Transfer property filters from sub-builder as joined from exists filter.
+            int size = wb.mPropertyFilters.size();
+            for (int i=0; i<size; i++) {
+                PropertyFilter propFilter = (PropertyFilter) wb.mPropertyFilters.get(i);
+                mPropertyFilters.add(propFilter.asJoinedFromAny(chained));
+            }
+            mPropertyFilterNullable.addAll(wb.mPropertyFilterNullable);
         }
 
         mStatementBuilder.append(')');
-- 
cgit v1.2.3