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 <[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/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()); + } }
