This is an automated email from the ASF dual-hosted git repository.

aadamchik pushed a commit to branch STABLE-4.1
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit cc39100ca994353eb18e70ea8a1da204fb4b6868
Author: Andrus Adamchik <[email protected]>
AuthorDate: Fri Sep 27 10:54:53 2019 +0300

    CAY-2624 SelectQuery "having" qualifier is not considered when calculating 
cache key
---
 .../apache/cayenne/query/SelectQueryMetadata.java  | 24 ++++++++++++------
 .../cayenne/query/SelectQueryCacheKeyIT.java       | 29 ++++++++++++++++++++--
 2 files changed, 43 insertions(+), 10 deletions(-)

diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
index 66c947d..c653f6a 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
@@ -18,14 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.query;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.Persistent;
@@ -56,6 +48,14 @@ import org.apache.cayenne.reflect.ToManyProperty;
 import org.apache.cayenne.reflect.ToOneProperty;
 import org.apache.cayenne.util.CayenneMapEntry;
 
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 /**
  * @since 3.0
  */
@@ -135,6 +135,14 @@ class SelectQueryMetadata extends BaseQueryMetadata {
                        }
                }
 
+               if (query.getHavingQualifier() != null) {
+                       key.append('/');
+                       if(traversalHandler == null) {
+                               traversalHandler = new 
ToCacheKeyTraversalHandler(resolver.getValueObjectTypeRegistry(), key);
+                       }
+                       query.getHavingQualifier().traverse(traversalHandler);
+               }
+
                if (query.getFetchOffset() > 0 || query.getFetchLimit() > 0) {
                        key.append('/');
                        if (query.getFetchOffset() > 0) {
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyIT.java
index 398797c..7975b5a 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyIT.java
@@ -150,7 +150,7 @@ public class SelectQueryCacheKeyIT extends ServerCase {
     }
 
     @Test
-    public void testUniqueKeyEntityQualifier() {
+    public void testUniqueKeyQualifier() {
 
         SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
         q1.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
@@ -171,7 +171,7 @@ public class SelectQueryCacheKeyIT extends ServerCase {
     }
 
     @Test
-    public void testUniqueKeyEntityFetchLimit() {
+    public void testUniqueKeyFetchLimit() {
 
         SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
         q1.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
@@ -194,4 +194,29 @@ public class SelectQueryCacheKeyIT extends ServerCase {
         assertNotEquals(q1.getMetaData(resolver).getCacheKey(), 
q3.getMetaData(resolver).getCacheKey());
         assertNotEquals(q1.getMetaData(resolver).getCacheKey(), 
q4.getMetaData(resolver).getCacheKey());
     }
+
+    @Test
+    public void testUniqueKeyHaving() {
+
+        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
+        q1.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
+        q1.setHavingQualifier(ExpressionFactory.expFalse());
+
+        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
+        q2.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
+        q2.setHavingQualifier(ExpressionFactory.expFalse());
+
+        SelectQuery<Artist> q3 = new SelectQuery<>(Artist.class);
+        q3.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
+        q3.setHavingQualifier(ExpressionFactory.expTrue());
+
+        SelectQuery<Artist> q4 = new SelectQuery<>(Artist.class);
+        q4.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
+
+        assertNotNull(q1.getMetaData(resolver).getCacheKey());
+        assertEquals(q1.getMetaData(resolver).getCacheKey(), 
q2.getMetaData(resolver).getCacheKey());
+
+        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), 
q3.getMetaData(resolver).getCacheKey());
+        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), 
q4.getMetaData(resolver).getCacheKey());
+    }
 }

Reply via email to