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