From 040b2120fcfac9df9c453f7ec9415b0c573ba8c9 Mon Sep 17 00:00:00 2001 From: dssysolyatin Date: Fri, 7 Nov 2025 16:16:38 +0200 Subject: [PATCH] [CALCITE-7280] Introduce RelNode.copy, which can copy variables set --- .../calcite/adapter/arrow/ArrowFilter.java | 8 ++++- .../calcite/adapter/arrow/ArrowProject.java | 7 ++++- .../adapter/cassandra/CassandraFilter.java | 6 +++- .../adapter/cassandra/CassandraProject.java | 7 ++++- .../enumerable/EnumerableAsofJoin.java | 4 +-- .../EnumerableBatchNestedLoopJoin.java | 4 +-- .../adapter/enumerable/EnumerableFilter.java | 7 ++++- .../enumerable/EnumerableHashJoin.java | 6 ++-- .../enumerable/EnumerableMergeJoin.java | 4 +-- .../enumerable/EnumerableNestedLoopJoin.java | 4 +-- .../adapter/enumerable/EnumerableProject.java | 7 ++++- .../calcite/adapter/jdbc/JdbcRules.java | 12 ++++---- .../apache/calcite/interpreter/Bindables.java | 8 +++-- .../plan/volcano/AbstractConverter.java | 8 ++++- .../apache/calcite/rel/AbstractRelNode.java | 5 ++-- .../java/org/apache/calcite/rel/RelNode.java | 23 +++++++++++++- .../apache/calcite/rel/core/Aggregate.java | 3 +- .../apache/calcite/rel/core/Correlate.java | 12 ++++++-- .../org/apache/calcite/rel/core/Filter.java | 18 ++++++++--- .../org/apache/calcite/rel/core/Join.java | 29 ++++++++++++++++-- .../org/apache/calcite/rel/core/Project.java | 30 +++++++++++++++++-- .../calcite/rel/logical/LogicalAsofJoin.java | 6 ++-- .../calcite/rel/logical/LogicalFilter.java | 4 +-- .../calcite/rel/logical/LogicalJoin.java | 5 ++-- .../calcite/rel/logical/LogicalProject.java | 2 +- .../sql2rel/RelStructuredTypeFlattener.java | 2 +- .../plan/volcano/TraitPropagationTest.java | 7 ++++- .../apache/calcite/test/RelOptRulesTest.java | 9 ++++-- .../elasticsearch/ElasticsearchFilter.java | 8 ++++- .../elasticsearch/ElasticsearchProject.java | 7 ++++- .../adapter/geode/rel/GeodeFilter.java | 5 +++- .../adapter/geode/rel/GeodeProject.java | 7 ++++- .../calcite/adapter/innodb/InnodbFilter.java | 8 ++++- .../calcite/adapter/innodb/InnodbProject.java | 7 ++++- .../calcite/adapter/mongodb/MongoFilter.java | 7 ++++- .../calcite/adapter/mongodb/MongoProject.java | 7 ++++- .../apache/calcite/adapter/pig/PigFilter.java | 7 ++++- .../apache/calcite/adapter/pig/PigJoin.java | 10 +++++-- .../calcite/adapter/pig/PigProject.java | 7 ++++- 39 files changed, 261 insertions(+), 66 deletions(-) diff --git a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowFilter.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowFilter.java index 9774318ea925..64d25bd9a3b0 100644 --- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowFilter.java +++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowFilter.java @@ -21,11 +21,15 @@ import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Filter; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rex.RexNode; import java.util.List; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; @@ -51,7 +55,9 @@ class ArrowFilter extends Filter implements ArrowRel { return requireNonNull(cost, "cost").multiplyBy(0.1); } - @Override public ArrowFilter copy(RelTraitSet traitSet, RelNode input, RexNode condition) { + @Override public ArrowFilter copy(RelTraitSet traitSet, RelNode input, RexNode condition, + Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new ArrowFilter(getCluster(), traitSet, input, condition); } diff --git a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowProject.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowProject.java index 8fee390d543f..694a122a2143 100644 --- a/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowProject.java +++ b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowProject.java @@ -21,6 +21,7 @@ import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Project; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; @@ -34,6 +35,9 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; @@ -52,7 +56,8 @@ class ArrowProject extends Project implements ArrowRel { } @Override public Project copy(RelTraitSet traitSet, RelNode input, - List projects, RelDataType rowType) { + List projects, RelDataType rowType, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new ArrowProject(getCluster(), traitSet, input, projects, rowType); } diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java index f357079d61f1..444baed5baeb 100644 --- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java +++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraFilter.java @@ -25,6 +25,7 @@ import org.apache.calcite.rel.RelCollations; import org.apache.calcite.rel.RelFieldCollation; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Filter; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; @@ -48,6 +49,8 @@ import java.util.List; import java.util.Set; +import static com.google.common.base.Preconditions.checkArgument; + import static org.apache.calcite.util.DateTimeStringUtils.ISO_DATETIME_FRACTIONAL_SECOND_FORMAT; import static org.apache.calcite.util.DateTimeStringUtils.getDateFormatter; @@ -98,7 +101,8 @@ public CassandraFilter( } @Override public CassandraFilter copy(RelTraitSet traitSet, RelNode input, - RexNode condition) { + RexNode condition, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new CassandraFilter(getCluster(), traitSet, input, condition, partitionKeys, clusteringKeys, implicitFieldCollations); } diff --git a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java index 0ee42eec05ae..e34dac2cd9a7 100644 --- a/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java +++ b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java @@ -21,6 +21,7 @@ import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Project; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; @@ -35,6 +36,9 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; @@ -51,7 +55,8 @@ public CassandraProject(RelOptCluster cluster, RelTraitSet traitSet, } @Override public Project copy(RelTraitSet traitSet, RelNode input, - List projects, RelDataType rowType) { + List projects, RelDataType rowType, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new CassandraProject(getCluster(), traitSet, input, projects, rowType); } diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAsofJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAsofJoin.java index d7cb7b4cdb7e..d727910a0bdc 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAsofJoin.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAsofJoin.java @@ -96,8 +96,8 @@ public static EnumerableAsofJoin create( } @Override public EnumerableAsofJoin copy(RelTraitSet traitSet, RexNode condition, - RelNode left, RelNode right, JoinRelType joinType, - boolean semiJoinDone) { + RelNode left, RelNode right, Set variablesSet, JoinRelType joinType, + boolean semiJoinDone) { // This method does not know about the matchCondition, so it should not be called throw new RuntimeException("This method should not be called"); } diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java index 11a3620c8c2e..e3d62f590b2b 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java @@ -113,8 +113,8 @@ public static EnumerableBatchNestedLoopJoin create( } @Override public EnumerableBatchNestedLoopJoin copy(RelTraitSet traitSet, - RexNode condition, RelNode left, RelNode right, JoinRelType joinType, - boolean semiJoinDone) { + RexNode condition, RelNode left, RelNode right, Set variablesSet, + JoinRelType joinType, boolean semiJoinDone) { return new EnumerableBatchNestedLoopJoin(getCluster(), traitSet, left, right, condition, variablesSet, requiredColumns, joinType); } diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java index f4943ce8917c..15494f6b6100 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java @@ -23,6 +23,7 @@ import org.apache.calcite.rel.RelCollations; import org.apache.calcite.rel.RelDistributionTraitDef; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Filter; import org.apache.calcite.rel.metadata.RelMdCollation; import org.apache.calcite.rel.metadata.RelMdDistribution; @@ -35,6 +36,9 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.util.List; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; /** Implementation of {@link org.apache.calcite.rel.core.Filter} in * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */ @@ -69,7 +73,8 @@ public static EnumerableFilter create(final RelNode input, } @Override public EnumerableFilter copy(RelTraitSet traitSet, RelNode input, - RexNode condition) { + RexNode condition, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new EnumerableFilter(getCluster(), traitSet, input, condition); } diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java index 8bd9ffbf08db..fbf6a4507ce7 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java @@ -98,9 +98,9 @@ public static EnumerableHashJoin create( variablesSet, joinType); } - @Override public EnumerableHashJoin copy(RelTraitSet traitSet, RexNode condition, - RelNode left, RelNode right, JoinRelType joinType, - boolean semiJoinDone) { + @Override public EnumerableHashJoin copy(RelTraitSet traitSet, + RexNode condition, RelNode left, RelNode right, Set variablesSet, + JoinRelType joinType, boolean semiJoinDone) { return new EnumerableHashJoin(getCluster(), traitSet, left, right, condition, variablesSet, joinType); } diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java index 838e37064f45..0c5782191c3b 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java @@ -416,8 +416,8 @@ public static EnumerableMergeJoin create(RelNode left, RelNode right, } @Override public EnumerableMergeJoin copy(RelTraitSet traitSet, - RexNode condition, RelNode left, RelNode right, JoinRelType joinType, - boolean semiJoinDone) { + RexNode condition, RelNode left, RelNode right, Set variablesSet, + JoinRelType joinType, boolean semiJoinDone) { return new EnumerableMergeJoin(getCluster(), traitSet, left, right, condition, variablesSet, joinType); } diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java index de539ad574cf..f9743eab7951 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java @@ -64,8 +64,8 @@ protected EnumerableNestedLoopJoin(RelOptCluster cluster, RelTraitSet traits, } @Override public EnumerableNestedLoopJoin copy(RelTraitSet traitSet, - RexNode condition, RelNode left, RelNode right, JoinRelType joinType, - boolean semiJoinDone) { + RexNode condition, RelNode left, RelNode right, Set variablesSet, + JoinRelType joinType, boolean semiJoinDone) { return new EnumerableNestedLoopJoin(getCluster(), traitSet, left, right, condition, variablesSet, joinType); } diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java index 8b4c0c5ded53..5b2d22ad8710 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java @@ -20,6 +20,7 @@ import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelCollationTraitDef; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Project; import org.apache.calcite.rel.metadata.RelMdCollation; import org.apache.calcite.rel.metadata.RelMetadataQuery; @@ -34,6 +35,9 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.util.List; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; /** Implementation of {@link org.apache.calcite.rel.core.Project} in * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */ @@ -81,7 +85,8 @@ public static EnumerableProject create(final RelNode input, } @Override public EnumerableProject copy(RelTraitSet traitSet, RelNode input, - List projects, RelDataType rowType) { + List projects, RelDataType rowType, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new EnumerableProject(getCluster(), traitSet, input, projects, rowType); } diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java index 9a35cf7cce2d..0329046a98dd 100644 --- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java +++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java @@ -401,9 +401,9 @@ protected JdbcJoin( CorrelationId.setOf(variablesStopped), joinType); } - @Override public JdbcJoin copy(RelTraitSet traitSet, RexNode condition, - RelNode left, RelNode right, JoinRelType joinType, - boolean semiJoinDone) { + @Override public JdbcJoin copy(RelTraitSet traitSet, + RexNode condition, RelNode left, RelNode right, Set variablesSet, + JoinRelType joinType, boolean semiJoinDone) { try { return new JdbcJoin(getCluster(), traitSet, left, right, condition, variablesSet, joinType); @@ -559,7 +559,8 @@ public JdbcProject(RelOptCluster cluster, RelTraitSet traitSet, } @Override public JdbcProject copy(RelTraitSet traitSet, RelNode input, - List projects, RelDataType rowType) { + List projects, RelDataType rowType, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new JdbcProject(getCluster(), traitSet, input, projects, rowType); } @@ -627,7 +628,8 @@ public JdbcFilter( } @Override public JdbcFilter copy(RelTraitSet traitSet, RelNode input, - RexNode condition) { + RexNode condition, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new JdbcFilter(getCluster(), traitSet, input, condition); } diff --git a/core/src/main/java/org/apache/calcite/interpreter/Bindables.java b/core/src/main/java/org/apache/calcite/interpreter/Bindables.java index f3a4d22ba12e..9dd487426c50 100644 --- a/core/src/main/java/org/apache/calcite/interpreter/Bindables.java +++ b/core/src/main/java/org/apache/calcite/interpreter/Bindables.java @@ -358,7 +358,8 @@ public static BindableFilter create(final RelNode input, } @Override public BindableFilter copy(RelTraitSet traitSet, RelNode input, - RexNode condition) { + RexNode condition, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new BindableFilter(getCluster(), traitSet, input, condition); } @@ -421,7 +422,8 @@ public BindableProject(RelOptCluster cluster, RelTraitSet traitSet, } @Override public BindableProject copy(RelTraitSet traitSet, RelNode input, - List projects, RelDataType rowType) { + List projects, RelDataType rowType, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new BindableProject(getCluster(), traitSet, input, projects, rowType); } @@ -550,7 +552,7 @@ protected BindableJoin(RelOptCluster cluster, RelTraitSet traitSet, } @Override public BindableJoin copy(RelTraitSet traitSet, RexNode conditionExpr, - RelNode left, RelNode right, JoinRelType joinType, + RelNode left, RelNode right, Set variablesSet, JoinRelType joinType, boolean semiJoinDone) { return new BindableJoin(getCluster(), traitSet, left, right, conditionExpr, variablesSet, joinType); diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java b/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java index 23f85c888ec9..e8ee127a6419 100644 --- a/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java +++ b/core/src/main/java/org/apache/calcite/plan/volcano/AbstractConverter.java @@ -27,6 +27,7 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.RelWriter; import org.apache.calcite.rel.convert.ConverterImpl; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.tools.RelBuilderFactory; @@ -34,6 +35,9 @@ import org.immutables.value.Value; import java.util.List; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; /** * Converts a relational expression to any given output convention. @@ -64,7 +68,9 @@ public AbstractConverter( //~ Methods ---------------------------------------------------------------- - @Override public RelNode copy(RelTraitSet traitSet, List inputs) { + @Override public RelNode copy(RelTraitSet traitSet, List inputs, + Set variableSet) { + checkArgument(variableSet.isEmpty()); return new AbstractConverter( getCluster(), (RelSubset) sole(inputs), diff --git a/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java b/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java index 0786798474d8..193694b9897c 100644 --- a/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java +++ b/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java @@ -103,12 +103,13 @@ protected AbstractRelNode(RelOptCluster cluster, RelTraitSet traitSet) { //~ Methods ---------------------------------------------------------------- - @Override public RelNode copy(RelTraitSet traitSet, List inputs) { + @Override public RelNode copy(RelTraitSet traitSet, List inputs, + Set variableSet) { // Note that empty set equals empty set, so relational expressions // with zero inputs do not generally need to implement their own copy // method. if (getInputs().equals(inputs) - && traitSet == getTraitSet()) { + && traitSet == getTraitSet() && variableSet == getVariablesSet()) { return this; } throw new AssertionError("Relational expression should override copy. " diff --git a/core/src/main/java/org/apache/calcite/rel/RelNode.java b/core/src/main/java/org/apache/calcite/rel/RelNode.java index 5eeece98223f..21d3a0f75a3f 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelNode.java +++ b/core/src/main/java/org/apache/calcite/rel/RelNode.java @@ -371,9 +371,30 @@ void replaceInput( * @return Copy of this relational expression, substituting traits and * inputs */ + default RelNode copy( + RelTraitSet traitSet, + List inputs) { + return copy(traitSet, inputs, getVariablesSet()); + } + + /** + * Creates a copy of this relational expression, perhaps changing traits and + * inputs and variable set. + * + *

Sub-classes with other important attributes are encouraged to create + * variants of this method with more parameters. + * + * @param traitSet Trait set + * @param inputs Inputs + * @param variablesSet the variables that are set in this relational + * expression + * @return Copy of this relational expression, substituting traits and + * inputs + */ RelNode copy( RelTraitSet traitSet, - List inputs); + List inputs, + Set variablesSet); /** * Registers any special rules specific to this kind of relational diff --git a/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java b/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java index c019d53e9909..942806646220 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Aggregate.java @@ -233,7 +233,8 @@ protected Aggregate(RelInput input) { //~ Methods ---------------------------------------------------------------- @Override public final RelNode copy(RelTraitSet traitSet, - List inputs) { + List inputs, Set variableSet) { + assert variableSet.isEmpty(); return copy(traitSet, sole(inputs), groupSet, groupSets, aggCalls); } diff --git a/core/src/main/java/org/apache/calcite/rel/core/Correlate.java b/core/src/main/java/org/apache/calcite/rel/core/Correlate.java index 752dd9bf15a2..0f0254a606a5 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Correlate.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Correlate.java @@ -35,12 +35,15 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; import org.checkerframework.checker.nullness.qual.Nullable; import java.util.List; import java.util.Set; +import static com.google.common.base.Preconditions.checkArgument; + import static java.util.Objects.requireNonNull; /** @@ -147,12 +150,15 @@ protected Correlate(RelInput input) { && RelOptUtil.notContainsCorrelation(left, correlationId, litmus); } - @Override public Correlate copy(RelTraitSet traitSet, List inputs) { - assert inputs.size() == 2; + @Override public Correlate copy(RelTraitSet traitSet, List inputs, + Set variablesSet) { + checkArgument(inputs.size() == 2); + checkArgument(variablesSet.size() == 1); + return copy(traitSet, inputs.get(0), inputs.get(1), - correlationId, + requireNonNull(Iterables.getOnlyElement(variablesSet)), requiredColumns, joinType); } diff --git a/core/src/main/java/org/apache/calcite/rel/core/Filter.java b/core/src/main/java/org/apache/calcite/rel/core/Filter.java index 27aafd375285..7c526fb984b2 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Filter.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Filter.java @@ -46,6 +46,7 @@ import java.util.List; import java.util.Objects; +import java.util.Set; import static java.util.Objects.requireNonNull; @@ -120,12 +121,21 @@ protected Filter(RelInput input) { //~ Methods ---------------------------------------------------------------- @Override public final RelNode copy(RelTraitSet traitSet, - List inputs) { - return copy(traitSet, sole(inputs), getCondition()); + List inputs, Set variablesSet) { + return copy(traitSet, sole(inputs), getCondition(), variablesSet); } - public abstract Filter copy(RelTraitSet traitSet, RelNode input, - RexNode condition); + public Filter copy(RelTraitSet traitSet, RelNode input, + RexNode condition) { + return copy(traitSet, input, condition, getVariablesSet()); + } + + public Filter copy(RelTraitSet traitSet, RelNode input, + RexNode condition, Set variablesSet) { + // This method cannot be abstract because it would break compatibility + throw new UnsupportedOperationException( + "Must implement copy in " + getClass().getName()); + } @Override public RelNode accept(RexShuttle shuttle) { RexNode condition = shuttle.apply(this.condition); diff --git a/core/src/main/java/org/apache/calcite/rel/core/Join.java b/core/src/main/java/org/apache/calcite/rel/core/Join.java index 8016e9f36a6c..13f5c9e0324e 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Join.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Join.java @@ -311,9 +311,10 @@ public static RelDataType createJoinType( fieldNameList, systemFieldList); } - @Override public Join copy(RelTraitSet traitSet, List inputs) { + @Override public Join copy(RelTraitSet traitSet, List inputs, + Set variablesSet) { assert inputs.size() == 2; - return copy(traitSet, getCondition(), inputs.get(0), inputs.get(1), + return copy(traitSet, getCondition(), inputs.get(0), inputs.get(1), variablesSet, joinType, isSemiJoinDone()); } @@ -332,8 +333,30 @@ public static RelDataType createJoinType( * semi-join * @return Copy of this join */ + public final Join copy(RelTraitSet traitSet, RexNode conditionExpr, + RelNode left, RelNode right, JoinRelType joinType, boolean semiJoinDone) { + return copy(traitSet, conditionExpr, left, right, getVariablesSet(), joinType, semiJoinDone); + } + + /** + * Creates a copy of this join, overriding condition, system fields and + * inputs. + * + *

General contract as {@link RelNode#copy}. + * + * @param traitSet Traits + * @param conditionExpr Condition + * @param left Left input + * @param right Right input + * @param joinType Join type + * @param variablesSet the variables that are set in this relational expression + * @param semiJoinDone Whether this join has been translated to a + * semi-join + * @return Copy of this join + */ public abstract Join copy(RelTraitSet traitSet, RexNode conditionExpr, - RelNode left, RelNode right, JoinRelType joinType, boolean semiJoinDone); + RelNode left, RelNode right, Set variablesSet, JoinRelType joinType, + boolean semiJoinDone); /** * Analyzes the join condition. diff --git a/core/src/main/java/org/apache/calcite/rel/core/Project.java b/core/src/main/java/org/apache/calcite/rel/core/Project.java index 1de67c9228f0..3a35e2650455 100644 --- a/core/src/main/java/org/apache/calcite/rel/core/Project.java +++ b/core/src/main/java/org/apache/calcite/rel/core/Project.java @@ -150,7 +150,7 @@ protected Project(RelInput input) { //~ Methods ---------------------------------------------------------------- @Override public final RelNode copy(RelTraitSet traitSet, - List inputs) { + List inputs, Set variablesSet) { return copy(traitSet, sole(inputs), exps, getRowType()); } @@ -167,8 +167,32 @@ protected Project(RelInput input) { * * @see #copy(RelTraitSet, List) */ - public abstract Project copy(RelTraitSet traitSet, RelNode input, - List projects, RelDataType rowType); + public final Project copy(RelTraitSet traitSet, RelNode input, + List projects, RelDataType rowType) { + return copy(traitSet, input, projects, rowType, variablesSet); + } + + /** + * Copies a project. + * + * @param traitSet Traits + * @param input Input + * @param projects Project expressions + * @param rowType Output row type + * @param variablesSet the variables that are set in this relational + * expression + * @return New {@code Project} if any parameter differs from the value of this + * {@code Project}, or just {@code this} if all the parameters are + * the same + * + * @see #copy(RelTraitSet, List, Set) + */ + public Project copy(RelTraitSet traitSet, RelNode input, + List projects, RelDataType rowType, Set variablesSet) { + // This method cannot be abstract because it would break compatibility + throw new UnsupportedOperationException( + "Must implement copy in " + getClass().getName()); + } @Deprecated // to be removed before 2.0 public Project copy(RelTraitSet traitSet, RelNode input, diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalAsofJoin.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalAsofJoin.java index f6c31282fdb0..f3e717e694dd 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalAsofJoin.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalAsofJoin.java @@ -23,6 +23,7 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.RelShuttle; import org.apache.calcite.rel.core.AsofJoin; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Join; import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.hint.RelHint; @@ -37,6 +38,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Set; import static java.util.Objects.requireNonNull; @@ -137,8 +139,8 @@ public LogicalAsofJoin copy( return systemFieldList; } - @Override public Join copy( - RelTraitSet traitSet, RexNode conditionExpr, RelNode left, RelNode right, + @Override public LogicalAsofJoin copy(RelTraitSet traitSet, + RexNode condition, RelNode left, RelNode right, Set variablesSet, JoinRelType joinType, boolean semiJoinDone) { // This method does not provide the matchCondition as an argument, so it should never be called throw new RuntimeException("This method should not be called"); diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalFilter.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalFilter.java index ca67a1d0e174..a7dff69ed6dd 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalFilter.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalFilter.java @@ -148,10 +148,10 @@ public static LogicalFilter create(final RelNode input, RexNode condition, } @Override public LogicalFilter copy(RelTraitSet traitSet, RelNode input, - RexNode condition) { + RexNode condition, Set variablesSet) { assert traitSet.containsIfApplicable(Convention.NONE); return new LogicalFilter(getCluster(), traitSet, hints, input, condition, - variablesSet); + ImmutableSet.copyOf(variablesSet)); } @Override public RelNode accept(RelShuttle shuttle) { diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalJoin.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalJoin.java index 9504f01e5534..6f47630618b2 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalJoin.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalJoin.java @@ -173,8 +173,9 @@ public static LogicalJoin create(RelNode left, RelNode right, List hint //~ Methods ---------------------------------------------------------------- - @Override public LogicalJoin copy(RelTraitSet traitSet, RexNode conditionExpr, - RelNode left, RelNode right, JoinRelType joinType, boolean semiJoinDone) { + @Override public LogicalJoin copy(RelTraitSet traitSet, + RexNode conditionExpr, RelNode left, RelNode right, Set variablesSet, + JoinRelType joinType, boolean semiJoinDone) { assert traitSet.containsIfApplicable(Convention.NONE); return new LogicalJoin(getCluster(), getCluster().traitSetOf(Convention.NONE), hints, left, right, conditionExpr, diff --git a/core/src/main/java/org/apache/calcite/rel/logical/LogicalProject.java b/core/src/main/java/org/apache/calcite/rel/logical/LogicalProject.java index c1db7f223b81..43be1c6f2ec6 100644 --- a/core/src/main/java/org/apache/calcite/rel/logical/LogicalProject.java +++ b/core/src/main/java/org/apache/calcite/rel/logical/LogicalProject.java @@ -169,7 +169,7 @@ public static LogicalProject create(final RelNode input, List hints, } @Override public LogicalProject copy(RelTraitSet traitSet, RelNode input, - List projects, RelDataType rowType) { + List projects, RelDataType rowType, Set variablesSet) { return new LogicalProject(getCluster(), traitSet, hints, input, projects, rowType, variablesSet); } diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java b/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java index 6489edb05d70..e11257ff7ade 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java @@ -466,7 +466,7 @@ public void rewriteRel(LogicalFilter rel) { RexNode oldCondition = rel.getCondition(); RelNode newInput = getNewForOldRel(rel.getInput()); RexNode newCondition = oldCondition.accept(rewriteRexShuttle); - LogicalFilter newRel = rel.copy(traits, newInput, newCondition); + LogicalFilter newRel = rel.copy(traits, newInput, newCondition, rel.getVariablesSet()); setNewForOldRel(rel, newRel); } diff --git a/core/src/test/java/org/apache/calcite/plan/volcano/TraitPropagationTest.java b/core/src/test/java/org/apache/calcite/plan/volcano/TraitPropagationTest.java index 0caa7ec3e598..92c3cad9a63b 100644 --- a/core/src/test/java/org/apache/calcite/plan/volcano/TraitPropagationTest.java +++ b/core/src/test/java/org/apache/calcite/plan/volcano/TraitPropagationTest.java @@ -43,6 +43,7 @@ import org.apache.calcite.rel.convert.ConverterRule; import org.apache.calcite.rel.core.Aggregate; import org.apache.calcite.rel.core.AggregateCall; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Project; import org.apache.calcite.rel.core.Sort; import org.apache.calcite.rel.logical.LogicalAggregate; @@ -83,6 +84,9 @@ import java.util.Collections; import java.util.List; import java.util.Properties; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -391,7 +395,8 @@ public static PhysProj create(final RelNode input, } public PhysProj copy(RelTraitSet traitSet, RelNode input, - List exps, RelDataType rowType) { + List exps, RelDataType rowType, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new PhysProj(getCluster(), traitSet, input, exps, rowType); } diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java index a44486e9d9b8..5d64c8145616 100644 --- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java @@ -156,9 +156,12 @@ import java.util.EnumSet; import java.util.List; import java.util.Locale; +import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; +import static com.google.common.base.Preconditions.checkArgument; + import static org.apache.calcite.test.SqlToRelTestBase.NL; import static org.hamcrest.CoreMatchers.is; @@ -9838,7 +9841,8 @@ private static class MyFilter extends Filter { } @Override public MyFilter copy(RelTraitSet traitSet, RelNode input, - RexNode condition) { + RexNode condition, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new MyFilter(getCluster(), traitSet, input, condition); } } @@ -9895,7 +9899,8 @@ private static class MyProject extends Project { } public MyProject copy(RelTraitSet traitSet, RelNode input, - List projects, RelDataType rowType) { + List projects, RelDataType rowType, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new MyProject(getCluster(), traitSet, input, projects, rowType); } } diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java index 4383d6017c0e..0bfa0caeb40f 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchFilter.java @@ -21,6 +21,7 @@ import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Filter; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rex.RexCall; @@ -36,6 +37,9 @@ import java.io.StringWriter; import java.io.UncheckedIOException; import java.util.Iterator; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; @@ -57,7 +61,9 @@ public class ElasticsearchFilter extends Filter implements ElasticsearchRel { return cost.multiplyBy(0.1); } - @Override public Filter copy(RelTraitSet relTraitSet, RelNode input, RexNode condition) { + @Override public Filter copy(RelTraitSet relTraitSet, RelNode input, RexNode condition, + Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new ElasticsearchFilter(getCluster(), relTraitSet, input, condition); } diff --git a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java index 640b225434e6..8bf024f2c243 100644 --- a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java +++ b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchProject.java @@ -22,6 +22,7 @@ import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Project; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; @@ -35,8 +36,11 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; +import static com.google.common.base.Preconditions.checkArgument; + import static java.util.Objects.requireNonNull; /** @@ -52,7 +56,8 @@ public class ElasticsearchProject extends Project implements ElasticsearchRel { } @Override public Project copy(RelTraitSet relTraitSet, RelNode input, List projects, - RelDataType relDataType) { + RelDataType relDataType, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new ElasticsearchProject(getCluster(), traitSet, input, projects, relDataType); } diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java index dafc0122d139..96ff03419496 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeFilter.java @@ -22,6 +22,7 @@ import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Filter; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; @@ -79,7 +80,9 @@ public class GeodeFilter extends Filter implements GeodeRel { return cost.multiplyBy(0.1); } - @Override public GeodeFilter copy(RelTraitSet traitSet, RelNode input, RexNode condition) { + @Override public GeodeFilter copy(RelTraitSet traitSet, RelNode input, RexNode condition, + Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new GeodeFilter(getCluster(), traitSet, input, condition); } diff --git a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeProject.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeProject.java index 9cdcfa3eaf49..6d511d5e7d21 100644 --- a/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeProject.java +++ b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeProject.java @@ -22,6 +22,7 @@ import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Project; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; @@ -36,6 +37,9 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; @@ -54,7 +58,8 @@ public class GeodeProject extends Project implements GeodeRel { } @Override public Project copy(RelTraitSet traitSet, RelNode input, - List projects, RelDataType rowType) { + List projects, RelDataType rowType, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new GeodeProject(getCluster(), traitSet, input, projects, rowType); } diff --git a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilter.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilter.java index 37c5c57c8ced..5a42f49e8234 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilter.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilter.java @@ -23,6 +23,7 @@ import org.apache.calcite.rel.RelCollation; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.RelWriter; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Filter; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rex.RexNode; @@ -31,6 +32,10 @@ import org.checkerframework.checker.nullness.qual.Nullable; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; + import static java.util.Objects.requireNonNull; /** @@ -71,7 +76,8 @@ public static InnodbFilter create(RelOptCluster cluster, RelTraitSet traitSet, } @Override public InnodbFilter copy(RelTraitSet traitSet, RelNode input, - RexNode condition) { + RexNode condition, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new InnodbFilter(getCluster(), traitSet, input, condition, indexCondition, tableDef, forceIndexName); } diff --git a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbProject.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbProject.java index f05c30091c76..15e7c500ac23 100644 --- a/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbProject.java +++ b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbProject.java @@ -21,6 +21,7 @@ import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Project; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; @@ -35,6 +36,9 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; @@ -51,7 +55,8 @@ public class InnodbProject extends Project implements InnodbRel { } @Override public Project copy(RelTraitSet traitSet, RelNode input, - List projects, RelDataType rowType) { + List projects, RelDataType rowType, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new InnodbProject(getCluster(), traitSet, input, projects, rowType); } diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoFilter.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoFilter.java index 00a26c5fe3cb..9618ddfe1f36 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoFilter.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoFilter.java @@ -22,6 +22,7 @@ import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Filter; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; @@ -45,6 +46,9 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; /** * Implementation of a {@link org.apache.calcite.rel.core.Filter} @@ -67,7 +71,8 @@ public MongoFilter( } @Override public MongoFilter copy(RelTraitSet traitSet, RelNode input, - RexNode condition) { + RexNode condition, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new MongoFilter(getCluster(), traitSet, input, condition); } diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoProject.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoProject.java index ee0721fe4a92..c35bef54b095 100644 --- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoProject.java +++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoProject.java @@ -22,6 +22,7 @@ import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Project; import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rel.type.RelDataType; @@ -36,6 +37,9 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; /** * Implementation of {@link org.apache.calcite.rel.core.Project} @@ -57,7 +61,8 @@ public MongoProject(RelOptCluster cluster, RelTraitSet traitSet, } @Override public Project copy(RelTraitSet traitSet, RelNode input, - List projects, RelDataType rowType) { + List projects, RelDataType rowType, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new MongoProject(getCluster(), traitSet, input, projects, rowType); } diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigFilter.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigFilter.java index 9c720aeb8442..211d6183cc49 100644 --- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigFilter.java +++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigFilter.java @@ -21,6 +21,7 @@ import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Filter; import org.apache.calcite.rex.RexCall; import org.apache.calcite.rex.RexInputRef; @@ -29,7 +30,9 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; +import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static org.apache.calcite.sql.SqlKind.INPUT_REF; @@ -45,7 +48,9 @@ public PigFilter(RelOptCluster cluster, RelTraitSet traitSet, RelNode input, Rex assert getConvention() == PigRel.CONVENTION; } - @Override public Filter copy(RelTraitSet traitSet, RelNode input, RexNode condition) { + @Override public Filter copy(RelTraitSet traitSet, RelNode input, RexNode condition, + Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new PigFilter(getCluster(), traitSet, input, condition); } diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigJoin.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigJoin.java index 948ae3f3bb95..d735b71d430a 100644 --- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigJoin.java +++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigJoin.java @@ -21,6 +21,7 @@ import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Join; import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rex.RexCall; @@ -32,6 +33,9 @@ import java.util.ArrayList; import java.util.List; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; /** Implementation of {@link org.apache.calcite.rel.core.Join} in * {@link PigRel#CONVENTION Pig calling convention}. */ @@ -45,8 +49,10 @@ public PigJoin(RelOptCluster cluster, RelTraitSet traitSet, RelNode left, RelNod assert getConvention() == PigRel.CONVENTION; } - @Override public Join copy(RelTraitSet traitSet, RexNode conditionExpr, RelNode left, - RelNode right, JoinRelType joinType, boolean semiJoinDone) { + @Override public PigJoin copy(RelTraitSet traitSet, + RexNode conditionExpr, RelNode left, RelNode right, Set variablesSet, + JoinRelType joinType, boolean semiJoinDone) { + checkArgument(variablesSet.isEmpty()); return new PigJoin(getCluster(), traitSet, left, right, conditionExpr, joinType); } diff --git a/pig/src/main/java/org/apache/calcite/adapter/pig/PigProject.java b/pig/src/main/java/org/apache/calcite/adapter/pig/PigProject.java index e62c9106a7cc..7c502402f5db 100644 --- a/pig/src/main/java/org/apache/calcite/adapter/pig/PigProject.java +++ b/pig/src/main/java/org/apache/calcite/adapter/pig/PigProject.java @@ -20,6 +20,7 @@ import org.apache.calcite.plan.RelOptTable; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.CorrelationId; import org.apache.calcite.rel.core.Project; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rex.RexNode; @@ -28,6 +29,9 @@ import com.google.common.collect.ImmutableSet; import java.util.List; +import java.util.Set; + +import static com.google.common.base.Preconditions.checkArgument; /** Implementation of {@link org.apache.calcite.rel.core.Project} in * {@link PigRel#CONVENTION Pig calling convention}. */ @@ -41,7 +45,8 @@ public PigProject(RelOptCluster cluster, RelTraitSet traitSet, RelNode input, } @Override public Project copy(RelTraitSet traitSet, RelNode input, List projects, - RelDataType rowType) { + RelDataType rowType, Set variablesSet) { + checkArgument(variablesSet.isEmpty()); return new PigProject(input.getCluster(), traitSet, input, projects, rowType); }