This is an automated email from the ASF dual-hosted git repository. rubenql pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push: new 6302e6fa85 [CALCITE-5277] Make EnumerableRelImplementor stashedParameters order deterministic to increase BINDABLE_CACHE hit rate 6302e6fa85 is described below commit 6302e6fa85be1d8d9efd8277f6a2bf43195776ac Author: rubenada <rube...@gmail.com> AuthorDate: Thu Sep 8 10:29:05 2022 +0100 [CALCITE-5277] Make EnumerableRelImplementor stashedParameters order deterministic to increase BINDABLE_CACHE hit rate --- .../adapter/enumerable/EnumerableRelImplementor.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java index 34386cd030..2c82febd37 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java @@ -50,6 +50,7 @@ import org.apache.calcite.sql.validate.SqlConformanceEnum; import org.apache.calcite.util.BuiltInMethod; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Equivalence; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; @@ -64,7 +65,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.IdentityHashMap; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -80,8 +81,10 @@ public class EnumerableRelImplementor extends JavaRelImplementor { public final Map<String, Object> map; private final Map<String, RexToLixTranslator.InputGetter> corrVars = new HashMap<>(); - private final IdentityHashMap<Object, ParameterExpression> stashedParameters = - new IdentityHashMap<>(); + private static final Equivalence<Object> IDENTITY = Equivalence.identity(); + // A combination of IdentityHashMap + LinkedHashMap to ensure deterministic order + private final Map<Equivalence.Wrapper<Object>, ParameterExpression> stashedParameters = + new LinkedHashMap<>(); @SuppressWarnings("methodref.receiver.bound.invalid") protected final Function1<String, RexToLixTranslator.InputGetter> allCorrelateVariables = @@ -439,7 +442,8 @@ public class EnumerableRelImplementor extends JavaRelImplementor { || input instanceof Double) { return Expressions.constant(input, clazz); } - ParameterExpression cached = stashedParameters.get(input); + final Equivalence.Wrapper<Object> key = IDENTITY.wrap(input); + ParameterExpression cached = stashedParameters.get(key); if (cached != null) { return cached; } @@ -448,7 +452,7 @@ public class EnumerableRelImplementor extends JavaRelImplementor { final String name = "v" + map.size() + "stashed"; final ParameterExpression x = Expressions.variable(clazz, name); map.put(name, input); - stashedParameters.put(input, x); + stashedParameters.put(key, x); return x; }