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 fdb9dbbdced2ce147f00f768e3d9d3f9868a693f 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 | 22 ++++++++++------ .../cayenne/query/SelectQueryCacheKeyIT.java | 29 ++++++++++++++++++++-- 2 files changed, 42 insertions(+), 9 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 3cad914..d78e681 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,13 +18,6 @@ ****************************************************************/ package org.apache.cayenne.query; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import org.apache.cayenne.CayenneRuntimeException; import org.apache.cayenne.exp.Expression; import org.apache.cayenne.exp.TraversalHandler; @@ -35,6 +28,13 @@ import org.apache.cayenne.map.EntityResolver; import org.apache.cayenne.map.ObjEntity; import org.apache.cayenne.map.ObjRelationship; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * @since 3.0 * @deprecated since 4.2 @@ -121,6 +121,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 5393910..84e4e88 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()); + } }
