From 181dc73d39f5285fb7d02ffbc923d01ff794c4d9 Mon Sep 17 00:00:00 2001 From: Roland Praml Date: Mon, 9 Aug 2021 09:19:53 +0200 Subject: [PATCH 01/11] Use MD5 for QueryBindHash --- .../java/io/ebeaninternal/api/BindHash.java | 37 +++++ .../java/io/ebeaninternal/api/BindParams.java | 11 +- .../java/io/ebeaninternal/api/HashQuery.java | 8 +- .../io/ebeaninternal/api/SpiExpression.java | 2 +- .../java/io/ebeaninternal/api/SpiQuery.java | 2 +- .../expression/AbstractTextExpression.java | 7 +- .../expression/AllEqualsExpression.java | 8 +- .../expression/ArrayContainsExpression.java | 10 +- .../expression/ArrayIsEmptyExpression.java | 5 +- .../server/expression/BetweenExpression.java | 7 +- .../expression/BetweenPropertyExpression.java | 5 +- .../server/expression/BitwiseExpression.java | 5 +- .../CaseInsensitiveEqualExpression.java | 5 +- .../expression/DefaultExampleExpression.java | 8 +- .../expression/DefaultExpressionList.java | 8 +- .../expression/ExistsQueryExpression.java | 5 +- .../server/expression/IdExpression.java | 5 +- .../server/expression/IdInExpression.java | 8 +- .../server/expression/InExpression.java | 8 +- .../server/expression/InPairsExpression.java | 8 +- .../server/expression/InQueryExpression.java | 5 +- .../server/expression/InRangeExpression.java | 7 +- .../server/expression/IsEmptyExpression.java | 5 +- .../server/expression/JsonPathExpression.java | 7 +- .../server/expression/JunctionExpression.java | 6 +- .../server/expression/LikeExpression.java | 5 +- .../server/expression/LogicExpression.java | 7 +- .../expression/NativeILikeExpression.java | 5 +- .../NestedPathWrapperExpression.java | 5 +- .../server/expression/NoopExpression.java | 4 +- .../server/expression/NotExpression.java | 5 +- .../server/expression/NullExpression.java | 5 +- .../server/expression/RawExpression.java | 8 +- .../server/expression/SimpleExpression.java | 5 +- .../server/querydefn/DefaultOrmQuery.java | 26 ++-- .../server/querydefn/HashCodeBindHash.java | 56 +++++++ .../server/querydefn/MdBindHash.java | 138 ++++++++++++++++++ .../server/expression/RawExpressionTest.java | 12 +- .../server/querydefn/DefaultOrmQueryTest.java | 14 +- .../java/org/tests/cache/TestQueryCache.java | 86 +++++++---- 40 files changed, 436 insertions(+), 137 deletions(-) create mode 100644 ebean-core/src/main/java/io/ebeaninternal/api/BindHash.java create mode 100644 ebean-core/src/main/java/io/ebeaninternal/server/querydefn/HashCodeBindHash.java create mode 100644 ebean-core/src/main/java/io/ebeaninternal/server/querydefn/MdBindHash.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 new file mode 100644 index 000000000..d70c5f09d --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindHash.java @@ -0,0 +1,37 @@ +package io.ebeaninternal.api; + +/** + * BindHash implementation. + * + * @author Roland Praml, FOCONIS AG + * + */ +public interface BindHash { + + /** + * Update with boolean value. + */ + BindHash update(boolean boolValue); + + /** + * Update with int value. + */ + BindHash update(int intValue); + + /** + * Update with long value. + */ + BindHash update(long longValue); + + /** + * Update with object value. + */ + BindHash update(Object value); + + /** + * finishes the hash. May be used to compute internal state. After finish, no + * update method must be called + */ + void finish(); + +} 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 afb1e44b8..2817c4ba1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java @@ -54,12 +54,11 @@ public class BindParams implements Serializable { positionedParameters.clear(); } - public int queryBindHash() { - int hc = namedParameters.hashCode(); + public void queryBindHash(BindHash hash) { + hash.update(positionedParameters.size()); for (Param positionedParameter : positionedParameters) { - hc = hc * 92821 + positionedParameter.hashCode(); + positionedParameter.queryBindHash(hash); } - return hc; } /** @@ -422,6 +421,10 @@ public class BindParams implements Serializable { return hc; } + void queryBindHash(BindHash hash) { + hash.update(isInParam).update(isOutParam).update(type).update(inValue); + } + @Override public boolean equals(Object o) { return o != null && (o == this || (o instanceof Param) && hashCode() == o.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 c14cb88d7..87241aedc 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/HashQuery.java @@ -7,12 +7,12 @@ public class HashQuery { private final CQueryPlanKey planHash; - private final int bindHash; + private final BindHash bindHash; /** * Create the HashQuery. */ - public HashQuery(CQueryPlanKey planHash, int bindHash) { + public HashQuery(CQueryPlanKey planHash, BindHash bindHash) { this.planHash = planHash; this.bindHash = bindHash; } @@ -25,7 +25,7 @@ public class HashQuery { @Override public int hashCode() { int hc = 92821 * planHash.hashCode(); - hc = 92821 * hc + bindHash; + hc = 92821 * hc + bindHash.hashCode(); return hc; } @@ -39,6 +39,6 @@ public class HashQuery { } HashQuery e = (HashQuery) obj; - return e.bindHash == bindHash && e.planHash.equals(planHash); + return e.bindHash.equals(bindHash) && 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 007e9f29f..32c3a3518 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. */ - int queryBindHash(); + void queryBindHash(BindHash hash); /** * 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 12942e7d6..d8bae7503 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). *

*/ - int queryBindHash(); + void queryBindHash(BindHash hash); /** * 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 d30649149..d377e48dd 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,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -37,9 +38,9 @@ public abstract class AbstractTextExpression extends AbstractExpression { } @Override - public int queryBindHash() { - return 0; - } + public void queryBindHash(BindHash hash) { + // do nothing, only execute against document store + }; @Override public boolean isSameByBind(SpiExpression other) { 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 5a931ec5a..df9e6095b 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,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -122,14 +123,13 @@ class AllEqualsExpression extends NonPrepareExpression { } @Override - public int queryBindHash() { + public void queryBindHash(BindHash hash) { - int hc = 92821; + hash.update(propMap.size()); for (Object value : propMap.values()) { - hc = hc * 92821 + (value == null ? 0 : value.hashCode()); + hash.update(value); } - return hc; } @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 8c12bec60..ac6d27d0e 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,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -49,12 +50,11 @@ public class ArrayContainsExpression extends AbstractExpression { } @Override - public int queryBindHash() { - int hc = values[0].hashCode(); - for (int i = 1; i < values.length; i++) { - hc = hc * 92821 + values[i].hashCode(); + public void queryBindHash(BindHash hash) { + hash.update(values.length); + for (int i = 0; i < values.length; i++) { + hash.update(values[i]); } - return hc; } @Override 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 815223dfe..0249acabb 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,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -33,8 +34,8 @@ public class ArrayIsEmptyExpression extends AbstractExpression { } @Override - public int queryBindHash() { - return empty ? 0 : 92821; + public void queryBindHash(BindHash hash) { + hash.update(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 bfdfa1d52..37a3aab8f 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,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -49,10 +50,8 @@ class BetweenExpression extends AbstractExpression { } @Override - public int queryBindHash() { - int hc = low().hashCode(); - hc = hc * 92821 + high().hashCode(); - return hc; + public void queryBindHash(BindHash hash) { + hash.update(low()).update(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 a50ec888f..440dd5f1f 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,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.util.SplitName; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -95,8 +96,8 @@ class BetweenPropertyExpression extends NonPrepareExpression { } @Override - public int queryBindHash() { - return val().hashCode(); + public void queryBindHash(BindHash hash) { + hash.update(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 073ee51df..db1fa686d 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,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -39,8 +40,8 @@ class BitwiseExpression extends AbstractExpression { } @Override - public int queryBindHash() { - return Long.hashCode(flags); + public void queryBindHash(BindHash hash) { + hash.update(flags).update(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 52e39fbfa..485d1b04f 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,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.server.el.ElPropertyValue; @@ -69,8 +70,8 @@ class CaseInsensitiveEqualExpression extends AbstractValueExpression { } @Override - public int queryBindHash() { - return val().hashCode(); + public void queryBindHash(BindHash hash) { + hash.update(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 aade99f5a..9149923e0 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,6 +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.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -241,12 +242,11 @@ public class DefaultExampleExpression implements SpiExpression, ExampleExpressio * Return a hash for the actual bind values used. */ @Override - public int queryBindHash() { - int hc = DefaultExampleExpression.class.getName().hashCode(); + public void queryBindHash(BindHash hash) { + hash.update(list.size()); for (SpiExpression aList : list) { - hc = hc * 92821 + aList.queryBindHash(); + aList.queryBindHash(hash); } - return hc; } @Override 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 ab80ae9e5..b5f9c6ec1 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,6 +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.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -678,12 +679,11 @@ public class DefaultExpressionList implements SpiExpressionList { * Calculate a hash based on the expressions. */ @Override - public int queryBindHash() { - int hash = DefaultExpressionList.class.getName().hashCode(); + public void queryBindHash(BindHash hash) { + hash.update(list.size()); for (SpiExpression aList : list) { - hash = hash * 92821 + aList.queryBindHash(); + aList.queryBindHash(hash); } - return hash; } @Override 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 32ae2bccc..b3fcf8ce0 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,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiEbeanServer; @@ -91,8 +92,8 @@ class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpress } @Override - public int queryBindHash() { - return subQuery.queryBindHash(); + public void queryBindHash(BindHash hash) { + subQuery.queryBindHash(hash); } @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 b5280b868..904fbe9be 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,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -77,8 +78,8 @@ class IdExpression extends NonPrepareExpression implements SpiExpression { } @Override - public int queryBindHash() { - return value.hashCode(); + public void queryBindHash(BindHash hash) { + hash.update(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 4c08b24d2..390d0bebb 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,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -133,8 +134,11 @@ public class IdInExpression extends NonPrepareExpression { } @Override - public int queryBindHash() { - return idCollection.hashCode(); + public void queryBindHash(BindHash hash) { + hash.update(idCollection.size()); + for (Object elem : idCollection) { + hash.update(elem); + } } @Override 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 7009a8b44..a5719f71a 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,6 +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.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -176,12 +177,11 @@ class InExpression extends AbstractExpression { } @Override - public int queryBindHash() { - int hc = 92821; + public void queryBindHash(BindHash hash) { + hash.update(bindValues.size()); for (Object bindValue : bindValues) { - hc = 92821 * hc + bindValue.hashCode(); + hash.update(bindValue); } - return hc; } @Override 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 96cc7c182..a7079ae55 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,6 +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.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -124,12 +125,11 @@ class InPairsExpression extends AbstractExpression { } @Override - public int queryBindHash() { - int hc = 92821; + public void queryBindHash(BindHash hash) { + hash.update(entries.size()); for (Pairs.Entry entry : entries) { - hc = 92821 * hc + entry.hashCode(); + hash.update(entry.getA()).update(entry.getB()); } - return hc; } @Override 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 83507af4b..619f7b715 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,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -72,8 +73,8 @@ class InQueryExpression extends AbstractExpression implements UnsupportedDocStor } @Override - public int queryBindHash() { - return subQuery.queryBindHash(); + public void queryBindHash(BindHash hash) { + subQuery.queryBindHash(hash); } @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 e1d170b43..abe0b7338 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,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -47,10 +48,8 @@ class InRangeExpression extends AbstractExpression { } @Override - public int queryBindHash() { - int hc = low().hashCode(); - hc = hc * 92821 + high().hashCode(); - return hc; + public void queryBindHash(BindHash hash) { + hash.update(low()).update(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 d3a3a1da6..bb65962b3 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,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -103,8 +104,8 @@ class IsEmptyExpression extends AbstractExpression { } @Override - public int queryBindHash() { - return 1; + public void queryBindHash(BindHash hash) { + // no bind values } @Override 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 f60b125cb..18e0aa924 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,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -83,10 +84,8 @@ class JsonPathExpression extends AbstractExpression { } @Override - public int queryBindHash() { - int hc = (value == null) ? 0 : value.hashCode(); - hc = (upperValue == null) ? hc : hc * 92821 + upperValue.hashCode(); - return hc; + public void queryBindHash(BindHash hash) { + hash.update(value).update(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 0aae30886..51eba8f39 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,6 +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.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -225,13 +226,12 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression } @Override - public int queryBindHash() { + public void queryBindHash(BindHash hash) { int hc = JunctionExpression.class.getName().hashCode(); List list = exprList.internalList(); for (SpiExpression aList : list) { - hc = hc * 92821 + aList.queryBindHash(); + aList.queryBindHash(hash); } - return hc; } @Override 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 6886203c4..587e6064c 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,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.LikeType; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.server.el.ElPropertyValue; @@ -70,8 +71,8 @@ class LikeExpression extends AbstractValueExpression { } @Override - public int queryBindHash() { - return strValue().hashCode(); + public void queryBindHash(BindHash hash) { + hash.update(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 482aac6e8..cbd487b3e 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,6 +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.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -168,10 +169,8 @@ abstract class LogicExpression implements SpiExpression { } @Override - public int queryBindHash() { - int hc = expOne.queryBindHash(); - hc = hc * 92821 + expTwo.queryBindHash(); - return hc; + public void queryBindHash(BindHash hash) { + hash.update(expOne).update(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 c3376f656..8c51d2f5d 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,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.LikeType; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; import io.ebeaninternal.server.el.ElPropertyValue; @@ -54,8 +55,8 @@ class NativeILikeExpression extends AbstractExpression { } @Override - public int queryBindHash() { - return val.hashCode(); + public void queryBindHash(BindHash hash) { + hash.update(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 77f46828b..f3ed1badd 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,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -79,8 +80,8 @@ class NestedPathWrapperExpression implements SpiExpression { } @Override - public int queryBindHash() { - return delegate.queryBindHash(); + public void queryBindHash(BindHash hash) { + delegate.queryBindHash(hash); } @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 28c9e3c78..92180cea1 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,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.event.BeanQueryRequest; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -74,9 +75,8 @@ class NoopExpression implements SpiExpression { } @Override - public int queryBindHash() { + public void queryBindHash(BindHash hash) { // no bind values - return 0; } @Override 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 60ade47b0..e9df6d856 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,6 +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.ManyWhereJoins; import io.ebeaninternal.api.NaturalKeyQueryData; import io.ebeaninternal.api.SpiExpression; @@ -99,8 +100,8 @@ final class NotExpression implements SpiExpression { } @Override - public int queryBindHash() { - return exp.queryBindHash(); + public void queryBindHash(BindHash hash) { + exp.queryBindHash(hash); } @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 90894dbde..daded43cb 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,6 +1,7 @@ package io.ebeaninternal.server.expression; import io.ebean.util.SplitName; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -94,7 +95,7 @@ class NullExpression extends AbstractExpression { } @Override - public int queryBindHash() { - return (notNull ? 1 : 0); + public void queryBindHash(BindHash hash) { + hash.update(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 295ddc75b..721d69b25 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,5 +1,6 @@ package io.ebeaninternal.server.expression; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.ManyWhereJoins; import io.ebeaninternal.api.SpiExpression; import io.ebeaninternal.api.SpiExpressionRequest; @@ -73,12 +74,11 @@ class RawExpression extends NonPrepareExpression { } @Override - public int queryBindHash() { - int hc = sql.hashCode(); + public void queryBindHash(BindHash hash) { + hash.update(values.length); for (Object value : values) { - hc = hc * 92821 + value.hashCode(); + hash.update(value); } - return hc; } @Override 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 0f8de90ec..e50d9856c 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,6 +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.NaturalKeyQueryData; import java.io.IOException; @@ -121,8 +122,8 @@ public class SimpleExpression extends AbstractValueExpression { } @Override - public int queryBindHash() { - return value().hashCode(); + public void queryBindHash(BindHash hash) { + hash.update(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 96a923637..6f3334ede 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 @@ -32,6 +32,8 @@ import io.ebean.bean.PersistenceContext; import io.ebean.event.BeanQueryRequest; import io.ebean.event.readaudit.ReadEvent; import io.ebean.plugin.BeanType; +import io.ebean.plugin.LoadErrorHandler; +import io.ebeaninternal.api.BindHash; import io.ebeaninternal.api.BindParams; import io.ebeaninternal.api.CQueryPlanKey; import io.ebeaninternal.api.CacheIdLookup; @@ -283,6 +285,8 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { private boolean orderById; + private final String bindHashAlgorithm; + private ProfileLocation profileLocation; public DefaultOrmQuery(BeanDescriptor desc, SpiEbeanServer server, ExpressionFactory expressionFactory) { @@ -291,6 +295,7 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { this.beanType = desc.getBeanType(); this.server = server; this.orderById = server.getServerConfig().isDefaultOrderById(); + this.bindHashAlgorithm = "MD5"; // TODO: server.getServerConfig().isUseMd5BindHash(); this.disableLazyLoading = server.getServerConfig().isDisableLazyLoading(); this.expressionFactory = expressionFactory; this.detail = new OrmQueryDetail(); @@ -1276,15 +1281,12 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { *

*/ @Override - public int queryBindHash() { - int hc = (id == null ? 0 : id.hashCode()); - hc = hc * 92821 + (whereExpressions == null ? 0 : whereExpressions.queryBindHash()); - hc = hc * 92821 + (havingExpressions == null ? 0 : havingExpressions.queryBindHash()); - hc = hc * 92821 + (bindParams == null ? 0 : bindParams.queryBindHash()); - hc = hc * 92821 + (asOf == null ? 0 : asOf.hashCode()); - hc = hc * 92821 + (versionsStart == null ? 0 : versionsStart.hashCode()); - hc = hc * 92821 + (versionsEnd == null ? 0 : versionsEnd.hashCode()); - return hc; + 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); } /** @@ -1298,8 +1300,10 @@ 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 - int hc = queryBindHash(); - return new HashQuery(queryPlanKey, hc); + BindHash hash = bindHashAlgorithm == null ? new HashCodeBindHash() : new MdBindHash(bindHashAlgorithm); + queryBindHash(hash); + hash.finish(); + return new HashQuery(queryPlanKey, hash); } @Override diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/HashCodeBindHash.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/HashCodeBindHash.java new file mode 100644 index 000000000..cc6cd5f13 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/HashCodeBindHash.java @@ -0,0 +1,56 @@ +package io.ebeaninternal.server.querydefn; + +import java.util.Objects; + +import io.ebeaninternal.api.BindHash; + +/** + * HashCode builder that uses Object.hashCode for computing bind-hashes. + * This is a fast and lightweight implementation, but may produce collisions. + * + * @author Roland Praml, FOCONIS AG + */ +public class HashCodeBindHash implements BindHash { + + int hashCode; + + @Override + public BindHash update(int intValue) { + hashCode = hashCode * 92821 + intValue; + return this; + } + + @Override + public BindHash update(long longValue) { + hashCode = hashCode * 92821 + Long.hashCode(longValue); + return this; + } + + @Override + public BindHash update(boolean boolValue) { + hashCode = hashCode * 92821 + Boolean.hashCode(boolValue); + return this; + } + + @Override + public BindHash update(Object value) { + hashCode = hashCode * 92821 + Objects.hashCode(value); + return this; + } + + @Override + public void finish() { + // nothing to do + } + + @Override + public boolean equals(Object obj) { + return obj instanceof HashCodeBindHash && ((HashCodeBindHash) obj).hashCode == hashCode; + } + + @Override + public int hashCode() { + return hashCode; + } + +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/MdBindHash.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/MdBindHash.java new file mode 100644 index 000000000..4791a9c07 --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/MdBindHash.java @@ -0,0 +1,138 @@ +/* + * Licensed Materials - Property of FOCONIS AG + * (C) Copyright FOCONIS AG. + */ + +package io.ebeaninternal.server.querydefn; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.Arrays; +import java.util.Date; +import java.util.UUID; + +import io.ebeaninternal.api.BindHash; + +/** + * Bind hash that uses a MessageDigest to compute a collision resistent hash. + * + * @author Roland Praml, FOCONIS AG + * + */ +public class MdBindHash implements BindHash { + private MessageDigest md; + private byte[] buffer; + private int hashCode; + + public MdBindHash(String algorithm) { + try { + md = MessageDigest.getInstance(algorithm); + } catch (NoSuchAlgorithmException nsae) { + throw new InternalError(algorithm + " not supported", nsae); + } + } + + @Override + public BindHash update(int v) { + md.update((byte) (v >>> 24)); + md.update((byte) (v >>> 16)); + md.update((byte) (v >>> 8)); + md.update((byte) (v >>> 0)); + return this; + } + + @Override + public BindHash update(long v) { + md.update((byte) (v >>> 56)); + md.update((byte) (v >>> 48)); + md.update((byte) (v >>> 40)); + md.update((byte) (v >>> 32)); + md.update((byte) (v >>> 24)); + md.update((byte) (v >>> 16)); + md.update((byte) (v >>> 8)); + md.update((byte) (v >>> 0)); + return this; + } + + @Override + public BindHash update(boolean boolValue) { + md.update(boolValue ? (byte) 1 : (byte) 0); + return this; + } + + @Override + public BindHash update(Object value) { + if (value == null) { + md.update((byte) 0); + + // do some special handling for known object types + } else if (value instanceof String) { + md.update(((String) value).getBytes()); + + } else if (value instanceof Long) { + update(((Long) value).longValue()); + + } else if (value instanceof Double) { + double d = ((Double) value).doubleValue(); + update(Double.doubleToLongBits(d)); + + } else if (value instanceof UUID) { + UUID uuid = (UUID) value; + update(uuid.getLeastSignificantBits()); + update(uuid.getMostSignificantBits()); + + } else if (value instanceof Date) { + update(((Date) value).getTime()); + + } else if (value instanceof Instant) { + update(((Instant) value).getEpochSecond()); + update(((Instant) value).getNano()); + + } else if (value instanceof LocalDate) { + update(((LocalDate) value).toEpochDay()); + + } else if (value instanceof LocalTime) { + update(((LocalTime) value).toSecondOfDay()); + update(((LocalTime) value).toNanoOfDay()); + + } else if (value instanceof LocalDateTime) { + update(((LocalDateTime) value).toLocalDate().toEpochDay()); + update(((LocalDateTime) value).toLocalTime().toSecondOfDay()); + update(((LocalDateTime) value).toLocalTime().toNanoOfDay()); + + } else { + // Fall back to hashCode for all other types + updateOther(value); + } + return this; + } + + /** + * Update all other object. May be overridden to handle joda dates. + */ + protected void updateOther(Object value) { + // Fall back to hashCode for all other types + update(value.hashCode()); + } + + @Override + public void finish() { + buffer = md.digest(); + hashCode = Arrays.hashCode(buffer); + md = null; // clear memory + } + + @Override + public boolean equals(Object obj) { + return obj instanceof MdBindHash && Arrays.equals(buffer, ((MdBindHash) obj).buffer); + } + + @Override + public int hashCode() { + return hashCode; + } +} 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 1953f2959..6c608472f 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,6 +3,8 @@ 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.server.querydefn.HashCodeBindHash; public class RawExpressionTest extends BaseExpressionTest { @@ -61,11 +63,17 @@ public class RawExpressionTest extends BaseExpressionTest { } public void assert_queryBindHash_isDifferent(RawExpression exp0, RawExpression exp1) { - assertThat(exp0.queryBindHash()).isNotEqualTo(exp1.queryBindHash()); + assertThat(getHash(exp0)).isNotEqualTo(getHash(exp1)); } public void assert_queryBindHash_isSame(RawExpression exp0, RawExpression exp1) { - assertThat(exp0.queryBindHash()).isEqualTo(exp1.queryBindHash()); + assertThat(getHash(exp0)).isEqualTo(getHash(exp1)); } + private int getHash(RawExpression query) { + BindHash hash = new HashCodeBindHash(); + query.queryBindHash(hash); + hash.finish(); + return hash.hashCode(); + } } 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 d9e621221..cb1738ba8 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,6 +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.SpiQuery; import io.ebeaninternal.server.core.OrmQueryRequest; import org.junit.Test; @@ -62,7 +63,7 @@ public class DefaultOrmQueryTest extends BaseTestCase { prepare(q1, q2); assertThat(q1.createQueryPlanKey()).isNotEqualTo(q2.createQueryPlanKey()); - assertThat(q1.queryBindHash()).isNotEqualTo(q2.queryBindHash()); + assertThat(getHash(q1)).isNotEqualTo(getHash(q2)); } @Test @@ -73,7 +74,7 @@ public class DefaultOrmQueryTest extends BaseTestCase { prepare(q1, q2); assertThat(q1.createQueryPlanKey()).isEqualTo(q2.createQueryPlanKey()); - assertThat(q1.queryBindHash()).isNotEqualTo(q2.queryBindHash()); + assertThat(getHash(q1)).isNotEqualTo(getHash(q2)); } @Test @@ -84,7 +85,7 @@ public class DefaultOrmQueryTest extends BaseTestCase { prepare(q1, q2); assertThat(q1.createQueryPlanKey()).isEqualTo(q2.createQueryPlanKey()); - assertThat(q1.queryBindHash()).isEqualTo(q2.queryBindHash()); + assertThat(getHash(q1)).isEqualTo(getHash(q2)); } @Test @@ -110,4 +111,11 @@ public class DefaultOrmQueryTest extends BaseTestCase { OrmQueryRequest r2 = createQueryRequest(SpiQuery.Type.LIST, q2, null); q2.prepare(r2); } + + private int getHash(DefaultOrmQuery query) { + BindHash hash = new HashCodeBindHash(); + query.queryBindHash(hash); + hash.finish(); + return hash.hashCode(); + } } diff --git a/ebean-core/src/test/java/org/tests/cache/TestQueryCache.java b/ebean-core/src/test/java/org/tests/cache/TestQueryCache.java index f9e732220..4c4d56109 100644 --- a/ebean-core/src/test/java/org/tests/cache/TestQueryCache.java +++ b/ebean-core/src/test/java/org/tests/cache/TestQueryCache.java @@ -3,7 +3,7 @@ package org.tests.cache; import io.ebean.BaseTestCase; import io.ebean.CacheMode; import io.ebean.DB; -import io.ebean.Ebean; +import io.ebean.ExpressionList; import io.ebean.bean.BeanCollection; import io.ebean.cache.ServerCache; import org.ebeantest.LoggedSqlCollector; @@ -14,6 +14,7 @@ import org.tests.model.basic.ResetBasicData; import org.tests.model.cache.EColAB; import java.util.List; +import java.util.function.Consumer; import static org.assertj.core.api.Assertions.assertThat; @@ -26,8 +27,7 @@ public class TestQueryCache extends BaseTestCase { new EColAB("02", "10").save(); List list1 = - Ebean.getServer(null) - .find(EColAB.class) + DB.find(EColAB.class) .setUseQueryCache(true) .where() .eq("columnA", "01") @@ -35,8 +35,7 @@ public class TestQueryCache extends BaseTestCase { .findList(); List list2 = - Ebean.getServer(null) - .find(EColAB.class) + DB.find(EColAB.class) .setUseQueryCache(true) .where() .eq("columnA", "02") @@ -57,7 +56,7 @@ public class TestQueryCache extends BaseTestCase { new EColAB("03", "SingleAttribute").save(); new EColAB("03", "SingleAttribute").save(); - List colA_first = Ebean.getServer(null) + List colA_first = DB .find(EColAB.class) .setUseQueryCache(true) .setDistinct(true) @@ -66,7 +65,7 @@ public class TestQueryCache extends BaseTestCase { .eq("columnB", "SingleAttribute") .findSingleAttributeList(); - List colA_Second = Ebean.getServer(null) + List colA_Second = DB .find(EColAB.class) .setUseQueryCache(true) .setDistinct(true) @@ -77,7 +76,7 @@ public class TestQueryCache extends BaseTestCase { assertThat(colA_Second).isSameAs(colA_first); - List colA_NotDistinct = Ebean.getServer(null) + List colA_NotDistinct = DB .find(EColAB.class) .setUseQueryCache(true) .select("columnA") @@ -89,7 +88,7 @@ public class TestQueryCache extends BaseTestCase { // ensure that findCount & findSingleAttribute use different // slots in cache. If not a "Cannot cast List to int" should happen. - int count = Ebean.getServer(null) + int count = DB .find(EColAB.class) .setUseQueryCache(true) .select("columnA") @@ -107,13 +106,13 @@ public class TestQueryCache extends BaseTestCase { LoggedSqlCollector.start(); - int count0 = Ebean.find(EColAB.class) + int count0 = DB.find(EColAB.class) .setUseQueryCache(CacheMode.ON) .where() .eq("columnB", "count") .findCount(); - int count1 = Ebean.find(EColAB.class) + int count1 = DB.find(EColAB.class) .setUseQueryCache(CacheMode.ON) .where() .eq("columnB", "count") @@ -126,7 +125,7 @@ public class TestQueryCache extends BaseTestCase { // and now, ensure that we hit the database LoggedSqlCollector.start(); - int count2 = Ebean.find(EColAB.class) + int count2 = DB.find(EColAB.class) .setUseQueryCache(CacheMode.OFF) .where() .eq("columnB", "count") @@ -142,13 +141,13 @@ public class TestQueryCache extends BaseTestCase { LoggedSqlCollector.start(); - int count0 = Ebean.find(EColAB.class) + int count0 = DB.find(EColAB.class) .setUseQueryCache(CacheMode.ON) .where() .eq("columnB", "abc") .findCount(); - int count1 = Ebean.find(EColAB.class) + int count1 = DB.find(EColAB.class) .setUseQueryCache(CacheMode.ON) .where() .eq("columnB", "def") @@ -167,13 +166,13 @@ public class TestQueryCache extends BaseTestCase { LoggedSqlCollector.start(); - int count0 = Ebean.find(EColAB.class) + int count0 = DB.find(EColAB.class) .setUseQueryCache(CacheMode.ON) .where() .eq("columnB", "uvw") .findCount(); - int count1 = Ebean.find(EColAB.class) + int count1 = DB.find(EColAB.class) .setUseQueryCache(CacheMode.PUT) .where() .eq("columnB", "uvw") @@ -193,13 +192,13 @@ public class TestQueryCache extends BaseTestCase { LoggedSqlCollector.start(); - int count0 = Ebean.find(EColAB.class) + int count0 = DB.find(EColAB.class) .setUseQueryCache(CacheMode.PUT) .where() .eq("columnB", "xyz") .findCount(); - int count1 = Ebean.find(EColAB.class) + int count1 = DB.find(EColAB.class) .setUseQueryCache(CacheMode.ON) .where() .eq("columnB", "xyz") @@ -214,26 +213,26 @@ public class TestQueryCache extends BaseTestCase { @Test @SuppressWarnings("unchecked") - public void test() { + public void testReadOnlyFind() { ResetBasicData.reset(); - ServerCache customerCache = Ebean.getServerCacheManager().getQueryCache(Customer.class); + ServerCache customerCache = DB.getServerCacheManager().getQueryCache(Customer.class); customerCache.clear(); - List list = Ebean.find(Customer.class).setUseQueryCache(true).setReadOnly(true).where() + List list = DB.find(Customer.class).setUseQueryCache(true).setReadOnly(true).where() .ilike("name", "Rob").findList(); BeanCollection bc = (BeanCollection) list; Assert.assertTrue(bc.isReadOnly()); Assert.assertFalse(bc.isEmpty()); Assert.assertTrue(!list.isEmpty()); - Assert.assertTrue(Ebean.getBeanState(list.get(0)).isReadOnly()); + Assert.assertTrue(DB.getBeanState(list.get(0)).isReadOnly()); - List list2 = Ebean.find(Customer.class).setUseQueryCache(true).setReadOnly(true).where() + List list2 = DB.find(Customer.class).setUseQueryCache(true).setReadOnly(true).where() .ilike("name", "Rob").findList(); - List list2B = Ebean.find(Customer.class).setUseQueryCache(true) + List list2B = DB.find(Customer.class).setUseQueryCache(true) // .setReadOnly(true) .where().ilike("name", "Rob").findList(); @@ -245,7 +244,7 @@ public class TestQueryCache extends BaseTestCase { - List list3 = Ebean.find(Customer.class).setUseQueryCache(true).setReadOnly(false).where() + List list3 = DB.find(Customer.class).setUseQueryCache(true).setReadOnly(false).where() .ilike("name", "Rob").findList(); Assert.assertNotSame(list, list3); @@ -269,13 +268,13 @@ public class TestQueryCache extends BaseTestCase { LoggedSqlCollector.start(); - List colA_first = Ebean.find(EColAB.class) + List colA_first = DB.find(EColAB.class) .setUseQueryCache(CacheMode.ON) .where() .eq("columnB", "someId") .findIds(); - List colA_second = Ebean.find(EColAB.class) + List colA_second = DB.find(EColAB.class) .setUseQueryCache(CacheMode.ON) .where() .eq("columnB", "someId") @@ -289,7 +288,7 @@ public class TestQueryCache extends BaseTestCase { // and now, ensure that we hit the database LoggedSqlCollector.start(); - colA_second = Ebean.find(EColAB.class) + colA_second = DB.find(EColAB.class) .setUseQueryCache(CacheMode.PUT) .where() .eq("columnB", "someId") @@ -299,4 +298,35 @@ public class TestQueryCache extends BaseTestCase { assertThat(sql).hasSize(1); } + @Test + public void findCountDifferentQueriesBit() { + DB.getDefault().getPluginApi().getServerCacheManager().clearAll(); + differentFindCount(q->q.bitwiseAny("id",1), q->q.bitwiseAny("id",0)); + differentFindCount(q->q.bitwiseAll("id",1), q->q.bitwiseAll("id",0)); + // differentFindCount(q->q.bitwiseNot("id",1), q->q.bitwiseNot("id",0)); NOT 1 == AND 1 = 0 + differentFindCount(q->q.bitwiseAnd("id",1, 0), q->q.bitwiseAnd("id",1, 1)); + + differentFindCount(q->q.bitwiseAnd("id",2, 0), q->q.bitwiseAnd("id",4, 0)); + differentFindCount(q->q.bitwiseAnd("id",2, 1), q->q.bitwiseAnd("id",4, 1)); + // Will produce hash collision + differentFindCount(q->q.bitwiseAnd("id",10, 0), q->q.bitwiseAnd("id",0, 928210)); + + } + + void differentFindCount(Consumer> q0, Consumer> q1) { + LoggedSqlCollector.start(); + + ExpressionList el0 = DB.find(EColAB.class).setUseQueryCache(CacheMode.ON).where(); + q0.accept(el0); + el0.findCount(); + + ExpressionList el1 = DB.find(EColAB.class).setUseQueryCache(CacheMode.ON).where(); + q1.accept(el1); + el1.findCount(); + + List sql = LoggedSqlCollector.stop(); + + assertThat(sql).hasSize(2); // different queries + } + } From 3e8f76cd6d054cbc9bb88392c4e3048d8857841b Mon Sep 17 00:00:00 2001 From: rbygrave Date: Tue, 10 Aug 2021 21:49:31 +1200 Subject: [PATCH 02/11] Update HashCodeBindHash to use values for equals() --- .../server/querydefn/DefaultOrmQuery.java | 3 ++- .../server/querydefn/HashCodeBindHash.java | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) 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 6f3334ede..f29889a88 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 @@ -1300,7 +1300,8 @@ 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 = bindHashAlgorithm == null ? new HashCodeBindHash() : new MdBindHash(bindHashAlgorithm); + //BindHash hash = bindHashAlgorithm == null ? new HashCodeBindHash() : new MdBindHash(bindHashAlgorithm); + BindHash hash = new HashCodeBindHash();// : new MdBindHash(bindHashAlgorithm); queryBindHash(hash); hash.finish(); return new HashQuery(queryPlanKey, hash); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/HashCodeBindHash.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/HashCodeBindHash.java index cc6cd5f13..9bc9c60fc 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/HashCodeBindHash.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/HashCodeBindHash.java @@ -1,5 +1,7 @@ package io.ebeaninternal.server.querydefn; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; import io.ebeaninternal.api.BindHash; @@ -12,28 +14,33 @@ import io.ebeaninternal.api.BindHash; */ public class HashCodeBindHash implements BindHash { - int hashCode; + private final List values = new ArrayList<>(); + private int hashCode; @Override public BindHash update(int intValue) { + values.add(intValue); hashCode = hashCode * 92821 + intValue; return this; } @Override public BindHash update(long longValue) { + values.add(longValue); hashCode = hashCode * 92821 + Long.hashCode(longValue); return this; } @Override public BindHash update(boolean boolValue) { + values.add(boolValue); hashCode = hashCode * 92821 + Boolean.hashCode(boolValue); return this; } @Override public BindHash update(Object value) { + values.add(value); hashCode = hashCode * 92821 + Objects.hashCode(value); return this; } @@ -45,7 +52,7 @@ public class HashCodeBindHash implements BindHash { @Override public boolean equals(Object obj) { - return obj instanceof HashCodeBindHash && ((HashCodeBindHash) obj).hashCode == hashCode; + return obj instanceof HashCodeBindHash && ((HashCodeBindHash) obj).values.equals(values); } @Override From ede1ad0a4c0d067bfa2823d0ec24530c7e88254e Mon Sep 17 00:00:00 2001 From: rbygrave Date: Tue, 10 Aug 2021 21:58:41 +1200 Subject: [PATCH 03/11] Fix BindParams equals() and hashCode() --- .../java/io/ebeaninternal/api/BindParams.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) 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 2817c4ba1..3a81f2f0a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java @@ -4,11 +4,7 @@ import io.ebeaninternal.server.persist.MultiValueWrapper; import io.ebeaninternal.server.querydefn.NaturalKeyBindParam; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; /** @@ -414,6 +410,7 @@ public class BindParams implements Serializable { @Override public int hashCode() { int hc = getClass().hashCode(); + hc = hc * 92821 + (encryptionKey ? 0 : 1); hc = hc * 92821 + (isInParam ? 0 : 1); hc = hc * 92821 + (isOutParam ? 0 : 1); hc = hc * 92821 + (type); @@ -421,13 +418,17 @@ public class BindParams implements Serializable { return hc; } - void queryBindHash(BindHash hash) { - hash.update(isInParam).update(isOutParam).update(type).update(inValue); - } - @Override public boolean equals(Object o) { - return o != null && (o == this || (o instanceof Param) && hashCode() == o.hashCode()); + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Param param = (Param) o; + return encryptionKey == param.encryptionKey && 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); } /** From 2dc48cf08d4519e66bc8bc81b9f31a791407e47d Mon Sep 17 00:00:00 2001 From: rbygrave Date: Tue, 10 Aug 2021 22:00:46 +1200 Subject: [PATCH 04/11] ArrayContainsExpression equals() to use enhanced for loop --- .../server/expression/ArrayContainsExpression.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 ac6d27d0e..3c200c046 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 @@ -52,8 +52,8 @@ public class ArrayContainsExpression extends AbstractExpression { @Override public void queryBindHash(BindHash hash) { hash.update(values.length); - for (int i = 0; i < values.length; i++) { - hash.update(values[i]); + for (Object value : values) { + hash.update(value); } } From ac3edbedf41ef627f5d99f77507dbfac4fc51dd5 Mon Sep 17 00:00:00 2001 From: rbygrave Date: Tue, 10 Aug 2021 22:07:48 +1200 Subject: [PATCH 05/11] Remove MdBindHash, tidy DefaultOrmQuery --- .../server/querydefn/DefaultOrmQuery.java | 67 +-------- .../server/querydefn/MdBindHash.java | 138 ------------------ 2 files changed, 5 insertions(+), 200 deletions(-) delete mode 100644 ebean-core/src/main/java/io/ebeaninternal/server/querydefn/MdBindHash.java 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 f29889a88..e4735e32b 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 @@ -1,30 +1,7 @@ package io.ebeaninternal.server.querydefn; -import io.ebean.CacheMode; -import io.ebean.CountDistinctOrder; -import io.ebean.Database; -import io.ebean.DtoQuery; -import io.ebean.Expression; -import io.ebean.ExpressionFactory; -import io.ebean.ExpressionList; -import io.ebean.FetchConfig; -import io.ebean.FetchGroup; -import io.ebean.FetchPath; -import io.ebean.FutureIds; -import io.ebean.FutureList; -import io.ebean.FutureRowCount; -import io.ebean.OrderBy; +import io.ebean.*; import io.ebean.OrderBy.Property; -import io.ebean.PagedList; -import io.ebean.PersistenceContextScope; -import io.ebean.ProfileLocation; -import io.ebean.Query; -import io.ebean.QueryIterator; -import io.ebean.QueryType; -import io.ebean.RawSql; -import io.ebean.Transaction; -import io.ebean.UpdateQuery; -import io.ebean.Version; import io.ebean.bean.CallOrigin; import io.ebean.bean.ObjectGraphNode; import io.ebean.bean.ObjectGraphOrigin; @@ -32,31 +9,10 @@ import io.ebean.bean.PersistenceContext; import io.ebean.event.BeanQueryRequest; import io.ebean.event.readaudit.ReadEvent; import io.ebean.plugin.BeanType; -import io.ebean.plugin.LoadErrorHandler; -import io.ebeaninternal.api.BindHash; -import io.ebeaninternal.api.BindParams; -import io.ebeaninternal.api.CQueryPlanKey; -import io.ebeaninternal.api.CacheIdLookup; -import io.ebeaninternal.api.CacheIdLookupMany; -import io.ebeaninternal.api.CacheIdLookupSingle; -import io.ebeaninternal.api.HashQuery; -import io.ebeaninternal.api.ManyWhereJoins; -import io.ebeaninternal.api.NaturalKeyQueryData; -import io.ebeaninternal.api.SpiEbeanServer; -import io.ebeaninternal.api.SpiExpression; -import io.ebeaninternal.api.SpiExpressionList; -import io.ebeaninternal.api.SpiExpressionValidation; -import io.ebeaninternal.api.SpiNamedParam; -import io.ebeaninternal.api.SpiQuery; -import io.ebeaninternal.api.SpiQuerySecondary; -import io.ebeaninternal.api.SpiTransaction; +import io.ebeaninternal.api.*; import io.ebeaninternal.server.autotune.ProfilingListener; import io.ebeaninternal.server.core.SpiOrmQueryRequest; -import io.ebeaninternal.server.deploy.BeanDescriptor; -import io.ebeaninternal.server.deploy.BeanNaturalKey; -import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; -import io.ebeaninternal.server.deploy.InheritInfo; -import io.ebeaninternal.server.deploy.TableJoin; +import io.ebeaninternal.server.deploy.*; import io.ebeaninternal.server.el.ElPropertyDeploy; import io.ebeaninternal.server.expression.DefaultExpressionList; import io.ebeaninternal.server.expression.IdInExpression; @@ -68,14 +24,7 @@ import io.ebeaninternal.server.transaction.ExternalJdbcTransaction; import javax.persistence.PersistenceException; import java.sql.Connection; import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.locks.ReentrantLock; +import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; @@ -93,8 +42,6 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { private static final FetchConfig FETCH_LAZY = FetchConfig.ofLazy(); - private final ReentrantLock lock = new ReentrantLock(); - private final Class beanType; private final ExpressionFactory expressionFactory; @@ -285,8 +232,6 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { private boolean orderById; - private final String bindHashAlgorithm; - private ProfileLocation profileLocation; public DefaultOrmQuery(BeanDescriptor desc, SpiEbeanServer server, ExpressionFactory expressionFactory) { @@ -295,7 +240,6 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { this.beanType = desc.getBeanType(); this.server = server; this.orderById = server.getServerConfig().isDefaultOrderById(); - this.bindHashAlgorithm = "MD5"; // TODO: server.getServerConfig().isUseMd5BindHash(); this.disableLazyLoading = server.getServerConfig().isDisableLazyLoading(); this.expressionFactory = expressionFactory; this.detail = new OrmQueryDetail(); @@ -1300,8 +1244,7 @@ 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 = bindHashAlgorithm == null ? new HashCodeBindHash() : new MdBindHash(bindHashAlgorithm); - BindHash hash = new HashCodeBindHash();// : new MdBindHash(bindHashAlgorithm); + BindHash hash = new HashCodeBindHash(); queryBindHash(hash); hash.finish(); return new HashQuery(queryPlanKey, hash); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/MdBindHash.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/MdBindHash.java deleted file mode 100644 index 4791a9c07..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/MdBindHash.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Licensed Materials - Property of FOCONIS AG - * (C) Copyright FOCONIS AG. - */ - -package io.ebeaninternal.server.querydefn; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.util.Arrays; -import java.util.Date; -import java.util.UUID; - -import io.ebeaninternal.api.BindHash; - -/** - * Bind hash that uses a MessageDigest to compute a collision resistent hash. - * - * @author Roland Praml, FOCONIS AG - * - */ -public class MdBindHash implements BindHash { - private MessageDigest md; - private byte[] buffer; - private int hashCode; - - public MdBindHash(String algorithm) { - try { - md = MessageDigest.getInstance(algorithm); - } catch (NoSuchAlgorithmException nsae) { - throw new InternalError(algorithm + " not supported", nsae); - } - } - - @Override - public BindHash update(int v) { - md.update((byte) (v >>> 24)); - md.update((byte) (v >>> 16)); - md.update((byte) (v >>> 8)); - md.update((byte) (v >>> 0)); - return this; - } - - @Override - public BindHash update(long v) { - md.update((byte) (v >>> 56)); - md.update((byte) (v >>> 48)); - md.update((byte) (v >>> 40)); - md.update((byte) (v >>> 32)); - md.update((byte) (v >>> 24)); - md.update((byte) (v >>> 16)); - md.update((byte) (v >>> 8)); - md.update((byte) (v >>> 0)); - return this; - } - - @Override - public BindHash update(boolean boolValue) { - md.update(boolValue ? (byte) 1 : (byte) 0); - return this; - } - - @Override - public BindHash update(Object value) { - if (value == null) { - md.update((byte) 0); - - // do some special handling for known object types - } else if (value instanceof String) { - md.update(((String) value).getBytes()); - - } else if (value instanceof Long) { - update(((Long) value).longValue()); - - } else if (value instanceof Double) { - double d = ((Double) value).doubleValue(); - update(Double.doubleToLongBits(d)); - - } else if (value instanceof UUID) { - UUID uuid = (UUID) value; - update(uuid.getLeastSignificantBits()); - update(uuid.getMostSignificantBits()); - - } else if (value instanceof Date) { - update(((Date) value).getTime()); - - } else if (value instanceof Instant) { - update(((Instant) value).getEpochSecond()); - update(((Instant) value).getNano()); - - } else if (value instanceof LocalDate) { - update(((LocalDate) value).toEpochDay()); - - } else if (value instanceof LocalTime) { - update(((LocalTime) value).toSecondOfDay()); - update(((LocalTime) value).toNanoOfDay()); - - } else if (value instanceof LocalDateTime) { - update(((LocalDateTime) value).toLocalDate().toEpochDay()); - update(((LocalDateTime) value).toLocalTime().toSecondOfDay()); - update(((LocalDateTime) value).toLocalTime().toNanoOfDay()); - - } else { - // Fall back to hashCode for all other types - updateOther(value); - } - return this; - } - - /** - * Update all other object. May be overridden to handle joda dates. - */ - protected void updateOther(Object value) { - // Fall back to hashCode for all other types - update(value.hashCode()); - } - - @Override - public void finish() { - buffer = md.digest(); - hashCode = Arrays.hashCode(buffer); - md = null; // clear memory - } - - @Override - public boolean equals(Object obj) { - return obj instanceof MdBindHash && Arrays.equals(buffer, ((MdBindHash) obj).buffer); - } - - @Override - public int hashCode() { - return hashCode; - } -} From e1ad210bb088aa7da3a6ee15fe6775742becf784 Mon Sep 17 00:00:00 2001 From: rbygrave Date: Tue, 10 Aug 2021 22:18:33 +1200 Subject: [PATCH 06/11] Tidy JunctionExpression --- .../server/expression/JunctionExpression.java | 38 ++++++------------- 1 file changed, 12 insertions(+), 26 deletions(-) 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 51eba8f39..88614873d 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 @@ -114,9 +114,8 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public void writeDocQuery(DocQueryContext context) throws IOException { context.startBool(type); - List list = exprList.internalList(); - for (SpiExpression aList : list) { - aList.writeDocQuery(context); + for (SpiExpression expr : exprList.internalList()) { + expr.writeDocQuery(context); } context.endBool(); } @@ -124,9 +123,8 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public void writeDocQueryJunction(DocQueryContext context) throws IOException { context.startBoolGroupList(type); - List list = exprList.internalList(); - for (SpiExpression aList : list) { - aList.writeDocQuery(context); + for (SpiExpression expr : exprList.internalList()) { + expr.writeDocQuery(context); } context.endBoolGroupList(); } @@ -139,18 +137,15 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public void containsMany(BeanDescriptor desc, ManyWhereJoins manyWhereJoin) { - List list = exprList.internalList(); - // get the current state for 'require outer joins' boolean parentOuterJoins = manyWhereJoin.isRequireOuterJoins(); if (type == Type.OR) { // turn on outer joins required for disjunction expressions manyWhereJoin.setRequireOuterJoins(true); } - - for (SpiExpression aList : list) { - aList.containsMany(desc, manyWhereJoin); + for (SpiExpression expr : list) { + expr.containsMany(desc, manyWhereJoin); } if (type == Type.OR && !parentOuterJoins) { // restore state to not forcing outer joins @@ -177,18 +172,14 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public void addBindValues(SpiExpressionRequest request) { - - List list = exprList.internalList(); - for (SpiExpression aList : list) { - aList.addBindValues(request); + for (SpiExpression expr : exprList.internalList()) { + expr.addBindValues(request); } } @Override public void addSql(SpiExpressionRequest request) { - List list = exprList.internalList(); - if (!list.isEmpty()) { request.append(type.prefix()); request.append("("); @@ -205,9 +196,8 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public void prepareExpression(BeanQueryRequest request) { - List list = exprList.internalList(); - for (SpiExpression aList : list) { - aList.prepareExpression(request); + for (SpiExpression expr : exprList.internalList()) { + expr.prepareExpression(request); } } @@ -227,10 +217,8 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public void queryBindHash(BindHash hash) { - int hc = JunctionExpression.class.getName().hashCode(); - List list = exprList.internalList(); - for (SpiExpression aList : list) { - aList.queryBindHash(hash); + for (SpiExpression expr : exprList.internalList()) { + expr.queryBindHash(hash); } } @@ -275,7 +263,6 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression return exprList.textCommonTerms(search, options); } - @Override public ExpressionList allEq(Map propertyMap) { return exprList.allEq(propertyMap); @@ -1025,7 +1012,6 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression @Override public String nestedPath(BeanDescriptor desc) { - PrepareDocNested.prepare(exprList, desc, type); String nestedPath = exprList.allDocNestedPath; if (nestedPath != null) { From e47b1737a82382093714d07bc3f20f787c63c7f9 Mon Sep 17 00:00:00 2001 From: rbygrave Date: Tue, 10 Aug 2021 22:28:31 +1200 Subject: [PATCH 07/11] Add HashCodeBindHashTest --- .../querydefn/HashCodeBindHashTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 ebean-core/src/test/java/io/ebeaninternal/server/querydefn/HashCodeBindHashTest.java diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/HashCodeBindHashTest.java b/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/HashCodeBindHashTest.java new file mode 100644 index 000000000..dea0a2e0c --- /dev/null +++ b/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/HashCodeBindHashTest.java @@ -0,0 +1,37 @@ +package io.ebeaninternal.server.querydefn; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class HashCodeBindHashTest { + + @Test + public void update_with_null() { + + HashCodeBindHash hash = new HashCodeBindHash(); + hash.update(1).update(null).update("hello"); + + HashCodeBindHash hash2 = new HashCodeBindHash(); + hash2.update(1).update(null).update("hello"); + + assertThat(hash).isEqualTo(hash2); + } + + @Test + public void notEqual() { + + HashCodeBindHash hash = new HashCodeBindHash(); + hash.update(1).update(null).update("hello"); + + HashCodeBindHash hash2 = new HashCodeBindHash(); + hash2.update(1).update("hello"); + + HashCodeBindHash hash3 = new HashCodeBindHash(); + hash2.update(1).update(null); + + assertThat(hash).isNotEqualTo(hash2); + assertThat(hash).isNotEqualTo(hash3); + assertThat(hash2).isNotEqualTo(hash3); + } +} From 11e8e3696f7a0c17cefe2a467625f1cb2447d045 Mon Sep 17 00:00:00 2001 From: rbygrave Date: Wed, 11 Aug 2021 12:24:36 +1200 Subject: [PATCH 08/11] BindParams does not need encryptionKey in equals/hashCode --- .../src/main/java/io/ebeaninternal/api/BindParams.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 3a81f2f0a..b3da53833 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java @@ -410,8 +410,7 @@ public class BindParams implements Serializable { @Override public int hashCode() { int hc = getClass().hashCode(); - hc = hc * 92821 + (encryptionKey ? 0 : 1); - hc = hc * 92821 + (isInParam ? 0 : 1); +`` hc = hc * 92821 + (isInParam ? 0 : 1); hc = hc * 92821 + (isOutParam ? 0 : 1); hc = hc * 92821 + (type); hc = hc * 92821 + (inValue == null ? 0 : inValue.hashCode()); @@ -423,8 +422,7 @@ public class BindParams implements Serializable { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Param param = (Param) o; - return encryptionKey == param.encryptionKey && isInParam == param.isInParam && isOutParam == param.isOutParam - && type == param.type && Objects.equals(inValue, param.inValue); + return isInParam == param.isInParam && isOutParam == param.isOutParam && type == param.type && Objects.equals(inValue, param.inValue); } void queryBindHash(BindHash hash) { From fd2e542c0b90433140c41b3434cd0e84873f0643 Mon Sep 17 00:00:00 2001 From: rbygrave Date: Wed, 11 Aug 2021 12:43:58 +1200 Subject: [PATCH 09/11] Change BindHash from interface to implementation, Delete unused server persist BindValues --- .../java/io/ebeaninternal/api/BindHash.java | 42 ++++------ .../java/io/ebeaninternal/api/BindParams.java | 2 +- .../server/persist/BindValues.java | 81 ------------------- .../ebeaninternal/server/persist/Binder.java | 27 ------- .../server/querydefn/DefaultOrmQuery.java | 3 +- .../server/querydefn/HashCodeBindHash.java | 63 --------------- .../server/expression/RawExpressionTest.java | 4 +- ...odeBindHashTest.java => BindHashTest.java} | 13 +-- .../server/querydefn/DefaultOrmQueryTest.java | 3 +- 9 files changed, 28 insertions(+), 210 deletions(-) delete mode 100644 ebean-core/src/main/java/io/ebeaninternal/server/persist/BindValues.java delete mode 100644 ebean-core/src/main/java/io/ebeaninternal/server/querydefn/HashCodeBindHash.java rename ebean-core/src/test/java/io/ebeaninternal/server/querydefn/{HashCodeBindHashTest.java => BindHashTest.java} (67%) diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BindHash.java b/ebean-core/src/main/java/io/ebeaninternal/api/BindHash.java index d70c5f09d..b3ad8e49b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindHash.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindHash.java @@ -1,37 +1,29 @@ package io.ebeaninternal.api; +import java.util.ArrayList; +import java.util.List; + /** * BindHash implementation. - * - * @author Roland Praml, FOCONIS AG - * */ -public interface BindHash { +public class BindHash { - /** - * Update with boolean value. - */ - BindHash update(boolean boolValue); + private final List values = new ArrayList<>(); - /** - * Update with int value. - */ - BindHash update(int intValue); + public BindHash update(Object value) { + values.add(value); + return this; + } - /** - * Update with long value. - */ - BindHash update(long longValue); + @Override + public boolean equals(Object obj) { + return obj instanceof BindHash && ((BindHash) obj).values.equals(values); + } - /** - * Update with object value. - */ - BindHash update(Object value); + @Override + public int hashCode() { + return values.hashCode(); + } - /** - * finishes the hash. May be used to compute internal state. After finish, no - * update method must be called - */ - void finish(); } 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 b3da53833..74e7dfa23 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java @@ -410,7 +410,7 @@ public class BindParams implements Serializable { @Override public int hashCode() { int hc = getClass().hashCode(); -`` hc = hc * 92821 + (isInParam ? 0 : 1); + hc = hc * 92821 + (isInParam ? 0 : 1); hc = hc * 92821 + (isOutParam ? 0 : 1); hc = hc * 92821 + (type); hc = hc * 92821 + (inValue == null ? 0 : inValue.hashCode()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BindValues.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/BindValues.java deleted file mode 100644 index 6d71e8d79..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/BindValues.java +++ /dev/null @@ -1,81 +0,0 @@ -package io.ebeaninternal.server.persist; - -import java.util.ArrayList; - -/** - * Holds a list of bind values for binding to a PreparedStatement. - */ -class BindValues { - - private final ArrayList list = new ArrayList<>(); - - /** - * Create with a Binder. - */ - public BindValues() { - } - - /** - * Add a bind value with its JDBC datatype. - * - * @param value the bind value - * @param dbType the type as per java.sql.Types - */ - public void add(Object value, int dbType, String name) { - list.add(new Value(value, dbType, name)); - } - - /** - * List of bind values. - */ - public ArrayList values() { - return list; - } - - /** - * A Value has additionally the JDBC data type. - */ - public static class Value { - - private final Object value; - - private final int dbType; - - private final String name; - - /** - * Create the value. - */ - Value(Object value, int dbType, String name) { - this.value = value; - this.dbType = dbType; - this.name = name; - } - - /** - * Return the type as per java.sql.Types. - */ - public int getDbType() { - return dbType; - } - - /** - * Return the value. - */ - public Object getValue() { - return value; - } - - /** - * Return the property name. - */ - public String getName() { - return name; - } - - @Override - public String toString() { - return String.valueOf(value); - } - } -} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java b/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java index 1d94d7a81..600a7e21a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/persist/Binder.java @@ -77,33 +77,6 @@ public class Binder { return asOfStandardsBased; } - /** - * Bind the values to the Prepared Statement. - */ - public void bind(BindValues bindValues, DataBind dataBind, StringBuilder bindBuf) throws SQLException { - String logPrefix = ""; - ArrayList list = bindValues.values(); - for (BindValues.Value bindValue : list) { - Object val = bindValue.getValue(); - int dt = bindValue.getDbType(); - bindObject(dataBind, val, dt); - - if (bindBuf != null) { - bindBuf.append(logPrefix); - if (logPrefix.isEmpty()) { - logPrefix = ", "; - } - bindBuf.append(bindValue.getName()); - bindBuf.append("="); - if (isLob(dt)) { - bindBuf.append("[LOB]"); - } else { - bindBuf.append(val); - } - } - } - } - /** * Bind the parameters to the preparedStatement returning the bind log. */ 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 e4735e32b..865b3184b 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 @@ -1244,9 +1244,8 @@ 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 HashCodeBindHash(); + BindHash hash = new BindHash(); queryBindHash(hash); - hash.finish(); return new HashQuery(queryPlanKey, hash); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/HashCodeBindHash.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/HashCodeBindHash.java deleted file mode 100644 index 9bc9c60fc..000000000 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/HashCodeBindHash.java +++ /dev/null @@ -1,63 +0,0 @@ -package io.ebeaninternal.server.querydefn; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import io.ebeaninternal.api.BindHash; - -/** - * HashCode builder that uses Object.hashCode for computing bind-hashes. - * This is a fast and lightweight implementation, but may produce collisions. - * - * @author Roland Praml, FOCONIS AG - */ -public class HashCodeBindHash implements BindHash { - - private final List values = new ArrayList<>(); - private int hashCode; - - @Override - public BindHash update(int intValue) { - values.add(intValue); - hashCode = hashCode * 92821 + intValue; - return this; - } - - @Override - public BindHash update(long longValue) { - values.add(longValue); - hashCode = hashCode * 92821 + Long.hashCode(longValue); - return this; - } - - @Override - public BindHash update(boolean boolValue) { - values.add(boolValue); - hashCode = hashCode * 92821 + Boolean.hashCode(boolValue); - return this; - } - - @Override - public BindHash update(Object value) { - values.add(value); - hashCode = hashCode * 92821 + Objects.hashCode(value); - return this; - } - - @Override - public void finish() { - // nothing to do - } - - @Override - public boolean equals(Object obj) { - return obj instanceof HashCodeBindHash && ((HashCodeBindHash) obj).values.equals(values); - } - - @Override - public int hashCode() { - return hashCode; - } - -} 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 6c608472f..99c7d7eec 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 @@ -4,7 +4,6 @@ import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; import io.ebeaninternal.api.BindHash; -import io.ebeaninternal.server.querydefn.HashCodeBindHash; public class RawExpressionTest extends BaseExpressionTest { @@ -71,9 +70,8 @@ public class RawExpressionTest extends BaseExpressionTest { } private int getHash(RawExpression query) { - BindHash hash = new HashCodeBindHash(); + BindHash hash = new BindHash(); query.queryBindHash(hash); - hash.finish(); return hash.hashCode(); } } diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/HashCodeBindHashTest.java b/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/BindHashTest.java similarity index 67% rename from ebean-core/src/test/java/io/ebeaninternal/server/querydefn/HashCodeBindHashTest.java rename to ebean-core/src/test/java/io/ebeaninternal/server/querydefn/BindHashTest.java index dea0a2e0c..a74f4432f 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/HashCodeBindHashTest.java +++ b/ebean-core/src/test/java/io/ebeaninternal/server/querydefn/BindHashTest.java @@ -1,18 +1,19 @@ package io.ebeaninternal.server.querydefn; +import io.ebeaninternal.api.BindHash; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; -public class HashCodeBindHashTest { +public class BindHashTest { @Test public void update_with_null() { - HashCodeBindHash hash = new HashCodeBindHash(); + BindHash hash = new BindHash(); hash.update(1).update(null).update("hello"); - HashCodeBindHash hash2 = new HashCodeBindHash(); + BindHash hash2 = new BindHash(); hash2.update(1).update(null).update("hello"); assertThat(hash).isEqualTo(hash2); @@ -21,13 +22,13 @@ public class HashCodeBindHashTest { @Test public void notEqual() { - HashCodeBindHash hash = new HashCodeBindHash(); + BindHash hash = new BindHash(); hash.update(1).update(null).update("hello"); - HashCodeBindHash hash2 = new HashCodeBindHash(); + BindHash hash2 = new BindHash(); hash2.update(1).update("hello"); - HashCodeBindHash hash3 = new HashCodeBindHash(); + BindHash hash3 = new BindHash(); hash2.update(1).update(null); assertThat(hash).isNotEqualTo(hash2); 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 cb1738ba8..999459892 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 @@ -113,9 +113,8 @@ public class DefaultOrmQueryTest extends BaseTestCase { } private int getHash(DefaultOrmQuery query) { - BindHash hash = new HashCodeBindHash(); + BindHash hash = new BindHash(); query.queryBindHash(hash); - hash.finish(); return hash.hashCode(); } } From ec7c7048db86a677e85d4d066cd76f77cd1cc23a Mon Sep 17 00:00:00 2001 From: rbygrave Date: Wed, 11 Aug 2021 13:19:44 +1200 Subject: [PATCH 10/11] 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; } } From 144a3b54bb51d804712a086a0e1921eceb1faf86 Mon Sep 17 00:00:00 2001 From: rbygrave Date: Wed, 11 Aug 2021 13:25:04 +1200 Subject: [PATCH 11/11] Refactor rename method queryBindHash() to queryBindKey() --- .../java/io/ebeaninternal/api/SpiExpression.java | 4 ++-- .../main/java/io/ebeaninternal/api/SpiQuery.java | 8 +++----- .../server/expression/AbstractTextExpression.java | 2 +- .../server/expression/AllEqualsExpression.java | 2 +- .../server/expression/ArrayContainsExpression.java | 2 +- .../server/expression/ArrayIsEmptyExpression.java | 2 +- .../server/expression/BetweenExpression.java | 2 +- .../expression/BetweenPropertyExpression.java | 2 +- .../server/expression/BitwiseExpression.java | 2 +- .../expression/CaseInsensitiveEqualExpression.java | 2 +- .../expression/DefaultExampleExpression.java | 7 ++----- .../server/expression/DefaultExpressionList.java | 7 ++----- .../server/expression/ExistsQueryExpression.java | 4 ++-- .../server/expression/IdExpression.java | 2 +- .../server/expression/IdInExpression.java | 2 +- .../server/expression/InExpression.java | 2 +- .../server/expression/InPairsExpression.java | 2 +- .../server/expression/InQueryExpression.java | 4 ++-- .../server/expression/InRangeExpression.java | 2 +- .../server/expression/IsEmptyExpression.java | 2 +- .../server/expression/JsonPathExpression.java | 2 +- .../server/expression/JunctionExpression.java | 4 ++-- .../server/expression/LikeExpression.java | 2 +- .../server/expression/LogicExpression.java | 2 +- .../server/expression/NativeILikeExpression.java | 2 +- .../expression/NestedPathWrapperExpression.java | 4 ++-- .../server/expression/NoopExpression.java | 2 +- .../server/expression/NotExpression.java | 4 ++-- .../server/expression/NullExpression.java | 2 +- .../server/expression/RawExpression.java | 2 +- .../server/expression/SimpleExpression.java | 2 +- .../server/querydefn/DefaultOrmQuery.java | 14 ++++---------- .../server/expression/RawExpressionTest.java | 2 +- .../server/querydefn/DefaultOrmQueryTest.java | 2 +- 34 files changed, 47 insertions(+), 61 deletions(-) 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 00879e15d..8fe986259 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpression.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiExpression.java @@ -54,9 +54,9 @@ public interface SpiExpression extends Expression { void queryPlanHash(StringBuilder builder); /** - * Return the hash value for the values that will be bound. + * Build the key for bind values of the query. */ - void queryBindHash(BindValuesKey key); + void queryBindKey(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 2eae4506b..5ba0b6eeb 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java @@ -629,13 +629,11 @@ public interface SpiQuery extends Query, SpiQueryFetch, TxnProfileEventCod CQueryPlanKey prepare(SpiOrmQueryRequest request); /** - * Calculate a hash based on the bind values used in the query. + * Build the key for the bind values used in the query (for l2 query cache). *

- * Combined with queryPlanHash() to return getQueryHash (a unique hash for a - * query). - *

+ * Combined with queryPlanHash() to return queryHash (a unique key for a query). */ - void queryBindHash(BindValuesKey key); + void queryBindKey(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 2a411675e..363bcb08d 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 @@ -38,7 +38,7 @@ public abstract class AbstractTextExpression extends AbstractExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(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 be0791a12..56761dcf2 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 @@ -123,7 +123,7 @@ class AllEqualsExpression extends NonPrepareExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(propMap.size()); for (Object value : propMap.values()) { key.add(value); 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 1ca15f8f7..7a9e903f6 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 @@ -50,7 +50,7 @@ public class ArrayContainsExpression extends AbstractExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(values.length); for (Object value : values) { 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 5b58be0b4..f9cd530c8 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 @@ -34,7 +34,7 @@ public class ArrayIsEmptyExpression extends AbstractExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(empty); } 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 27e7a5909..ed3d58d8b 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 @@ -50,7 +50,7 @@ class BetweenExpression extends AbstractExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(low()).add(high()); } 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 cdc199d70..55b08380d 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 @@ -96,7 +96,7 @@ class BetweenPropertyExpression extends NonPrepareExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(val()); } 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 20119b370..460af37ec 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 @@ -40,7 +40,7 @@ class BitwiseExpression extends AbstractExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(flags).add(match); } 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 ecefbe08a..3a6224d9c 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 @@ -70,7 +70,7 @@ class CaseInsensitiveEqualExpression extends AbstractValueExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(val()); } 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 3c0e268b6..e6353edd0 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 @@ -238,14 +238,11 @@ public class DefaultExampleExpression implements SpiExpression, ExampleExpressio builder.append("]"); } - /** - * Return a hash for the actual bind values used. - */ @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(list.size()); for (SpiExpression expr : list) { - expr.queryBindHash(key); + expr.queryBindKey(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 6c47467f2..97899f091 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 @@ -675,14 +675,11 @@ public class DefaultExpressionList implements SpiExpressionList { builder.append("]"); } - /** - * Calculate a hash based on the expressions. - */ @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(list.size()); for (SpiExpression expr : list) { - expr.queryBindHash(key); + expr.queryBindKey(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 9f1d1830d..4ba939066 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 @@ -92,8 +92,8 @@ class ExistsQueryExpression implements SpiExpression, UnsupportedDocStoreExpress } @Override - public void queryBindHash(BindValuesKey key) { - subQuery.queryBindHash(key); + public void queryBindKey(BindValuesKey key) { + subQuery.queryBindKey(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 5c20e66b3..94cab6de7 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 @@ -78,7 +78,7 @@ class IdExpression extends NonPrepareExpression implements SpiExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(value); } 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 8dbceb419..edf56b443 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 @@ -134,7 +134,7 @@ public class IdInExpression extends NonPrepareExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(idCollection.size()); for (Object elem : idCollection) { 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 bbc2bf7eb..0bc5a4588 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 @@ -177,7 +177,7 @@ class InExpression extends AbstractExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(bindValues.size()); for (Object bindValue : bindValues) { 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 6f2aae853..e5bd27413 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 @@ -125,7 +125,7 @@ class InPairsExpression extends AbstractExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(entries.size()); for (Pairs.Entry entry : entries) { 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 769f83b84..48647d0c2 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 @@ -73,8 +73,8 @@ class InQueryExpression extends AbstractExpression implements UnsupportedDocStor } @Override - public void queryBindHash(BindValuesKey key) { - subQuery.queryBindHash(key); + public void queryBindKey(BindValuesKey key) { + subQuery.queryBindKey(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 c8a8dc96f..04b242ba8 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 @@ -48,7 +48,7 @@ class InRangeExpression extends AbstractExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(low()).add(high()); } 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 4ca943619..d6b878bfa 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 @@ -104,7 +104,7 @@ class IsEmptyExpression extends AbstractExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(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 d501068d9..1d954dcc1 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 @@ -84,7 +84,7 @@ class JsonPathExpression extends AbstractExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(value).add(upperValue); } 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 75c17ba19..a253bbb2b 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 @@ -216,9 +216,9 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { for (SpiExpression expr : exprList.internalList()) { - expr.queryBindHash(key); + expr.queryBindKey(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 355cdfa3c..f40501929 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 @@ -71,7 +71,7 @@ class LikeExpression extends AbstractValueExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(strValue()); } 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 d6f7894e0..a66e2e88a 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 @@ -169,7 +169,7 @@ abstract class LogicExpression implements SpiExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(expOne).add(expTwo); } 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 efb77d37a..f64933df5 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 @@ -55,7 +55,7 @@ class NativeILikeExpression extends AbstractExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(val); } 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 0931486af..b76bfef4d 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 @@ -80,8 +80,8 @@ class NestedPathWrapperExpression implements SpiExpression { } @Override - public void queryBindHash(BindValuesKey key) { - delegate.queryBindHash(key); + public void queryBindKey(BindValuesKey key) { + delegate.queryBindKey(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 0a8a67f24..6c8d709e7 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 @@ -75,7 +75,7 @@ class NoopExpression implements SpiExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(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 4d6a4aba1..462e60d9e 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 @@ -100,8 +100,8 @@ final class NotExpression implements SpiExpression { } @Override - public void queryBindHash(BindValuesKey key) { - exp.queryBindHash(key); + public void queryBindKey(BindValuesKey key) { + exp.queryBindKey(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 1ec123fda..2808acce7 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 @@ -95,7 +95,7 @@ class NullExpression extends AbstractExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(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 080f541b7..9e1c3e8dc 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 @@ -74,7 +74,7 @@ class RawExpression extends NonPrepareExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(values.length); for (Object value : values) { 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 3e0db8707..bc23b84f2 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 @@ -122,7 +122,7 @@ public class SimpleExpression extends AbstractValueExpression { } @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(value()); } 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 4508458b8..834abb856 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 @@ -1218,17 +1218,11 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { } } - /** - * Calculate a hash based on the bind values used in the query. - *

- * Used with queryPlanHash() to get a unique hash for a query. - *

- */ @Override - public void queryBindHash(BindValuesKey key) { + public void queryBindKey(BindValuesKey key) { key.add(id); - if (whereExpressions != null) whereExpressions.queryBindHash(key); - if (havingExpressions != null) havingExpressions.queryBindHash(key); + if (whereExpressions != null) whereExpressions.queryBindKey(key); + if (havingExpressions != null) havingExpressions.queryBindKey(key); if (bindParams != null) bindParams.queryBindHash(key); key.add(asOf).add(versionsStart).add(versionsEnd); } @@ -1245,7 +1239,7 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { // calculateQueryPlanHash is called just after potential AutoTune tuning // so queryPlanHash is calculated well before this method is called BindValuesKey bindKey = new BindValuesKey(); - queryBindHash(bindKey); + queryBindKey(bindKey); return new HashQuery(queryPlanKey, bindKey); } 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 3568a3bf6..eb12ff460 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 @@ -71,7 +71,7 @@ public class RawExpressionTest extends BaseExpressionTest { private BindValuesKey bindKey(RawExpression query) { BindValuesKey bindValuesKey = new BindValuesKey(); - query.queryBindHash(bindValuesKey); + query.queryBindKey(bindValuesKey); return bindValuesKey; } } 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 b3b657c4a..b2b4902ad 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 @@ -114,7 +114,7 @@ public class DefaultOrmQueryTest extends BaseTestCase { private BindValuesKey bindKey(DefaultOrmQuery query) { BindValuesKey key = new BindValuesKey(); - query.queryBindHash(key); + query.queryBindKey(key); return key; } }