You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2019/09/27 08:36:57 UTC

[cayenne] 02/03: CAY-2624 SelectQuery "having" qualifier is not considered when calculating cache key

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

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

commit 7d29a671da66f79b5c556b85298aec92dbd38036
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Fri Sep 27 10:54:53 2019 +0300

    CAY-2624 SelectQuery "having" qualifier is not considered when calculating cache key
---
 .../apache/cayenne/query/ObjectSelectMetadata.java | 18 ++++++++++----
 .../cayenne/query/ObjectSelect_CacheKeyIT.java     | 29 ++++++++++++++++++++--
 2 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelectMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelectMetadata.java
index 7df22eb..fd1fc67 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelectMetadata.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelectMetadata.java
@@ -18,11 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.query;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.TraversalHandler;
@@ -30,6 +25,11 @@ import org.apache.cayenne.exp.property.BaseProperty;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
 
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @since 4.2
  */
@@ -102,6 +102,14 @@ class ObjectSelectMetadata extends BaseQueryMetadata {
 			}
 		}
 
+		if (query.getHaving() != null) {
+			key.append('/');
+			if(traversalHandler == null) {
+				traversalHandler = new ToCacheKeyTraversalHandler(resolver.getValueObjectTypeRegistry(), key);
+			}
+			query.getHaving().traverse(traversalHandler);
+		}
+
 		if (fetchLimit > 0 || fetchOffset > 0) {
 			key.append('/');
 			if (fetchOffset > 0) {
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelect_CacheKeyIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelect_CacheKeyIT.java
index 7be5049..7b07cad 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelect_CacheKeyIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/ObjectSelect_CacheKeyIT.java
@@ -142,7 +142,7 @@ public class ObjectSelect_CacheKeyIT extends ServerCase {
     }
 
     @Test
-    public void testUniqueKeyEntityQualifier() {
+    public void testUniqueKeyQualifier() {
 
         ObjectSelect<Artist> q1 = ObjectSelect.query(Artist.class)
                 .localCache()
@@ -163,7 +163,7 @@ public class ObjectSelect_CacheKeyIT extends ServerCase {
     }
 
     @Test
-    public void testUniqueKeyEntityFetchLimit() {
+    public void testUniqueKeyFetchLimit() {
 
         ObjectSelect<Artist> q1 = ObjectSelect.query(Artist.class)
                 .localCache()
@@ -186,4 +186,29 @@ public class ObjectSelect_CacheKeyIT extends ServerCase {
         assertNotEquals(q1.getMetaData(resolver).getCacheKey(), q3.getMetaData(resolver).getCacheKey());
         assertNotEquals(q1.getMetaData(resolver).getCacheKey(), q4.getMetaData(resolver).getCacheKey());
     }
+
+    @Test
+    public void testUniqueKeyHaving() {
+
+        ObjectSelect<Artist> q1 = ObjectSelect.query(Artist.class)
+                .localCache()
+                .having(ExpressionFactory.expFalse());
+
+        ObjectSelect<Artist> q2 = ObjectSelect.query(Artist.class)
+                .localCache()
+                .having(ExpressionFactory.expFalse());
+
+        ObjectSelect<Artist> q3 = ObjectSelect.query(Artist.class)
+                .localCache()
+                .having(ExpressionFactory.expTrue());
+
+        ObjectSelect<Artist> q4 = ObjectSelect.query(Artist.class)
+                .localCache();
+
+        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());
+    }
 }