From ec7c7048db86a677e85d4d066cd76f77cd1cc23a Mon Sep 17 00:00:00 2001 From: rbygrave Date: Wed, 11 Aug 2021 13:19:44 +1200 Subject: [PATCH] Refactor rename BindHash to BindValuesKey --- .../java/io/ebeaninternal/api/BindHash.java | 29 -------------- .../java/io/ebeaninternal/api/BindParams.java | 12 +++--- .../io/ebeaninternal/api/BindValuesKey.java | 35 +++++++++++++++++ .../java/io/ebeaninternal/api/HashQuery.java | 12 +++--- .../io/ebeaninternal/api/SpiExpression.java | 2 +- .../java/io/ebeaninternal/api/SpiQuery.java | 2 +- .../expression/AbstractTextExpression.java | 4 +- .../expression/AllEqualsExpression.java | 10 ++--- .../expression/ArrayContainsExpression.java | 8 ++-- .../expression/ArrayIsEmptyExpression.java | 6 +-- .../server/expression/BetweenExpression.java | 6 +-- .../expression/BetweenPropertyExpression.java | 6 +-- .../server/expression/BitwiseExpression.java | 6 +-- .../CaseInsensitiveEqualExpression.java | 6 +-- .../expression/DefaultExampleExpression.java | 10 ++--- .../expression/DefaultExpressionList.java | 10 ++--- .../expression/ExistsQueryExpression.java | 6 +-- .../server/expression/IdExpression.java | 6 +-- .../server/expression/IdInExpression.java | 8 ++-- .../server/expression/InExpression.java | 8 ++-- .../server/expression/InPairsExpression.java | 8 ++-- .../server/expression/InQueryExpression.java | 6 +-- .../server/expression/InRangeExpression.java | 6 +-- .../server/expression/IsEmptyExpression.java | 4 +- .../server/expression/JsonPathExpression.java | 6 +-- .../server/expression/JunctionExpression.java | 6 +-- .../server/expression/LikeExpression.java | 6 +-- .../server/expression/LogicExpression.java | 6 +-- .../expression/NativeILikeExpression.java | 6 +-- .../NestedPathWrapperExpression.java | 6 +-- .../server/expression/NoopExpression.java | 4 +- .../server/expression/NotExpression.java | 6 +-- .../server/expression/NullExpression.java | 6 +-- .../server/expression/RawExpression.java | 8 ++-- .../server/expression/SimpleExpression.java | 6 +-- .../server/querydefn/DefaultOrmQuery.java | 18 ++++----- .../server/expression/RawExpressionTest.java | 14 +++---- .../server/querydefn/BindHashTest.java | 38 ------------------- .../server/querydefn/BindValuesKeyTest.java | 38 +++++++++++++++++++ .../server/querydefn/DefaultOrmQueryTest.java | 16 ++++---- 40 files changed, 204 insertions(+), 202 deletions(-) delete mode 100644 ebean-core/src/main/java/io/ebeaninternal/api/BindHash.java create mode 100644 ebean-core/src/main/java/io/ebeaninternal/api/BindValuesKey.java delete mode 100644 ebean-core/src/test/java/io/ebeaninternal/server/querydefn/BindHashTest.java create mode 100644 ebean-core/src/test/java/io/ebeaninternal/server/querydefn/BindValuesKeyTest.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BindHash.java b/ebean-core/src/main/java/io/ebeaninternal/api/BindHash.java deleted file mode 100644 index b3ad8e49b..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindHash.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.ebeaninternal.api; - -import java.util.ArrayList; -import java.util.List; - -/** - * BindHash implementation. - */ -public class BindHash { - - private final List values = new ArrayList<>(); - - public BindHash update(Object value) { - values.add(value); - return this; - } - - @Override - public boolean equals(Object obj) { - return obj instanceof BindHash && ((BindHash) obj).values.equals(values); - } - - @Override - public int hashCode() { - return values.hashCode(); - } - - -} diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java index 74e7dfa23..64a0a0287 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java @@ -50,10 +50,10 @@ public class BindParams implements Serializable { positionedParameters.clear(); } - public void queryBindHash(BindHash hash) { - hash.update(positionedParameters.size()); - for (Param positionedParameter : positionedParameters) { - positionedParameter.queryBindHash(hash); + public void queryBindHash(BindValuesKey key) { + key.add(positionedParameters.size()); + for (Param param : positionedParameters) { + param.queryBindHash(key); } } @@ -425,8 +425,8 @@ public class BindParams implements Serializable { return isInParam == param.isInParam && isOutParam == param.isOutParam && type == param.type && Objects.equals(inValue, param.inValue); } - void queryBindHash(BindHash hash) { - hash.update(isInParam).update(isOutParam).update(type).update(inValue); + void queryBindHash(BindValuesKey key) { + key.add(isInParam).add(isOutParam).add(type).add(inValue); } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BindValuesKey.java b/ebean-core/src/main/java/io/ebeaninternal/api/BindValuesKey.java new file mode 100644 index 000000000..4a6eac324 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindValuesKey.java @@ -0,0 +1,35 @@ +package io.ebeaninternal.api; + +import java.util.ArrayList; +import java.util.List; + +/** + * BindValues used for L2 query cache key matching. + *

+ * The equals/hashCode implementation must meet the requirement that the query bind values + * match for L2 query cache hit (given the query plan hash is already a match). + */ +public class BindValuesKey { + + private final List values = new ArrayList<>(); + + /** + * Add a bind value. + */ + public BindValuesKey add(Object value) { + values.add(value); + return this; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof BindValuesKey && ((BindValuesKey) obj).values.equals(values); + } + + @Override + public int hashCode() { + return values.hashCode(); + } + + +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java b/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java index 87241aedc..faddb7bee 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java @@ -6,15 +6,14 @@ package io.ebeaninternal.api; public class HashQuery { private final CQueryPlanKey planHash; - - private final BindHash bindHash; + private final BindValuesKey bindValuesKey; /** * Create the HashQuery. */ - public HashQuery(CQueryPlanKey planHash, BindHash bindHash) { + public HashQuery(CQueryPlanKey planHash, BindValuesKey bindValuesKey) { this.planHash = planHash; - this.bindHash = bindHash; + this.bindValuesKey = bindValuesKey; } @Override @@ -25,7 +24,7 @@ public class HashQuery { @Override public int hashCode() { int hc = 92821 * planHash.hashCode(); - hc = 92821 * hc + bindHash.hashCode(); + hc = 92821 * hc + bindValuesKey.hashCode(); return hc; } @@ -37,8 +36,7 @@ public class HashQuery { if (!(obj instanceof HashQuery)) { return false; } - HashQuery e = (HashQuery) obj; - return e.bindHash.equals(bindHash) && e.planHash.equals(planHash); + return e.bindValuesKey.equals(bindValuesKey) && e.planHash.equals(planHash); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpression.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpression.java index 32c3a3518..00879e15d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpression.java @@ -56,7 +56,7 @@ public interface SpiExpression extends Expression { /** * Return the hash value for the values that will be bound. */ - void queryBindHash(BindHash hash); + void queryBindHash(BindValuesKey key); /** * Return true if the expression is the same with respect to bind values. diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java index d8bae7503..2eae4506b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java @@ -635,7 +635,7 @@ public interface SpiQuery extends Query, SpiQueryFetch, TxnProfileEventCod * query). *

*/ - void queryBindHash(BindHash hash); + void queryBindHash(BindValuesKey key); /** * Identifies queries that are exactly the same including bind variables. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractTextExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractTextExpression.java index d377e48dd..2a411675e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractTextExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AbstractTextExpression.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.expression; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -38,7 +38,7 @@ public abstract class AbstractTextExpression extends AbstractExpression { } @Override - public void queryBindHash(BindHash hash) { + public void queryBindHash(BindValuesKey key) { // do nothing, only execute against document store }; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AllEqualsExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AllEqualsExpression.java index df9e6095b..be0791a12 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/AllEqualsExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/AllEqualsExpression.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.expression; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -123,13 +123,11 @@ class AllEqualsExpression extends NonPrepareExpression { } @Override - public void queryBindHash(BindHash hash) { - - hash.update(propMap.size()); + public void queryBindHash(BindValuesKey key) { + key.add(propMap.size()); for (Object value : propMap.values()) { - hash.update(value); + key.add(value); } - } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayContainsExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayContainsExpression.java index 3c200c046..1ca15f8f7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayContainsExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayContainsExpression.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.expression; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -50,10 +50,10 @@ public class ArrayContainsExpression extends AbstractExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(values.length); + public void queryBindHash(BindValuesKey key) { + key.add(values.length); for (Object value : values) { - hash.update(value); + key.add(value); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayIsEmptyExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayIsEmptyExpression.java index 0249acabb..5b58be0b4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayIsEmptyExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ArrayIsEmptyExpression.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.expression; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -34,8 +34,8 @@ public class ArrayIsEmptyExpression extends AbstractExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(empty); + public void queryBindHash(BindValuesKey key) { + key.add(empty); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java index 37a3aab8f..27e7a5909 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenExpression.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.expression; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -50,8 +50,8 @@ class BetweenExpression extends AbstractExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(low()).update(high()); + public void queryBindHash(BindValuesKey key) { + key.add(low()).add(high()); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenPropertyExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenPropertyExpression.java index 440dd5f1f..cdc199d70 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenPropertyExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BetweenPropertyExpression.java @@ -1,7 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.util.SplitName; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -96,8 +96,8 @@ class BetweenPropertyExpression extends NonPrepareExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(val()); + public void queryBindHash(BindValuesKey key) { + key.add(val()); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BitwiseExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BitwiseExpression.java index db1fa686d..20119b370 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/BitwiseExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/BitwiseExpression.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.expression; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -40,8 +40,8 @@ class BitwiseExpression extends AbstractExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(flags).update(match); + public void queryBindHash(BindValuesKey key) { + key.add(flags).add(match); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/CaseInsensitiveEqualExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/CaseInsensitiveEqualExpression.java index 485d1b04f..ecefbe08a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/CaseInsensitiveEqualExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/CaseInsensitiveEqualExpression.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.expression; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.server.el.ElPropertyValue; @@ -70,8 +70,8 @@ class CaseInsensitiveEqualExpression extends AbstractValueExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(val()); + public void queryBindHash(BindValuesKey key) { + key.add(val()); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExampleExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExampleExpression.java index 9149923e0..3c0e268b6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExampleExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExampleExpression.java @@ -5,7 +5,7 @@ import io.ebean.LikeType; import io.ebean.bean.EntityBean; import io.ebean.event.BeanQueryRequest; import io.ebean.util.SplitName; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -242,10 +242,10 @@ public class DefaultExampleExpression implements SpiExpression, ExampleExpressio * Return a hash for the actual bind values used. */ @Override - public void queryBindHash(BindHash hash) { - hash.update(list.size()); - for (SpiExpression aList : list) { - aList.queryBindHash(hash); + public void queryBindHash(BindValuesKey key) { + key.add(list.size()); + for (SpiExpression expr : list) { + expr.queryBindHash(key); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java index b5f9c6ec1..6c47467f2 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java @@ -26,7 +26,7 @@ import io.ebean.search.MultiMatch; import io.ebean.search.TextCommonTerms; import io.ebean.search.TextQueryString; import io.ebean.search.TextSimple; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -679,10 +679,10 @@ public class DefaultExpressionList implements SpiExpressionList { * Calculate a hash based on the expressions. */ @Override - public void queryBindHash(BindHash hash) { - hash.update(list.size()); - for (SpiExpression aList : list) { - aList.queryBindHash(hash); + public void queryBindHash(BindValuesKey key) { + key.add(list.size()); + for (SpiExpression expr : list) { + expr.queryBindHash(key); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ExistsQueryExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ExistsQueryExpression.java index b3fcf8ce0..9f1d1830d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/ExistsQueryExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/ExistsQueryExpression.java @@ -1,7 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiEbeanServer; @@ -92,8 +92,8 @@ class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpress } @Override - public void queryBindHash(BindHash hash) { - subQuery.queryBindHash(hash); + public void queryBindHash(BindValuesKey key) { + subQuery.queryBindHash(key); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdExpression.java index 904fbe9be..5c20e66b3 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdExpression.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.expression; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -78,8 +78,8 @@ class IdExpression extends NonPrepareExpression implements SpiExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(value); + public void queryBindHash(BindValuesKey key) { + key.add(value); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java index 390d0bebb..8dbceb419 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IdInExpression.java @@ -1,7 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -134,10 +134,10 @@ public class IdInExpression extends NonPrepareExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(idCollection.size()); + public void queryBindHash(BindValuesKey key) { + key.add(idCollection.size()); for (Object elem : idCollection) { - hash.update(elem); + key.add(elem); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InExpression.java index a5719f71a..bbc2bf7eb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InExpression.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.expression; import io.ebean.bean.EntityBean; import io.ebean.event.BeanQueryRequest; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -177,10 +177,10 @@ class InExpression extends AbstractExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(bindValues.size()); + public void queryBindHash(BindValuesKey key) { + key.add(bindValues.size()); for (Object bindValue : bindValues) { - hash.update(bindValue); + key.add(bindValue); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java index a7079ae55..6f2aae853 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InPairsExpression.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.expression; import io.ebean.Pairs; import io.ebean.Pairs.Entry; import io.ebean.event.BeanQueryRequest; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -125,10 +125,10 @@ class InPairsExpression extends AbstractExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(entries.size()); + public void queryBindHash(BindValuesKey key) { + key.add(entries.size()); for (Pairs.Entry entry : entries) { - hash.update(entry.getA()).update(entry.getB()); + key.add(entry.getA()).add(entry.getB()); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InQueryExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InQueryExpression.java index 619f7b715..769f83b84 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InQueryExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InQueryExpression.java @@ -1,7 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -73,8 +73,8 @@ class InQueryExpression extends AbstractExpression implements UnsupportedDocStor } @Override - public void queryBindHash(BindHash hash) { - subQuery.queryBindHash(hash); + public void queryBindHash(BindValuesKey key) { + subQuery.queryBindHash(key); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java index abe0b7338..c8a8dc96f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/InRangeExpression.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.expression; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -48,8 +48,8 @@ class InRangeExpression extends AbstractExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(low()).update(high()); + public void queryBindHash(BindValuesKey key) { + key.add(low()).add(high()); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IsEmptyExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IsEmptyExpression.java index bb65962b3..4ca943619 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/IsEmptyExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/IsEmptyExpression.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.expression; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -104,7 +104,7 @@ class IsEmptyExpression extends AbstractExpression { } @Override - public void queryBindHash(BindHash hash) { + public void queryBindHash(BindValuesKey key) { // no bind values } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/JsonPathExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/JsonPathExpression.java index 18e0aa924..d501068d9 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/JsonPathExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/JsonPathExpression.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.expression; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -84,8 +84,8 @@ class JsonPathExpression extends AbstractExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(value).update(upperValue); + public void queryBindHash(BindValuesKey key) { + key.add(value).add(upperValue); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java index 88614873d..75c17ba19 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java @@ -25,7 +25,7 @@ import io.ebean.search.MultiMatch; import io.ebean.search.TextCommonTerms; import io.ebean.search.TextQueryString; import io.ebean.search.TextSimple; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -216,9 +216,9 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression } @Override - public void queryBindHash(BindHash hash) { + public void queryBindHash(BindValuesKey key) { for (SpiExpression expr : exprList.internalList()) { - expr.queryBindHash(hash); + expr.queryBindHash(key); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/LikeExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/LikeExpression.java index 587e6064c..355cdfa3c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/LikeExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/LikeExpression.java @@ -1,7 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.LikeType; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.server.el.ElPropertyValue; @@ -71,8 +71,8 @@ class LikeExpression extends AbstractValueExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(strValue()); + public void queryBindHash(BindValuesKey key) { + key.add(strValue()); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/LogicExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/LogicExpression.java index cbd487b3e..d6f7894e0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/LogicExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/LogicExpression.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.expression; import io.ebean.Expression; import io.ebean.Junction; import io.ebean.event.BeanQueryRequest; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -169,8 +169,8 @@ abstract class LogicExpression implements SpiExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(expOne).update(expTwo); + public void queryBindHash(BindValuesKey key) { + key.add(expOne).add(expTwo); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NativeILikeExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NativeILikeExpression.java index 8c51d2f5d..efb77d37a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NativeILikeExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NativeILikeExpression.java @@ -1,7 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.LikeType; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.server.el.ElPropertyValue; @@ -55,8 +55,8 @@ class NativeILikeExpression extends AbstractExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(val); + public void queryBindHash(BindValuesKey key) { + key.add(val); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NestedPathWrapperExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NestedPathWrapperExpression.java index f3ed1badd..0931486af 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NestedPathWrapperExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NestedPathWrapperExpression.java @@ -1,7 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -80,8 +80,8 @@ class NestedPathWrapperExpression implements SpiExpression { } @Override - public void queryBindHash(BindHash hash) { - delegate.queryBindHash(hash); + public void queryBindHash(BindValuesKey key) { + delegate.queryBindHash(key); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NoopExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NoopExpression.java index 92180cea1..0a8a67f24 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NoopExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NoopExpression.java @@ -1,7 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -75,7 +75,7 @@ class NoopExpression implements SpiExpression { } @Override - public void queryBindHash(BindHash hash) { + public void queryBindHash(BindValuesKey key) { // no bind values } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NotExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NotExpression.java index e9df6d856..4d6a4aba1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NotExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NotExpression.java @@ -2,7 +2,7 @@ package io.ebeaninternal.server.expression; import io.ebean.Expression; import io.ebean.event.BeanQueryRequest; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -100,8 +100,8 @@ final class NotExpression implements SpiExpression { } @Override - public void queryBindHash(BindHash hash) { - exp.queryBindHash(hash); + public void queryBindHash(BindValuesKey key) { + exp.queryBindHash(key); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NullExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NullExpression.java index daded43cb..1ec123fda 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/NullExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/NullExpression.java @@ -1,7 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.util.SplitName; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -95,7 +95,7 @@ class NullExpression extends AbstractExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(notNull); + public void queryBindHash(BindValuesKey key) { + key.add(notNull); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/RawExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/RawExpression.java index 721d69b25..080f541b7 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/RawExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/RawExpression.java @@ -1,6 +1,6 @@ package io.ebeaninternal.server.expression; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -74,10 +74,10 @@ class RawExpression extends NonPrepareExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(values.length); + public void queryBindHash(BindValuesKey key) { + key.add(values.length); for (Object value : values) { - hash.update(value); + key.add(value); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/expression/SimpleExpression.java b/ebean-core/src/main/java/io/ebeaninternal/server/expression/SimpleExpression.java index e50d9856c..3e0db8707 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/expression/SimpleExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/expression/SimpleExpression.java @@ -5,7 +5,7 @@ import io.ebean.plugin.ExpressionPath; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.server.el.ElPropertyValue; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.NaturalKeyQueryData; import java.io.IOException; @@ -122,8 +122,8 @@ public class SimpleExpression extends AbstractValueExpression { } @Override - public void queryBindHash(BindHash hash) { - hash.update(value()); + public void queryBindHash(BindValuesKey key) { + key.add(value()); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index 865b3184b..4508458b8 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -1225,12 +1225,12 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { *

*/ @Override - public void queryBindHash(BindHash hash) { - hash.update(id); - if (whereExpressions != null) whereExpressions.queryBindHash(hash); - if (havingExpressions != null) havingExpressions.queryBindHash(hash); - if (bindParams != null) bindParams.queryBindHash(hash); - hash.update(asOf).update(versionsStart).update(versionsEnd); + public void queryBindHash(BindValuesKey key) { + key.add(id); + if (whereExpressions != null) whereExpressions.queryBindHash(key); + if (havingExpressions != null) havingExpressions.queryBindHash(key); + if (bindParams != null) bindParams.queryBindHash(key); + key.add(asOf).add(versionsStart).add(versionsEnd); } /** @@ -1244,9 +1244,9 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { public HashQuery queryHash() { // calculateQueryPlanHash is called just after potential AutoTune tuning // so queryPlanHash is calculated well before this method is called - BindHash hash = new BindHash(); - queryBindHash(hash); - return new HashQuery(queryPlanKey, hash); + BindValuesKey bindKey = new BindValuesKey(); + queryBindHash(bindKey); + return new HashQuery(queryPlanKey, bindKey); } @Override diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/expression/RawExpressionTest.java b/ebean-core/src/test/java/io/ebeaninternal/server/expression/RawExpressionTest.java index 99c7d7eec..3568a3bf6 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/expression/RawExpressionTest.java +++ b/ebean-core/src/test/java/io/ebeaninternal/server/expression/RawExpressionTest.java @@ -3,7 +3,7 @@ package io.ebeaninternal.server.expression; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; public class RawExpressionTest extends BaseExpressionTest { @@ -62,16 +62,16 @@ public class RawExpressionTest extends BaseExpressionTest { } public void assert_queryBindHash_isDifferent(RawExpression exp0, RawExpression exp1) { - assertThat(getHash(exp0)).isNotEqualTo(getHash(exp1)); + assertThat(bindKey(exp0)).isNotEqualTo(bindKey(exp1)); } public void assert_queryBindHash_isSame(RawExpression exp0, RawExpression exp1) { - assertThat(getHash(exp0)).isEqualTo(getHash(exp1)); + assertThat(bindKey(exp0)).isEqualTo(bindKey(exp1)); } - private int getHash(RawExpression query) { - BindHash hash = new BindHash(); - query.queryBindHash(hash); - return hash.hashCode(); + private BindValuesKey bindKey(RawExpression query) { + BindValuesKey bindValuesKey = new BindValuesKey(); + query.queryBindHash(bindValuesKey); + return bindValuesKey; } } diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/BindHashTest.java b/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/BindHashTest.java deleted file mode 100644 index a74f4432f..000000000 --- a/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/BindHashTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.ebeaninternal.server.querydefn; - -import io.ebeaninternal.api.BindHash; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class BindHashTest { - - @Test - public void update_with_null() { - - BindHash hash = new BindHash(); - hash.update(1).update(null).update("hello"); - - BindHash hash2 = new BindHash(); - hash2.update(1).update(null).update("hello"); - - assertThat(hash).isEqualTo(hash2); - } - - @Test - public void notEqual() { - - BindHash hash = new BindHash(); - hash.update(1).update(null).update("hello"); - - BindHash hash2 = new BindHash(); - hash2.update(1).update("hello"); - - BindHash hash3 = new BindHash(); - hash2.update(1).update(null); - - assertThat(hash).isNotEqualTo(hash2); - assertThat(hash).isNotEqualTo(hash3); - assertThat(hash2).isNotEqualTo(hash3); - } -} diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/BindValuesKeyTest.java b/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/BindValuesKeyTest.java new file mode 100644 index 000000000..1a7d3b39f --- /dev/null +++ b/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/BindValuesKeyTest.java @@ -0,0 +1,38 @@ +package io.ebeaninternal.server.querydefn; + +import io.ebeaninternal.api.BindValuesKey; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BindValuesKeyTest { + + @Test + public void update_with_null() { + + BindValuesKey hash = new BindValuesKey(); + hash.add(1).add(null).add("hello"); + + BindValuesKey hash2 = new BindValuesKey(); + hash2.add(1).add(null).add("hello"); + + assertThat(hash).isEqualTo(hash2); + } + + @Test + public void notEqual() { + + BindValuesKey hash = new BindValuesKey(); + hash.add(1).add(null).add("hello"); + + BindValuesKey hash2 = new BindValuesKey(); + hash2.add(1).add("hello"); + + BindValuesKey hash3 = new BindValuesKey(); + hash2.add(1).add(null); + + assertThat(hash).isNotEqualTo(hash2); + assertThat(hash).isNotEqualTo(hash3); + assertThat(hash2).isNotEqualTo(hash3); + } +} diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/DefaultOrmQueryTest.java b/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/DefaultOrmQueryTest.java index 999459892..b3b657c4a 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/DefaultOrmQueryTest.java +++ b/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/DefaultOrmQueryTest.java @@ -4,7 +4,7 @@ package io.ebeaninternal.server.querydefn; import io.ebean.BaseTestCase; import io.ebean.CacheMode; import io.ebean.Ebean; -import io.ebeaninternal.api.BindHash; +import io.ebeaninternal.api.BindValuesKey; import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.server.core.OrmQueryRequest; import org.junit.Test; @@ -63,7 +63,7 @@ public class DefaultOrmQueryTest extends BaseTestCase { prepare(q1, q2); assertThat(q1.createQueryPlanKey()).isNotEqualTo(q2.createQueryPlanKey()); - assertThat(getHash(q1)).isNotEqualTo(getHash(q2)); + assertThat(bindKey(q1)).isNotEqualTo(bindKey(q2)); } @Test @@ -74,7 +74,7 @@ public class DefaultOrmQueryTest extends BaseTestCase { prepare(q1, q2); assertThat(q1.createQueryPlanKey()).isEqualTo(q2.createQueryPlanKey()); - assertThat(getHash(q1)).isNotEqualTo(getHash(q2)); + assertThat(bindKey(q1)).isNotEqualTo(bindKey(q2)); } @Test @@ -85,7 +85,7 @@ public class DefaultOrmQueryTest extends BaseTestCase { prepare(q1, q2); assertThat(q1.createQueryPlanKey()).isEqualTo(q2.createQueryPlanKey()); - assertThat(getHash(q1)).isEqualTo(getHash(q2)); + assertThat(bindKey(q1)).isEqualTo(bindKey(q2)); } @Test @@ -112,9 +112,9 @@ public class DefaultOrmQueryTest extends BaseTestCase { q2.prepare(r2); } - private int getHash(DefaultOrmQuery query) { - BindHash hash = new BindHash(); - query.queryBindHash(hash); - return hash.hashCode(); + private BindValuesKey bindKey(DefaultOrmQuery query) { + BindValuesKey key = new BindValuesKey(); + query.queryBindHash(key); + return key; } }