http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java index ae68a91..494ab78 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinAddRedundantSemiJoinRule.java @@ -22,8 +22,10 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Join; import org.apache.calcite.rel.core.JoinInfo; import org.apache.calcite.rel.core.JoinRelType; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.SemiJoin; import org.apache.calcite.rel.logical.LogicalJoin; +import org.apache.calcite.tools.RelBuilderFactory; /** * Rule to add a semi-join into a join. Transformation is as follows: @@ -36,15 +38,17 @@ import org.apache.calcite.rel.logical.LogicalJoin; */ public class JoinAddRedundantSemiJoinRule extends RelOptRule { public static final JoinAddRedundantSemiJoinRule INSTANCE = - new JoinAddRedundantSemiJoinRule(LogicalJoin.class); + new JoinAddRedundantSemiJoinRule(LogicalJoin.class, + RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- /** * Creates an JoinAddRedundantSemiJoinRule. */ - private JoinAddRedundantSemiJoinRule(Class<? extends Join> clazz) { - super(operand(clazz, any())); + public JoinAddRedundantSemiJoinRule(Class<? extends Join> clazz, + RelBuilderFactory relBuilderFactory) { + super(operand(clazz, any()), relBuilderFactory, null); } //~ Methods ----------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/JoinAssociateRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinAssociateRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinAssociateRule.java index 455176f..ad6b3c6 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/JoinAssociateRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinAssociateRule.java @@ -23,10 +23,12 @@ import org.apache.calcite.plan.volcano.RelSubset; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Join; import org.apache.calcite.rel.core.JoinRelType; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rex.RexBuilder; import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexPermuteInputsShuttle; import org.apache.calcite.rex.RexUtil; +import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.mapping.Mappings; @@ -49,18 +51,20 @@ public class JoinAssociateRule extends RelOptRule { //~ Static fields/initializers --------------------------------------------- /** The singleton. */ - public static final JoinAssociateRule INSTANCE = new JoinAssociateRule(); + public static final JoinAssociateRule INSTANCE = + new JoinAssociateRule(RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- /** * Creates a JoinAssociateRule. */ - private JoinAssociateRule() { + public JoinAssociateRule(RelBuilderFactory relBuilderFactory) { super( operand(Join.class, operand(Join.class, any()), - operand(RelSubset.class, any()))); + operand(RelSubset.class, any())), + relBuilderFactory, null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/JoinExtractFilterRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinExtractFilterRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinExtractFilterRule.java index 8d3f665..8c4a02d 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/JoinExtractFilterRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinExtractFilterRule.java @@ -23,6 +23,7 @@ import org.apache.calcite.rel.core.Join; import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.logical.LogicalJoin; +import org.apache.calcite.tools.RelBuilderFactory; /** * Rule to convert an @@ -43,15 +44,25 @@ public final class JoinExtractFilterRule extends RelOptRule { /** The singleton. */ public static final JoinExtractFilterRule INSTANCE = - new JoinExtractFilterRule(LogicalJoin.class); + new JoinExtractFilterRule(LogicalJoin.class, + RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- /** * Creates an JoinExtractFilterRule. */ + @Deprecated // to be removed before 2.0 public JoinExtractFilterRule(Class<? extends Join> clazz) { - super(operand(clazz, any())); + this(clazz, RelFactories.LOGICAL_BUILDER); + } + + /** + * Creates a JoinExtractFilterRule. + */ + public JoinExtractFilterRule(Class<? extends Join> clazz, + RelBuilderFactory relBuilderFactory) { + super(operand(clazz, any()), relBuilderFactory, null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java index 5afbe2a..47a128d 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinToCorrelateRule.java @@ -66,9 +66,9 @@ public class JoinToCorrelateRule extends RelOptRule { //~ Constructors ----------------------------------------------------------- /** - * Private constructor; use singleton {@link #INSTANCE}. + * Creates a JoinToCorrelateRule. */ - protected JoinToCorrelateRule(RelBuilderFactory relBuilderFactory) { + public JoinToCorrelateRule(RelBuilderFactory relBuilderFactory) { super(operand(LogicalJoin.class, any()), relBuilderFactory, null); } http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java index 7d6c059..ecccad1 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java @@ -22,6 +22,7 @@ import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Join; import org.apache.calcite.rel.core.JoinRelType; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.logical.LogicalJoin; import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.rex.RexBuilder; @@ -29,6 +30,7 @@ import org.apache.calcite.rex.RexInputRef; import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexUtil; import org.apache.calcite.rex.RexVisitorImpl; +import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.ImmutableIntList; import org.apache.calcite.util.Pair; @@ -102,18 +104,25 @@ import java.util.Map; */ public class JoinToMultiJoinRule extends RelOptRule { public static final JoinToMultiJoinRule INSTANCE = - new JoinToMultiJoinRule(LogicalJoin.class); + new JoinToMultiJoinRule(LogicalJoin.class, RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- + @Deprecated // to be removed before 2.0 + public JoinToMultiJoinRule(Class<? extends Join> clazz) { + this(clazz, RelFactories.LOGICAL_BUILDER); + } + /** * Creates a JoinToMultiJoinRule. */ - public JoinToMultiJoinRule(Class<? extends Join> clazz) { + public JoinToMultiJoinRule(Class<? extends Join> clazz, + RelBuilderFactory relBuilderFactory) { super( operand(clazz, operand(RelNode.class, any()), - operand(RelNode.class, any()))); + operand(RelNode.class, any())), + relBuilderFactory, null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java index 0a3bee9..acd4577 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinUnionTransposeRule.java @@ -21,8 +21,10 @@ import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.plan.RelOptRuleOperand; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Join; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.SetOp; import org.apache.calcite.rel.core.Union; +import org.apache.calcite.tools.RelBuilderFactory; import java.util.ArrayList; import java.util.List; @@ -38,6 +40,7 @@ public class JoinUnionTransposeRule extends RelOptRule { operand(Join.class, operand(Union.class, any()), operand(RelNode.class, any())), + RelFactories.LOGICAL_BUILDER, "JoinUnionTransposeRule(Union-Other)"); public static final JoinUnionTransposeRule RIGHT_UNION = @@ -45,11 +48,19 @@ public class JoinUnionTransposeRule extends RelOptRule { operand(Join.class, operand(RelNode.class, any()), operand(Union.class, any())), + RelFactories.LOGICAL_BUILDER, "JoinUnionTransposeRule(Other-Union)"); - private JoinUnionTransposeRule(RelOptRuleOperand operand, - String description) { - super(operand, description); + /** + * Creates a JoinUnionTransposeRule. + * + * @param operand root operand, must not be null + * @param description Description, or null to guess description + * @param relBuilderFactory Builder for relational expressions + */ + public JoinUnionTransposeRule(RelOptRuleOperand operand, + RelBuilderFactory relBuilderFactory, String description) { + super(operand, relBuilderFactory, description); } public void onMatch(RelOptRuleCall call) { http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/MaterializedViewFilterScanRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/MaterializedViewFilterScanRule.java b/core/src/main/java/org/apache/calcite/rel/rules/MaterializedViewFilterScanRule.java index f1775aa..b382f52 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/MaterializedViewFilterScanRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/MaterializedViewFilterScanRule.java @@ -56,7 +56,7 @@ public class MaterializedViewFilterScanRule extends RelOptRule { //~ Constructors ----------------------------------------------------------- /** Creates a MaterializedViewFilterScanRule. */ - protected MaterializedViewFilterScanRule(RelBuilderFactory relBuilderFactory) { + public MaterializedViewFilterScanRule(RelBuilderFactory relBuilderFactory) { super(operand(Filter.class, operand(TableScan.class, null, none())), relBuilderFactory, "MaterializedViewFilterScanRule"); } http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java index 4c254fb..8579816 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/MultiJoinProjectTransposeRule.java @@ -20,8 +20,10 @@ import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.plan.RelOptRuleOperand; import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.logical.LogicalJoin; import org.apache.calcite.rel.logical.LogicalProject; +import org.apache.calcite.tools.RelBuilderFactory; /** * MultiJoinProjectTransposeRule implements the rule for pulling @@ -64,6 +66,7 @@ public class MultiJoinProjectTransposeRule extends JoinProjectTransposeRule { operand(MultiJoin.class, any())), operand(LogicalProject.class, operand(MultiJoin.class, any()))), + RelFactories.LOGICAL_BUILDER, "MultiJoinProjectTransposeRule: with two LogicalProject children"); public static final MultiJoinProjectTransposeRule MULTI_LEFT_PROJECT = @@ -72,6 +75,7 @@ public class MultiJoinProjectTransposeRule extends JoinProjectTransposeRule { some( operand(LogicalProject.class, operand(MultiJoin.class, any())))), + RelFactories.LOGICAL_BUILDER, "MultiJoinProjectTransposeRule: with LogicalProject on left"); public static final MultiJoinProjectTransposeRule MULTI_RIGHT_PROJECT = @@ -80,14 +84,24 @@ public class MultiJoinProjectTransposeRule extends JoinProjectTransposeRule { operand(RelNode.class, any()), operand(LogicalProject.class, operand(MultiJoin.class, any()))), + RelFactories.LOGICAL_BUILDER, "MultiJoinProjectTransposeRule: with LogicalProject on right"); //~ Constructors ----------------------------------------------------------- + @Deprecated // to be removed before 2.0 public MultiJoinProjectTransposeRule( RelOptRuleOperand operand, String description) { - super(operand, description); + this(operand, RelFactories.LOGICAL_BUILDER, description); + } + + /** Creates a MultiJoinProjectTransposeRule. */ + public MultiJoinProjectTransposeRule( + RelOptRuleOperand operand, + RelBuilderFactory relBuilderFactory, + String description) { + super(operand, description, false, relBuilderFactory); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java index 9ecd044..568c31b 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectCalcMergeRule.java @@ -19,6 +19,7 @@ package org.apache.calcite.rel.rules; import org.apache.calcite.plan.RelOptCluster; import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.plan.RelOptRuleCall; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.logical.LogicalCalc; import org.apache.calcite.rel.logical.LogicalProject; import org.apache.calcite.rex.RexBuilder; @@ -26,6 +27,7 @@ import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexOver; import org.apache.calcite.rex.RexProgram; import org.apache.calcite.rex.RexProgramBuilder; +import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.Pair; /** @@ -44,15 +46,21 @@ public class ProjectCalcMergeRule extends RelOptRule { //~ Static fields/initializers --------------------------------------------- public static final ProjectCalcMergeRule INSTANCE = - new ProjectCalcMergeRule(); + new ProjectCalcMergeRule(RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- - private ProjectCalcMergeRule() { + /** + * Creates a ProjectCalcMergeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public ProjectCalcMergeRule(RelBuilderFactory relBuilderFactory) { super( operand( LogicalProject.class, - operand(LogicalCalc.class, any()))); + operand(LogicalCalc.class, any())), + relBuilderFactory, null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java index 0cf5d58..95a568f 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectMultiJoinMergeRule.java @@ -39,7 +39,7 @@ public class ProjectMultiJoinMergeRule extends RelOptRule { //~ Constructors ----------------------------------------------------------- /** Creates a ProjectMultiJoinMergeRule. */ - private ProjectMultiJoinMergeRule(RelBuilderFactory relBuilderFactory) { + public ProjectMultiJoinMergeRule(RelBuilderFactory relBuilderFactory) { super( operand(LogicalProject.class, operand(MultiJoin.class, any())), relBuilderFactory, null); http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java index 7a92ccb..cc773fb 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectRemoveRule.java @@ -20,10 +20,12 @@ import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Project; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexUtil; import org.apache.calcite.runtime.PredicateImpl; +import org.apache.calcite.tools.RelBuilderFactory; import com.google.common.base.Predicate; @@ -49,15 +51,21 @@ public class ProjectRemoveRule extends RelOptRule { } }; - public static final ProjectRemoveRule INSTANCE = new ProjectRemoveRule(); + public static final ProjectRemoveRule INSTANCE = + new ProjectRemoveRule(RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- - /** Creates a ProjectRemoveRule. */ - private ProjectRemoveRule() { + /** + * Creates a ProjectRemoveRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public ProjectRemoveRule(RelBuilderFactory relBuilderFactory) { // Create a specialized operand to detect non-matches early. This keeps // the rule queue short. - super(operand(Project.class, null, PREDICATE, any())); + super(operand(Project.class, null, PREDICATE, any()), relBuilderFactory, + null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java index 727f5dd..d1dd14e 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectSortTransposeRule.java @@ -21,7 +21,9 @@ import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.plan.RelOptRuleOperand; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Project; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.Sort; +import org.apache.calcite.tools.RelBuilderFactory; import com.google.common.collect.ImmutableList; @@ -34,21 +36,29 @@ import com.google.common.collect.ImmutableList; */ public class ProjectSortTransposeRule extends RelOptRule { public static final ProjectSortTransposeRule INSTANCE = - new ProjectSortTransposeRule(); + new ProjectSortTransposeRule(Project.class, Sort.class, + RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- - /** - * Creates a ProjectSortTransposeRule. - */ - private ProjectSortTransposeRule() { - super( - operand(Project.class, - operand(Sort.class, any()))); + /** Creates a ProjectSortTransposeRule. */ + private ProjectSortTransposeRule(Class<Project> projectClass, + Class<Sort> sortClass, RelBuilderFactory relBuilderFactory) { + this( + operand(projectClass, + operand(sortClass, any())), + relBuilderFactory, null); } + @Deprecated // to be removed before 2.0 protected ProjectSortTransposeRule(RelOptRuleOperand operand) { - super(operand); + this(operand, RelFactories.LOGICAL_BUILDER, null); + } + + /** Creates a ProjectSortTransposeRule with an operand. */ + protected ProjectSortTransposeRule(RelOptRuleOperand operand, + RelBuilderFactory relBuilderFactory, String description) { + super(operand, relBuilderFactory, description); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java index eff4e52..bd4b5fe 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectTableScanRule.java @@ -23,10 +23,12 @@ import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.plan.RelOptRuleOperand; import org.apache.calcite.plan.RelOptTable; import org.apache.calcite.rel.core.Project; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.TableScan; import org.apache.calcite.rex.RexNode; import org.apache.calcite.runtime.PredicateImpl; import org.apache.calcite.schema.ProjectableFilterableTable; +import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.ImmutableIntList; import org.apache.calcite.util.mapping.Mapping; import org.apache.calcite.util.mapping.Mappings; @@ -62,6 +64,7 @@ public abstract class ProjectTableScanRule extends RelOptRule { new ProjectTableScanRule( operand(Project.class, operand(TableScan.class, null, PREDICATE, none())), + RelFactories.LOGICAL_BUILDER, "ProjectScanRule") { @Override public void onMatch(RelOptRuleCall call) { final Project project = call.rel(0); @@ -76,6 +79,7 @@ public abstract class ProjectTableScanRule extends RelOptRule { operand(Project.class, operand(EnumerableInterpreter.class, operand(TableScan.class, null, PREDICATE, none()))), + RelFactories.LOGICAL_BUILDER, "ProjectScanRule:interpreter") { @Override public void onMatch(RelOptRuleCall call) { final Project project = call.rel(0); @@ -86,9 +90,10 @@ public abstract class ProjectTableScanRule extends RelOptRule { //~ Constructors ----------------------------------------------------------- - /** Creates a ProjectScanRule. */ - private ProjectTableScanRule(RelOptRuleOperand operand, String description) { - super(operand, description); + /** Creates a ProjectTableScanRule. */ + public ProjectTableScanRule(RelOptRuleOperand operand, + RelBuilderFactory relBuilderFactory, String description) { + super(operand, relBuilderFactory, description); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ProjectToCalcRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectToCalcRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectToCalcRule.java index b6f05c9..e16bc81 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectToCalcRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectToCalcRule.java @@ -19,9 +19,11 @@ package org.apache.calcite.rel.rules; import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.logical.LogicalCalc; import org.apache.calcite.rel.logical.LogicalProject; import org.apache.calcite.rex.RexProgram; +import org.apache.calcite.tools.RelBuilderFactory; /** * Rule to convert a @@ -40,12 +42,18 @@ import org.apache.calcite.rex.RexProgram; public class ProjectToCalcRule extends RelOptRule { //~ Static fields/initializers --------------------------------------------- - public static final ProjectToCalcRule INSTANCE = new ProjectToCalcRule(); + public static final ProjectToCalcRule INSTANCE = + new ProjectToCalcRule(RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- - private ProjectToCalcRule() { - super(operand(LogicalProject.class, any())); + /** + * Creates a ProjectToCalcRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public ProjectToCalcRule(RelBuilderFactory relBuilderFactory) { + super(operand(LogicalProject.class, any()), relBuilderFactory, null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java index 4c441e2..2a37522 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectToWindowRule.java @@ -25,6 +25,7 @@ import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Calc; import org.apache.calcite.rel.core.Project; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.logical.LogicalCalc; import org.apache.calcite.rel.logical.LogicalWindow; import org.apache.calcite.rex.RexCall; @@ -39,6 +40,7 @@ import org.apache.calcite.rex.RexVisitorImpl; import org.apache.calcite.rex.RexWindow; import org.apache.calcite.runtime.PredicateImpl; import org.apache.calcite.tools.RelBuilder; +import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.ImmutableIntList; import org.apache.calcite.util.Pair; import org.apache.calcite.util.graph.DefaultDirectedGraph; @@ -90,25 +92,56 @@ public abstract class ProjectToWindowRule extends RelOptRule { } }; + public static final ProjectToWindowRule INSTANCE = + new CalcToWindowRule(RelFactories.LOGICAL_BUILDER); + + public static final ProjectToWindowRule PROJECT = + new ProjectToLogicalProjectAndWindowRule(RelFactories.LOGICAL_BUILDER); + + //~ Constructors ----------------------------------------------------------- + + /** + * Creates a ProjectToWindowRule. + * + * @param operand Root operand, must not be null + * @param description Description, or null to guess description + * @param relBuilderFactory Builder for relational expressions + */ + public ProjectToWindowRule(RelOptRuleOperand operand, + RelBuilderFactory relBuilderFactory, String description) { + super(operand, relBuilderFactory, description); + } + + //~ Inner Classes ---------------------------------------------------------- + /** * Instance of the rule that applies to a * {@link org.apache.calcite.rel.core.Calc} that contains * windowed aggregates and converts it into a mixture of * {@link org.apache.calcite.rel.logical.LogicalWindow} and {@code Calc}. */ - public static final ProjectToWindowRule INSTANCE = - new ProjectToWindowRule( - operand(Calc.class, null, PREDICATE, any()), - "ProjectToWindowRule") { - public void onMatch(RelOptRuleCall call) { - Calc calc = call.rel(0); - assert RexOver.containsOver(calc.getProgram()); - final CalcRelSplitter transform = - new WindowedAggRelSplitter(calc, call.builder()); - RelNode newRel = transform.execute(); - call.transformTo(newRel); - } - }; + public static class CalcToWindowRule extends ProjectToWindowRule { + + /** + * Creates a CalcToWindowRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public CalcToWindowRule(RelBuilderFactory relBuilderFactory) { + super( + operand(Calc.class, null, PREDICATE, any()), + relBuilderFactory, "ProjectToWindowRule"); + } + + public void onMatch(RelOptRuleCall call) { + Calc calc = call.rel(0); + assert RexOver.containsOver(calc.getProgram()); + final CalcRelSplitter transform = + new WindowedAggRelSplitter(calc, call.builder()); + RelNode newRel = transform.execute(); + call.transformTo(newRel); + } + } /** * Instance of the rule that can be applied to a @@ -116,63 +149,63 @@ public abstract class ProjectToWindowRule extends RelOptRule { * a mixture of {@code LogicalProject} * and {@link org.apache.calcite.rel.logical.LogicalWindow}. */ - public static final ProjectToWindowRule PROJECT = - new ProjectToWindowRule( - operand(Project.class, null, PREDICATE2, any()), - "ProjectToWindowRule:project") { - @Override public void onMatch(RelOptRuleCall call) { - Project project = call.rel(0); - assert RexOver.containsOver(project.getProjects(), null); - final RelNode input = project.getInput(); - final RexProgram program = - RexProgram.create( - input.getRowType(), - project.getProjects(), - null, - project.getRowType(), - project.getCluster().getRexBuilder()); - // temporary LogicalCalc, never registered - final LogicalCalc calc = LogicalCalc.create(input, program); - final CalcRelSplitter transform = new WindowedAggRelSplitter(calc, - call.builder()) { - @Override protected RelNode handle(RelNode rel) { - if (!(rel instanceof LogicalCalc)) { - return rel; - } - final LogicalCalc calc = (LogicalCalc) rel; - final RexProgram program = calc.getProgram(); - relBuilder.push(calc.getInput()); - if (program.getCondition() != null) { - relBuilder.filter( - program.expandLocalRef(program.getCondition())); - } - if (!program.projectsOnlyIdentity()) { - relBuilder.project( - Lists.transform(program.getProjectList(), - new Function<RexLocalRef, RexNode>() { - public RexNode apply(RexLocalRef a0) { - return program.expandLocalRef(a0); - } - }), - calc.getRowType().getFieldNames()); - } - return relBuilder.build(); - } - }; - RelNode newRel = transform.execute(); - call.transformTo(newRel); + public static class ProjectToLogicalProjectAndWindowRule + extends ProjectToWindowRule { + /** + * Creates a ProjectToWindowRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public ProjectToLogicalProjectAndWindowRule( + RelBuilderFactory relBuilderFactory) { + super(operand(Project.class, null, PREDICATE2, any()), + relBuilderFactory, "ProjectToWindowRule:project"); + } + + @Override public void onMatch(RelOptRuleCall call) { + Project project = call.rel(0); + assert RexOver.containsOver(project.getProjects(), null); + final RelNode input = project.getInput(); + final RexProgram program = + RexProgram.create( + input.getRowType(), + project.getProjects(), + null, + project.getRowType(), + project.getCluster().getRexBuilder()); + // temporary LogicalCalc, never registered + final LogicalCalc calc = LogicalCalc.create(input, program); + final CalcRelSplitter transform = new WindowedAggRelSplitter(calc, + call.builder()) { + @Override protected RelNode handle(RelNode rel) { + if (!(rel instanceof LogicalCalc)) { + return rel; + } + final LogicalCalc calc = (LogicalCalc) rel; + final RexProgram program = calc.getProgram(); + relBuilder.push(calc.getInput()); + if (program.getCondition() != null) { + relBuilder.filter( + program.expandLocalRef(program.getCondition())); + } + if (!program.projectsOnlyIdentity()) { + relBuilder.project( + Lists.transform(program.getProjectList(), + new Function<RexLocalRef, RexNode>() { + public RexNode apply(RexLocalRef a0) { + return program.expandLocalRef(a0); + } + }), + calc.getRowType().getFieldNames()); + } + return relBuilder.build(); } }; - - //~ Constructors ----------------------------------------------------------- - - /** Creates a ProjectToWindowRule. */ - private ProjectToWindowRule(RelOptRuleOperand operand, String description) { - super(operand, description); + RelNode newRel = transform.execute(); + call.transformTo(newRel); + } } - //~ Inner Classes ---------------------------------------------------------- - /** * Splitter that distinguishes between windowed aggregation expressions * (calls to {@link RexOver}) and ordinary expressions. http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java index 152a3d2..10afd40 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java @@ -21,6 +21,7 @@ import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.rel.RelCollations; import org.apache.calcite.rel.RelFieldCollation; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.Window; import org.apache.calcite.rel.logical.LogicalProject; import org.apache.calcite.rel.logical.LogicalWindow; @@ -31,6 +32,7 @@ import org.apache.calcite.rex.RexInputRef; import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexShuttle; import org.apache.calcite.sql.SqlAggFunction; +import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.BitSets; import org.apache.calcite.util.ImmutableBitSet; @@ -46,12 +48,18 @@ public class ProjectWindowTransposeRule extends RelOptRule { /** The default instance of * {@link org.apache.calcite.rel.rules.ProjectWindowTransposeRule}. */ public static final ProjectWindowTransposeRule INSTANCE = - new ProjectWindowTransposeRule(); - - private ProjectWindowTransposeRule() { + new ProjectWindowTransposeRule(RelFactories.LOGICAL_BUILDER); + + /** + * Creates ProjectWindowTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public ProjectWindowTransposeRule(RelBuilderFactory relBuilderFactory) { super( operand(LogicalProject.class, - operand(LogicalWindow.class, any()))); + operand(LogicalWindow.class, any())), + relBuilderFactory, null); } @Override public void onMatch(RelOptRuleCall call) { http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java index 3dac4ed..2d27fc5 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ReduceDecimalsRule.java @@ -20,6 +20,7 @@ import org.apache.calcite.linq4j.Ord; import org.apache.calcite.plan.Convention; import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.plan.RelOptRuleCall; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.logical.LogicalCalc; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeSystem; @@ -36,6 +37,7 @@ import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.sql.type.SqlTypeUtil; +import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.Pair; import org.apache.calcite.util.Util; @@ -65,15 +67,16 @@ import static org.apache.calcite.util.Static.RESOURCE; * would like to push down decimal operations to an external database. */ public class ReduceDecimalsRule extends RelOptRule { - public static final ReduceDecimalsRule INSTANCE = new ReduceDecimalsRule(); + public static final ReduceDecimalsRule INSTANCE = + new ReduceDecimalsRule(RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- /** * Creates a ReduceDecimalsRule. */ - private ReduceDecimalsRule() { - super(operand(LogicalCalc.class, any())); + public ReduceDecimalsRule(RelBuilderFactory relBuilderFactory) { + super(operand(LogicalCalc.class, any()), relBuilderFactory, null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java index 486e43c..6103720 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinFilterTransposeRule.java @@ -22,6 +22,7 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.SemiJoin; import org.apache.calcite.rel.logical.LogicalFilter; +import org.apache.calcite.tools.RelBuilderFactory; /** * Planner rule that pushes @@ -37,17 +38,18 @@ import org.apache.calcite.rel.logical.LogicalFilter; */ public class SemiJoinFilterTransposeRule extends RelOptRule { public static final SemiJoinFilterTransposeRule INSTANCE = - new SemiJoinFilterTransposeRule(); + new SemiJoinFilterTransposeRule(RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- /** * Creates a SemiJoinFilterTransposeRule. */ - private SemiJoinFilterTransposeRule() { + public SemiJoinFilterTransposeRule(RelBuilderFactory relBuilderFactory) { super( operand(SemiJoin.class, - some(operand(LogicalFilter.class, any())))); + some(operand(LogicalFilter.class, any()))), + relBuilderFactory, null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java index 42821e7..f7e4f48 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinJoinTransposeRule.java @@ -21,9 +21,11 @@ import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Join; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.SemiJoin; import org.apache.calcite.rel.type.RelDataTypeField; import org.apache.calcite.rex.RexNode; +import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.ImmutableIntList; import java.util.ArrayList; @@ -45,17 +47,18 @@ import java.util.List; */ public class SemiJoinJoinTransposeRule extends RelOptRule { public static final SemiJoinJoinTransposeRule INSTANCE = - new SemiJoinJoinTransposeRule(); + new SemiJoinJoinTransposeRule(RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- /** * Creates a SemiJoinJoinTransposeRule. */ - private SemiJoinJoinTransposeRule() { + public SemiJoinJoinTransposeRule(RelBuilderFactory relBuilderFactory) { super( operand(SemiJoin.class, - some(operand(Join.class, any())))); + some(operand(Join.class, any()))), + relBuilderFactory, null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRemoveRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRemoveRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRemoveRule.java index 4c6a20d..24ee4fb 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRemoveRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/SemiJoinRemoveRule.java @@ -18,7 +18,9 @@ package org.apache.calcite.rel.rules; import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.plan.RelOptRuleCall; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.SemiJoin; +import org.apache.calcite.tools.RelBuilderFactory; /** * Planner rule that removes a {@link org.apache.calcite.rel.core.SemiJoin}s @@ -33,13 +35,13 @@ import org.apache.calcite.rel.core.SemiJoin; */ public class SemiJoinRemoveRule extends RelOptRule { public static final SemiJoinRemoveRule INSTANCE = - new SemiJoinRemoveRule(); + new SemiJoinRemoveRule(RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- /** Creates a SemiJoinRemoveRule. */ - private SemiJoinRemoveRule() { - super(operand(SemiJoin.class, any())); + public SemiJoinRemoveRule(RelBuilderFactory relBuilderFactory) { + super(operand(SemiJoin.class, any()), relBuilderFactory, null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java index 86d3e5e..04fbb6d 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java @@ -26,11 +26,13 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Join; import org.apache.calcite.rel.core.JoinInfo; import org.apache.calcite.rel.core.JoinRelType; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.Sort; import org.apache.calcite.rel.logical.LogicalJoin; import org.apache.calcite.rel.logical.LogicalSort; import org.apache.calcite.rel.metadata.RelMdUtil; import org.apache.calcite.rel.metadata.RelMetadataQuery; +import org.apache.calcite.tools.RelBuilderFactory; /** @@ -45,16 +47,24 @@ public class SortJoinTransposeRule extends RelOptRule { public static final SortJoinTransposeRule INSTANCE = new SortJoinTransposeRule(LogicalSort.class, - LogicalJoin.class); + LogicalJoin.class, RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- /** Creates a SortJoinTransposeRule. */ + @Deprecated // to be removed before 2.0 public SortJoinTransposeRule(Class<? extends Sort> sortClass, Class<? extends Join> joinClass) { + this(sortClass, joinClass, RelFactories.LOGICAL_BUILDER); + } + + /** Creates a SortJoinTransposeRule. */ + public SortJoinTransposeRule(Class<? extends Sort> sortClass, + Class<? extends Join> joinClass, RelBuilderFactory relBuilderFactory) { super( operand(sortClass, - operand(joinClass, any()))); + operand(joinClass, any())), + relBuilderFactory, null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/SortProjectTransposeRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SortProjectTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SortProjectTransposeRule.java index 127e95e..19cde5f 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/SortProjectTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/SortProjectTransposeRule.java @@ -27,6 +27,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.Project; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.Sort; import org.apache.calcite.rel.logical.LogicalProject; import org.apache.calcite.rex.RexCall; @@ -35,6 +36,7 @@ import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexUtil; import org.apache.calcite.sql.SqlKind; import org.apache.calcite.sql.validate.SqlMonotonicity; +import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.mapping.Mappings; import com.google.common.collect.ImmutableList; @@ -51,7 +53,8 @@ import java.util.Map; */ public class SortProjectTransposeRule extends RelOptRule { public static final SortProjectTransposeRule INSTANCE = - new SortProjectTransposeRule(Sort.class, LogicalProject.class, null); + new SortProjectTransposeRule(Sort.class, LogicalProject.class, + RelFactories.LOGICAL_BUILDER, null); //~ Constructors ----------------------------------------------------------- @@ -59,20 +62,35 @@ public class SortProjectTransposeRule extends RelOptRule { public SortProjectTransposeRule( Class<? extends Sort> sortClass, Class<? extends Project> projectClass) { - this(sortClass, projectClass, null); + this(sortClass, projectClass, RelFactories.LOGICAL_BUILDER, null); } - /** Creates a SortProjectTransposeRule.*/ + @Deprecated // to be removed before 2.0 public SortProjectTransposeRule( Class<? extends Sort> sortClass, Class<? extends Project> projectClass, String description) { - super( + this(sortClass, projectClass, RelFactories.LOGICAL_BUILDER, description); + } + + /** Creates a SortProjectTransposeRule. */ + public SortProjectTransposeRule( + Class<? extends Sort> sortClass, + Class<? extends Project> projectClass, + RelBuilderFactory relBuilderFactory, String description) { + this( operand(sortClass, operand(projectClass, any())), - description); + relBuilderFactory, description); + } + + /** Creates a SortProjectTransposeRule with an operand. */ + protected SortProjectTransposeRule(RelOptRuleOperand operand, + RelBuilderFactory relBuilderFactory, String description) { + super(operand, relBuilderFactory, description); } + @Deprecated // to be removed before 2.0 protected SortProjectTransposeRule(RelOptRuleOperand operand) { super(operand); } http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java index bd56821..09334ab 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/SortRemoveRule.java @@ -21,7 +21,9 @@ import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelCollation; import org.apache.calcite.rel.RelCollationTraitDef; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.Sort; +import org.apache.calcite.tools.RelBuilderFactory; /** * Planner rule that removes @@ -30,12 +32,16 @@ import org.apache.calcite.rel.core.Sort; * <p>Requires {@link RelCollationTraitDef}. */ public class SortRemoveRule extends RelOptRule { - public static final SortRemoveRule INSTANCE = new SortRemoveRule(); + public static final SortRemoveRule INSTANCE = + new SortRemoveRule(RelFactories.LOGICAL_BUILDER); - private SortRemoveRule() { - super( - operand(Sort.class, any()), - "SortRemoveRule"); + /** + * Creates a SortRemoveRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public SortRemoveRule(RelBuilderFactory relBuilderFactory) { + super(operand(Sort.class, any()), relBuilderFactory, "SortRemoveRule"); } @Override public void onMatch(RelOptRuleCall call) { http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/SubQueryRemoveRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/SubQueryRemoveRule.java b/core/src/main/java/org/apache/calcite/rel/rules/SubQueryRemoveRule.java index 3bed2b3..12ee805 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/SubQueryRemoveRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/SubQueryRemoveRule.java @@ -148,7 +148,14 @@ public abstract class SubQueryRemoveRule extends RelOptRule { } }; - private SubQueryRemoveRule(RelOptRuleOperand operand, + /** + * Creates a SubQueryRemoveRule. + * + * @param operand root operand, must not be null + * @param description Description, or null to guess description + * @param relBuilderFactory Builder for relational expressions + */ + public SubQueryRemoveRule(RelOptRuleOperand operand, RelBuilderFactory relBuilderFactory, String description) { super(operand, relBuilderFactory, description); http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/TableScanRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/TableScanRule.java b/core/src/main/java/org/apache/calcite/rel/rules/TableScanRule.java index 208fc89..851c7c3 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/TableScanRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/TableScanRule.java @@ -21,7 +21,9 @@ import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.plan.RelOptTable; import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.logical.LogicalTableScan; +import org.apache.calcite.tools.RelBuilderFactory; /** * Planner rule that converts a @@ -31,12 +33,18 @@ import org.apache.calcite.rel.logical.LogicalTableScan; public class TableScanRule extends RelOptRule { //~ Static fields/initializers --------------------------------------------- - public static final TableScanRule INSTANCE = new TableScanRule(); + public static final TableScanRule INSTANCE = + new TableScanRule(RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- - private TableScanRule() { - super(operand(LogicalTableScan.class, any())); + /** + * Creates a TableScanRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public TableScanRule(RelBuilderFactory relBuilderFactory) { + super(operand(LogicalTableScan.class, any()), relBuilderFactory, null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/UnionEliminatorRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/UnionEliminatorRule.java b/core/src/main/java/org/apache/calcite/rel/rules/UnionEliminatorRule.java index 4e908ec..024dd4e 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/UnionEliminatorRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/UnionEliminatorRule.java @@ -18,8 +18,10 @@ package org.apache.calcite.rel.rules; import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.plan.RelOptRuleCall; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.Union; import org.apache.calcite.rel.logical.LogicalUnion; +import org.apache.calcite.tools.RelBuilderFactory; /** * <code>UnionEliminatorRule</code> checks to see if its possible to optimize a @@ -28,15 +30,16 @@ import org.apache.calcite.rel.logical.LogicalUnion; */ public class UnionEliminatorRule extends RelOptRule { public static final UnionEliminatorRule INSTANCE = - new UnionEliminatorRule(LogicalUnion.class); + new UnionEliminatorRule(LogicalUnion.class, RelFactories.LOGICAL_BUILDER); //~ Constructors ----------------------------------------------------------- /** * Creates a UnionEliminatorRule. */ - private UnionEliminatorRule(Class<? extends Union> clazz) { - super(operand(clazz, any())); + public UnionEliminatorRule(Class<? extends Union> clazz, + RelBuilderFactory relBuilderFactory) { + super(operand(clazz, any()), relBuilderFactory, null); } //~ Methods ---------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/UnionPullUpConstantsRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/UnionPullUpConstantsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/UnionPullUpConstantsRule.java index 05e42be..9fb0426 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/UnionPullUpConstantsRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/UnionPullUpConstantsRule.java @@ -51,7 +51,7 @@ public class UnionPullUpConstantsRule extends RelOptRule { new UnionPullUpConstantsRule(Union.class, RelFactories.LOGICAL_BUILDER); /** Creates a UnionPullUpConstantsRule. */ - protected UnionPullUpConstantsRule(Class<? extends Union> unionClass, + public UnionPullUpConstantsRule(Class<? extends Union> unionClass, RelBuilderFactory relBuilderFactory) { super(operand(unionClass, any()), relBuilderFactory, null); } http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java index 7a194c0..f7d5b15 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java @@ -21,6 +21,7 @@ import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.plan.RelOptRuleCall; import org.apache.calcite.plan.RelOptRuleOperand; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.Values; import org.apache.calcite.rel.logical.LogicalFilter; import org.apache.calcite.rel.logical.LogicalProject; @@ -32,6 +33,7 @@ import org.apache.calcite.rex.RexLiteral; import org.apache.calcite.rex.RexNode; import org.apache.calcite.rex.RexShuttle; import org.apache.calcite.rex.RexUtil; +import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.Util; import org.apache.calcite.util.trace.CalciteTrace; @@ -74,6 +76,7 @@ public abstract class ValuesReduceRule extends RelOptRule { new ValuesReduceRule( operand(LogicalFilter.class, operand(LogicalValues.class, null, Values.IS_NOT_EMPTY, none())), + RelFactories.LOGICAL_BUILDER, "ValuesReduceRule(Filter)") { public void onMatch(RelOptRuleCall call) { LogicalFilter filter = call.rel(0); @@ -90,6 +93,7 @@ public abstract class ValuesReduceRule extends RelOptRule { new ValuesReduceRule( operand(LogicalProject.class, operand(LogicalValues.class, null, Values.IS_NOT_EMPTY, none())), + RelFactories.LOGICAL_BUILDER, "ValuesReduceRule(Project)") { public void onMatch(RelOptRuleCall call) { LogicalProject project = call.rel(0); @@ -108,6 +112,7 @@ public abstract class ValuesReduceRule extends RelOptRule { operand(LogicalFilter.class, operand(LogicalValues.class, null, Values.IS_NOT_EMPTY, none()))), + RelFactories.LOGICAL_BUILDER, "ValuesReduceRule(Project-Filter)") { public void onMatch(RelOptRuleCall call) { LogicalProject project = call.rel(0); @@ -122,10 +127,13 @@ public abstract class ValuesReduceRule extends RelOptRule { /** * Creates a ValuesReduceRule. * - * @param operand class of rels to which this rule should apply + * @param operand Class of rels to which this rule should apply + * @param relBuilderFactory Builder for relational expressions + * @param desc Description, or null to guess description */ - private ValuesReduceRule(RelOptRuleOperand operand, String desc) { - super(operand, desc); + public ValuesReduceRule(RelOptRuleOperand operand, + RelBuilderFactory relBuilderFactory, String desc) { + super(operand, relBuilderFactory, desc); Util.discard(LOGGER); } http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java b/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java index 80ee68f..a1e0d58 100644 --- a/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java +++ b/core/src/main/java/org/apache/calcite/rel/stream/StreamRules.java @@ -26,6 +26,7 @@ import org.apache.calcite.rel.core.Aggregate; import org.apache.calcite.rel.core.Filter; import org.apache.calcite.rel.core.Join; import org.apache.calcite.rel.core.Project; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.Sort; import org.apache.calcite.rel.core.TableScan; import org.apache.calcite.rel.core.Union; @@ -40,6 +41,7 @@ import org.apache.calcite.rel.logical.LogicalUnion; import org.apache.calcite.schema.StreamableTable; import org.apache.calcite.schema.Table; import org.apache.calcite.tools.RelBuilder; +import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.Util; import com.google.common.collect.ImmutableList; @@ -55,21 +57,28 @@ public class StreamRules { public static final ImmutableList<RelOptRule> RULES = ImmutableList.of( - new DeltaProjectTransposeRule(), - new DeltaFilterTransposeRule(), - new DeltaAggregateTransposeRule(), - new DeltaSortTransposeRule(), - new DeltaUnionTransposeRule(), - new DeltaJoinTransposeRule(), - new DeltaTableScanRule(), - new DeltaTableScanToEmptyRule()); + new DeltaProjectTransposeRule(RelFactories.LOGICAL_BUILDER), + new DeltaFilterTransposeRule(RelFactories.LOGICAL_BUILDER), + new DeltaAggregateTransposeRule(RelFactories.LOGICAL_BUILDER), + new DeltaSortTransposeRule(RelFactories.LOGICAL_BUILDER), + new DeltaUnionTransposeRule(RelFactories.LOGICAL_BUILDER), + new DeltaJoinTransposeRule(RelFactories.LOGICAL_BUILDER), + new DeltaTableScanRule(RelFactories.LOGICAL_BUILDER), + new DeltaTableScanToEmptyRule(RelFactories.LOGICAL_BUILDER)); /** Planner rule that pushes a {@link Delta} through a {@link Project}. */ public static class DeltaProjectTransposeRule extends RelOptRule { - private DeltaProjectTransposeRule() { + + /** + * Creates a DeltaProjectTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DeltaProjectTransposeRule(RelBuilderFactory relBuilderFactory) { super( operand(Delta.class, - operand(Project.class, any()))); + operand(Project.class, any())), + relBuilderFactory, null); } @Override public void onMatch(RelOptRuleCall call) { @@ -86,10 +95,17 @@ public class StreamRules { /** Planner rule that pushes a {@link Delta} through a {@link Filter}. */ public static class DeltaFilterTransposeRule extends RelOptRule { - private DeltaFilterTransposeRule() { + + /** + * Creates a DeltaFilterTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DeltaFilterTransposeRule(RelBuilderFactory relBuilderFactory) { super( operand(Delta.class, - operand(Filter.class, any()))); + operand(Filter.class, any())), + relBuilderFactory, null); } @Override public void onMatch(RelOptRuleCall call) { @@ -105,10 +121,17 @@ public class StreamRules { /** Planner rule that pushes a {@link Delta} through an {@link Aggregate}. */ public static class DeltaAggregateTransposeRule extends RelOptRule { - private DeltaAggregateTransposeRule() { + + /** + * Creates a DeltaAggregateTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DeltaAggregateTransposeRule(RelBuilderFactory relBuilderFactory) { super( operand(Delta.class, - operand(Aggregate.class, null, Aggregate.NO_INDICATOR, any()))); + operand(Aggregate.class, null, Aggregate.NO_INDICATOR, any())), + relBuilderFactory, null); } @Override public void onMatch(RelOptRuleCall call) { @@ -126,10 +149,17 @@ public class StreamRules { /** Planner rule that pushes a {@link Delta} through an {@link Sort}. */ public static class DeltaSortTransposeRule extends RelOptRule { - private DeltaSortTransposeRule() { + + /** + * Creates a DeltaSortTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DeltaSortTransposeRule(RelBuilderFactory relBuilderFactory) { super( operand(Delta.class, - operand(Sort.class, any()))); + operand(Sort.class, any())), + relBuilderFactory, null); } @Override public void onMatch(RelOptRuleCall call) { @@ -146,10 +176,17 @@ public class StreamRules { /** Planner rule that pushes a {@link Delta} through an {@link Union}. */ public static class DeltaUnionTransposeRule extends RelOptRule { - private DeltaUnionTransposeRule() { + + /** + * Creates a DeltaUnionTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DeltaUnionTransposeRule(RelBuilderFactory relBuilderFactory) { super( operand(Delta.class, - operand(Union.class, any()))); + operand(Union.class, any())), + relBuilderFactory, null); } @Override public void onMatch(RelOptRuleCall call) { @@ -174,10 +211,17 @@ public class StreamRules { * with the other relations in the system. The Delta disappears and the stream * can be implemented directly. */ public static class DeltaTableScanRule extends RelOptRule { - private DeltaTableScanRule() { + + /** + * Creates a DeltaTableScanRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DeltaTableScanRule(RelBuilderFactory relBuilderFactory) { super( operand(Delta.class, - operand(TableScan.class, none()))); + operand(TableScan.class, none())), + relBuilderFactory, null); } @Override public void onMatch(RelOptRuleCall call) { @@ -208,10 +252,17 @@ public class StreamRules { * an empty {@link Values}. */ public static class DeltaTableScanToEmptyRule extends RelOptRule { - private DeltaTableScanToEmptyRule() { + + /** + * Creates a DeltaTableScanToEmptyRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DeltaTableScanToEmptyRule(RelBuilderFactory relBuilderFactory) { super( operand(Delta.class, - operand(TableScan.class, none()))); + operand(TableScan.class, none())), + relBuilderFactory, null); } @Override public void onMatch(RelOptRuleCall call) { @@ -239,10 +290,21 @@ public class StreamRules { */ public static class DeltaJoinTransposeRule extends RelOptRule { + @Deprecated // to be removed before 2.0 public DeltaJoinTransposeRule() { + this(RelFactories.LOGICAL_BUILDER); + } + + /** + * Creates a DeltaJoinTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DeltaJoinTransposeRule(RelBuilderFactory relBuilderFactory) { super( operand(Delta.class, - operand(Join.class, any()))); + operand(Join.class, any())), + relBuilderFactory, null); } public void onMatch(RelOptRuleCall call) { http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java b/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java index 3145db5..c88fe24 100644 --- a/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java +++ b/core/src/test/java/org/apache/calcite/test/HepPlannerTest.java @@ -20,6 +20,7 @@ import org.apache.calcite.plan.hep.HepMatchOrder; import org.apache.calcite.plan.hep.HepPlanner; import org.apache.calcite.plan.hep.HepProgram; import org.apache.calcite.plan.hep.HepProgramBuilder; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.logical.LogicalIntersect; import org.apache.calcite.rel.logical.LogicalUnion; import org.apache.calcite.rel.rules.CalcMergeRule; @@ -61,8 +62,12 @@ public class HepPlannerTest extends RelOptTestBase { new HepPlanner( programBuilder.build()); - planner.addRule(new CoerceInputsRule(LogicalUnion.class, false)); - planner.addRule(new CoerceInputsRule(LogicalIntersect.class, false)); + planner.addRule( + new CoerceInputsRule(LogicalUnion.class, false, + RelFactories.LOGICAL_BUILDER)); + planner.addRule( + new CoerceInputsRule(LogicalIntersect.class, false, + RelFactories.LOGICAL_BUILDER)); checkPlanning(planner, "(select name from dept union select ename from emp)" http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java ---------------------------------------------------------------------- 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 c6bc035..53c2c6a 100644 --- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java @@ -33,6 +33,7 @@ import org.apache.calcite.rel.core.Intersect; import org.apache.calcite.rel.core.Join; import org.apache.calcite.rel.core.JoinRelType; import org.apache.calcite.rel.core.Minus; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.core.Union; import org.apache.calcite.rel.logical.LogicalTableModify; import org.apache.calcite.rel.metadata.CachingRelMetadataProvider; @@ -2211,7 +2212,8 @@ public class RelOptRulesTest extends RelOptTestBase { // Simulate the way INSERT will insert casts to the target types .addRuleInstance( - new CoerceInputsRule(LogicalTableModify.class, false)) + new CoerceInputsRule(LogicalTableModify.class, false, + RelFactories.LOGICAL_BUILDER)) // Convert projects to calcs, merge two calcs, and then // reduce redundant casts in merged calc. http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java ---------------------------------------------------------------------- diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java index 7a22012..6779ded 100644 --- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java +++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidRules.java @@ -55,6 +55,7 @@ import org.apache.calcite.sql.fun.SqlStdOperatorTable; import org.apache.calcite.sql.type.SqlTypeFamily; import org.apache.calcite.sql.type.SqlTypeName; import org.apache.calcite.tools.RelBuilder; +import org.apache.calcite.tools.RelBuilderFactory; import org.apache.calcite.util.ImmutableBitSet; import org.apache.calcite.util.Pair; import org.apache.calcite.util.Util; @@ -85,26 +86,30 @@ public class DruidRules { protected static final Logger LOGGER = CalciteTrace.getPlannerTracer(); - public static final DruidFilterRule FILTER = new DruidFilterRule(); - public static final DruidProjectRule PROJECT = new DruidProjectRule(); - public static final DruidAggregateRule AGGREGATE = new DruidAggregateRule(); + public static final DruidFilterRule FILTER = + new DruidFilterRule(RelFactories.LOGICAL_BUILDER); + public static final DruidProjectRule PROJECT = + new DruidProjectRule(RelFactories.LOGICAL_BUILDER); + public static final DruidAggregateRule AGGREGATE = + new DruidAggregateRule(RelFactories.LOGICAL_BUILDER); public static final DruidAggregateProjectRule AGGREGATE_PROJECT = - new DruidAggregateProjectRule(); - public static final DruidSortRule SORT = new DruidSortRule(); + new DruidAggregateProjectRule(RelFactories.LOGICAL_BUILDER); + public static final DruidSortRule SORT = + new DruidSortRule(RelFactories.LOGICAL_BUILDER); public static final DruidSortProjectTransposeRule SORT_PROJECT_TRANSPOSE = - new DruidSortProjectTransposeRule(); + new DruidSortProjectTransposeRule(RelFactories.LOGICAL_BUILDER); public static final DruidProjectSortTransposeRule PROJECT_SORT_TRANSPOSE = - new DruidProjectSortTransposeRule(); + new DruidProjectSortTransposeRule(RelFactories.LOGICAL_BUILDER); public static final DruidProjectFilterTransposeRule PROJECT_FILTER_TRANSPOSE = - new DruidProjectFilterTransposeRule(); + new DruidProjectFilterTransposeRule(RelFactories.LOGICAL_BUILDER); public static final DruidFilterProjectTransposeRule FILTER_PROJECT_TRANSPOSE = - new DruidFilterProjectTransposeRule(); + new DruidFilterProjectTransposeRule(RelFactories.LOGICAL_BUILDER); public static final DruidAggregateFilterTransposeRule AGGREGATE_FILTER_TRANSPOSE = - new DruidAggregateFilterTransposeRule(); + new DruidAggregateFilterTransposeRule(RelFactories.LOGICAL_BUILDER); public static final DruidFilterAggregateTransposeRule FILTER_AGGREGATE_TRANSPOSE = - new DruidFilterAggregateTransposeRule(); + new DruidFilterAggregateTransposeRule(RelFactories.LOGICAL_BUILDER); public static final DruidPostAggregationProjectRule POST_AGGREGATION_PROJECT = - new DruidPostAggregationProjectRule(); + new DruidPostAggregationProjectRule(RelFactories.LOGICAL_BUILDER); public static final List<RelOptRule> RULES = ImmutableList.of(FILTER, @@ -181,9 +186,16 @@ public class DruidRules { /** * Rule to push a {@link org.apache.calcite.rel.core.Filter} into a {@link DruidQuery}. */ - private static class DruidFilterRule extends RelOptRule { - private DruidFilterRule() { - super(operand(Filter.class, operand(DruidQuery.class, none()))); + public static class DruidFilterRule extends RelOptRule { + + /** + * Creates a DruidFilterRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DruidFilterRule(RelBuilderFactory relBuilderFactory) { + super(operand(Filter.class, operand(DruidQuery.class, none())), + relBuilderFactory, null); } public void onMatch(RelOptRuleCall call) { @@ -316,9 +328,16 @@ public class DruidRules { /** * Rule to push a {@link org.apache.calcite.rel.core.Project} into a {@link DruidQuery}. */ - private static class DruidProjectRule extends RelOptRule { - private DruidProjectRule() { - super(operand(Project.class, operand(DruidQuery.class, none()))); + public static class DruidProjectRule extends RelOptRule { + + /** + * Creates a DruidProjectRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DruidProjectRule(RelBuilderFactory relBuilderFactory) { + super(operand(Project.class, operand(DruidQuery.class, none())), + relBuilderFactory, null); } public void onMatch(RelOptRuleCall call) { @@ -412,8 +431,18 @@ public class DruidRules { * Post aggregator. */ public static class DruidPostAggregationProjectRule extends RelOptRule { - private DruidPostAggregationProjectRule() { - super(operand(Project.class, operand(DruidQuery.class, none()))); + + /** + * Creates a DruidPostAggregationProjectRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DruidPostAggregationProjectRule( + RelBuilderFactory relBuilderFactory) { + super( + operand(Project.class, + operand(DruidQuery.class, none())), + relBuilderFactory, null); } public void onMatch(RelOptRuleCall call) { @@ -603,9 +632,16 @@ public class DruidRules { /** * Rule to push an {@link org.apache.calcite.rel.core.Aggregate} into a {@link DruidQuery}. */ - private static class DruidAggregateRule extends RelOptRule { - private DruidAggregateRule() { - super(operand(Aggregate.class, operand(DruidQuery.class, none()))); + public static class DruidAggregateRule extends RelOptRule { + + /** + * Creates a DruidAggregateRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DruidAggregateRule(RelBuilderFactory relBuilderFactory) { + super(operand(Aggregate.class, operand(DruidQuery.class, none())), + relBuilderFactory, null); } public void onMatch(RelOptRuleCall call) { @@ -642,12 +678,19 @@ public class DruidRules { * Rule to push an {@link org.apache.calcite.rel.core.Aggregate} and * {@link org.apache.calcite.rel.core.Project} into a {@link DruidQuery}. */ - private static class DruidAggregateProjectRule extends RelOptRule { - private DruidAggregateProjectRule() { + public static class DruidAggregateProjectRule extends RelOptRule { + + /** + * Creates a DruidAggregateProjectRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DruidAggregateProjectRule(RelBuilderFactory relBuilderFactory) { super( operand(Aggregate.class, operand(Project.class, - operand(DruidQuery.class, none())))); + operand(DruidQuery.class, none()))), + relBuilderFactory, null); } public void onMatch(RelOptRuleCall call) { @@ -960,12 +1003,19 @@ public class DruidRules { * {@link org.apache.calcite.rel.core.Project}. Useful to transform * to complex Druid queries. */ - private static class DruidSortProjectTransposeRule + public static class DruidSortProjectTransposeRule extends SortProjectTransposeRule { - private DruidSortProjectTransposeRule() { + + /** + * Creates a DruidSortProjectTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DruidSortProjectTransposeRule(RelBuilderFactory relBuilderFactory) { super( operand(Sort.class, - operand(Project.class, operand(DruidQuery.class, none())))); + operand(Project.class, operand(DruidQuery.class, none()))), + relBuilderFactory, null); } } @@ -974,12 +1024,19 @@ public class DruidRules { * {@link org.apache.calcite.rel.core.Sort}. Useful if after pushing Sort, * we could not push it inside DruidQuery. */ - private static class DruidProjectSortTransposeRule + public static class DruidProjectSortTransposeRule extends ProjectSortTransposeRule { - private DruidProjectSortTransposeRule() { + + /** + * Creates a DruidProjectSortTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DruidProjectSortTransposeRule(RelBuilderFactory relBuilderFactory) { super( operand(Project.class, - operand(Sort.class, operand(DruidQuery.class, none())))); + operand(Sort.class, operand(DruidQuery.class, none()))), + relBuilderFactory, null); } } @@ -987,9 +1044,16 @@ public class DruidRules { * Rule to push a {@link org.apache.calcite.rel.core.Sort} * into a {@link DruidQuery}. */ - private static class DruidSortRule extends RelOptRule { - private DruidSortRule() { - super(operand(Sort.class, operand(DruidQuery.class, none()))); + public static class DruidSortRule extends RelOptRule { + + /** + * Creates a DruidSortRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DruidSortRule(RelBuilderFactory relBuilderFactory) { + super(operand(Sort.class, operand(DruidQuery.class, none())), + relBuilderFactory, null); } public void onMatch(RelOptRuleCall call) { @@ -1139,15 +1203,22 @@ public class DruidRules { * past a {@link org.apache.calcite.rel.core.Filter} * when {@code Filter} is on top of a {@link DruidQuery}. */ - private static class DruidProjectFilterTransposeRule + public static class DruidProjectFilterTransposeRule extends ProjectFilterTransposeRule { - private DruidProjectFilterTransposeRule() { + + /** + * Creates a DruidProjectFilterTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DruidProjectFilterTransposeRule( + RelBuilderFactory relBuilderFactory) { super( operand(Project.class, operand(Filter.class, operand(DruidQuery.class, none()))), PushProjector.ExprCondition.FALSE, - RelFactories.LOGICAL_BUILDER); + relBuilderFactory); } } @@ -1156,14 +1227,21 @@ public class DruidRules { * past a {@link org.apache.calcite.rel.core.Project} * when {@code Project} is on top of a {@link DruidQuery}. */ - private static class DruidFilterProjectTransposeRule + public static class DruidFilterProjectTransposeRule extends FilterProjectTransposeRule { - private DruidFilterProjectTransposeRule() { + + /** + * Creates a DruidFilterProjectTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DruidFilterProjectTransposeRule( + RelBuilderFactory relBuilderFactory) { super( operand(Filter.class, operand(Project.class, operand(DruidQuery.class, none()))), - true, true, RelFactories.LOGICAL_BUILDER); + true, true, relBuilderFactory); } } @@ -1172,14 +1250,21 @@ public class DruidRules { * past a {@link org.apache.calcite.rel.core.Filter} * when {@code Filter} is on top of a {@link DruidQuery}. */ - private static class DruidAggregateFilterTransposeRule + public static class DruidAggregateFilterTransposeRule extends AggregateFilterTransposeRule { - private DruidAggregateFilterTransposeRule() { + + /** + * Creates a DruidAggregateFilterTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DruidAggregateFilterTransposeRule( + RelBuilderFactory relBuilderFactory) { super( operand(Aggregate.class, operand(Filter.class, operand(DruidQuery.class, none()))), - RelFactories.LOGICAL_BUILDER); + relBuilderFactory); } } @@ -1188,14 +1273,21 @@ public class DruidRules { * past an {@link org.apache.calcite.rel.core.Aggregate} * when {@code Aggregate} is on top of a {@link DruidQuery}. */ - private static class DruidFilterAggregateTransposeRule + public static class DruidFilterAggregateTransposeRule extends FilterAggregateTransposeRule { - private DruidFilterAggregateTransposeRule() { + + /** + * Creates a DruidFilterAggregateTransposeRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public DruidFilterAggregateTransposeRule( + RelBuilderFactory relBuilderFactory) { super( operand(Filter.class, operand(Aggregate.class, operand(DruidQuery.class, none()))), - RelFactories.LOGICAL_BUILDER); + relBuilderFactory); } } } http://git-wip-us.apache.org/repos/asf/calcite/blob/d407395e/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java ---------------------------------------------------------------------- diff --git a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java index b0851c7..9c136a9 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvProjectTableScanRule.java @@ -18,9 +18,11 @@ package org.apache.calcite.adapter.csv; import org.apache.calcite.plan.RelOptRule; import org.apache.calcite.plan.RelOptRuleCall; +import org.apache.calcite.rel.core.RelFactories; import org.apache.calcite.rel.logical.LogicalProject; import org.apache.calcite.rex.RexInputRef; import org.apache.calcite.rex.RexNode; +import org.apache.calcite.tools.RelBuilderFactory; import java.util.List; @@ -31,12 +33,18 @@ import java.util.List; */ public class CsvProjectTableScanRule extends RelOptRule { public static final CsvProjectTableScanRule INSTANCE = - new CsvProjectTableScanRule(); + new CsvProjectTableScanRule(RelFactories.LOGICAL_BUILDER); - private CsvProjectTableScanRule() { + /** + * Creates a CsvProjectTableScanRule. + * + * @param relBuilderFactory Builder for relational expressions + */ + public CsvProjectTableScanRule(RelBuilderFactory relBuilderFactory) { super( operand(LogicalProject.class, operand(CsvTableScan.class, none())), + relBuilderFactory, "CsvProjectTableScanRule"); }
