You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2014/08/25 20:42:31 UTC
[6/8] git commit: [OPTIQ-382] Refactoring rules to use factories
[OPTIQ-382] Refactoring rules to use factories
Project: http://git-wip-us.apache.org/repos/asf/incubator-optiq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-optiq/commit/48bcaddc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-optiq/tree/48bcaddc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-optiq/diff/48bcaddc
Branch: refs/heads/master
Commit: 48bcaddc9a3bf4b5a34a430e927a90efba62b8f6
Parents: 5836698
Author: John Pullokkaran <jp...@hortonworks.com>
Authored: Wed Aug 20 17:50:54 2014 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Aug 22 00:55:36 2014 -0700
----------------------------------------------------------------------
.../eigenbase/rel/rules/MergeFilterRule.java | 24 ++++++++++---------
.../eigenbase/rel/rules/MergeProjectRule.java | 8 +++----
.../rel/rules/PushFilterPastJoinRule.java | 25 +++++++++++++-------
.../rel/rules/PushFilterPastSetOpRule.java | 2 +-
.../rel/rules/RemoveTrivialProjectRule.java | 8 +++----
.../java/org/eigenbase/relopt/RelOptUtil.java | 24 +++++++++++++++++--
6 files changed, 61 insertions(+), 30 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/48bcaddc/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java b/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java
index 5725bd5..51cabd0 100644
--- a/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java
+++ b/core/src/main/java/org/eigenbase/rel/rules/MergeFilterRule.java
@@ -24,26 +24,29 @@ import org.eigenbase.rex.*;
* MergeFilterRule implements the rule for combining two {@link FilterRel}s
*/
public class MergeFilterRule extends RelOptRule {
- public static final MergeFilterRule INSTANCE = new MergeFilterRule();
+ public static final MergeFilterRule INSTANCE =
+ new MergeFilterRule(RelFactories.DEFAULT_FILTER_FACTORY);
+
+ private final RelFactories.FilterFactory filterFactory;
//~ Constructors -----------------------------------------------------------
/**
* Creates a MergeFilterRule.
*/
- private MergeFilterRule() {
+ public MergeFilterRule(RelFactories.FilterFactory filterFactory) {
super(
- operand(
- FilterRel.class,
- operand(FilterRel.class, any())));
+ operand(FilterRelBase.class,
+ operand(FilterRelBase.class, any())));
+ this.filterFactory = filterFactory;
}
//~ Methods ----------------------------------------------------------------
// implement RelOptRule
public void onMatch(RelOptRuleCall call) {
- FilterRel topFilter = call.rel(0);
- FilterRel bottomFilter = call.rel(1);
+ final FilterRelBase topFilter = call.rel(0);
+ final FilterRelBase bottomFilter = call.rel(1);
// use RexPrograms to merge the two FilterRels into a single program
// so we can convert the two FilterRel conditions to directly
@@ -62,9 +65,8 @@ public class MergeFilterRule extends RelOptRule {
mergedProgram.expandLocalRef(
mergedProgram.getCondition());
- FilterRel newFilterRel =
- new FilterRel(
- topFilter.getCluster(),
+ FilterRelBase newFilterRel =
+ (FilterRelBase) filterFactory.createFilter(
bottomFilter.getChild(),
newCondition);
@@ -77,7 +79,7 @@ public class MergeFilterRule extends RelOptRule {
* @param filterRel the FilterRel
* @return created RexProgram
*/
- private RexProgram createProgram(FilterRel filterRel) {
+ private RexProgram createProgram(FilterRelBase filterRel) {
RexProgramBuilder programBuilder =
new RexProgramBuilder(
filterRel.getRowType(),
http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/48bcaddc/core/src/main/java/org/eigenbase/rel/rules/MergeProjectRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rel/rules/MergeProjectRule.java b/core/src/main/java/org/eigenbase/rel/rules/MergeProjectRule.java
index 2a616f0..d802171 100644
--- a/core/src/main/java/org/eigenbase/rel/rules/MergeProjectRule.java
+++ b/core/src/main/java/org/eigenbase/rel/rules/MergeProjectRule.java
@@ -24,7 +24,8 @@ import org.eigenbase.relopt.*;
import org.eigenbase.rex.*;
/**
- * MergeProjectRule merges a {@link ProjectRelBase} into another {@link ProjectRelBase},
+ * MergeProjectRule merges a {@link ProjectRelBase} into
+ * another {@link ProjectRelBase},
* provided the projects aren't projecting identical sets of input references.
*/
public class MergeProjectRule extends RelOptRule {
@@ -56,9 +57,8 @@ public class MergeProjectRule extends RelOptRule {
*/
public MergeProjectRule(boolean force, ProjectFactory pFactory) {
super(
- operand(
- ProjectRel.class,
- operand(ProjectRel.class, any())),
+ operand(ProjectRelBase.class,
+ operand(ProjectRelBase.class, any())),
"MergeProjectRule" + (force ? ": force mode" : ""));
this.force = force;
projectFactory = pFactory;
http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/48bcaddc/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastJoinRule.java b/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastJoinRule.java
index 7ecbd5b..69af944 100644
--- a/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastJoinRule.java
+++ b/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastJoinRule.java
@@ -40,13 +40,16 @@ public abstract class PushFilterPastJoinRule extends RelOptRule {
new PushFilterIntoJoinRule(false);
public static final PushFilterPastJoinRule JOIN =
- new PushDownJoinConditionRule(RelFactories.DEFAULT_FILTER_FACTORY);
+ new PushDownJoinConditionRule(RelFactories.DEFAULT_FILTER_FACTORY,
+ RelFactories.DEFAULT_PROJECT_FACTORY);
/** Whether to try to strengthen join-type. */
private final boolean smart;
private final RelFactories.FilterFactory filterFactory;
+ private final RelFactories.ProjectFactory projectFactory;
+
//~ Constructors -----------------------------------------------------------
/**
@@ -54,10 +57,12 @@ public abstract class PushFilterPastJoinRule extends RelOptRule {
* factories.
*/
protected PushFilterPastJoinRule(RelOptRuleOperand operand, String id,
- boolean smart, RelFactories.FilterFactory filterFactory) {
+ boolean smart, RelFactories.FilterFactory filterFactory,
+ RelFactories.ProjectFactory projectFactory) {
super(operand, "PushFilterRule: " + id);
this.smart = smart;
this.filterFactory = filterFactory;
+ this.projectFactory = projectFactory;
}
//~ Methods ----------------------------------------------------------------
@@ -188,7 +193,8 @@ public abstract class PushFilterPastJoinRule extends RelOptRule {
// Create a project on top of the join if some of the columns have become
// NOT NULL due to the join-type getting stricter.
- newJoinRel = RelOptUtil.createCastRel(newJoinRel, join.getRowType(), false);
+ newJoinRel = RelOptUtil.createCastRel(newJoinRel, join.getRowType(),
+ false, projectFactory);
// create a FilterRel on top of the join if needed
RelNode newRel =
@@ -221,10 +227,11 @@ public abstract class PushFilterPastJoinRule extends RelOptRule {
/** Rule that pushes parts of the join condition to its inputs. */
public static class PushDownJoinConditionRule
extends PushFilterPastJoinRule {
- public PushDownJoinConditionRule(RelFactories.FilterFactory filterFactory) {
+ public PushDownJoinConditionRule(RelFactories.FilterFactory filterFactory,
+ RelFactories.ProjectFactory projectFactory) {
super(RelOptRule.operand(JoinRelBase.class, RelOptRule.any()),
"PushFilterPastJoinRule:no-filter",
- true, filterFactory);
+ true, filterFactory, projectFactory);
}
@Override
@@ -238,16 +245,18 @@ public abstract class PushFilterPastJoinRule extends RelOptRule {
* condition and into the inputs of the join. */
public static class PushFilterIntoJoinRule extends PushFilterPastJoinRule {
public PushFilterIntoJoinRule(boolean smart) {
- this(smart, RelFactories.DEFAULT_FILTER_FACTORY);
+ this(smart, RelFactories.DEFAULT_FILTER_FACTORY,
+ RelFactories.DEFAULT_PROJECT_FACTORY);
}
public PushFilterIntoJoinRule(boolean smart,
- RelFactories.FilterFactory filterFactory) {
+ RelFactories.FilterFactory filterFactory,
+ RelFactories.ProjectFactory projectFactory) {
super(
RelOptRule.operand(FilterRelBase.class,
RelOptRule.operand(JoinRelBase.class, RelOptRule.any())),
"PushFilterPastJoinRule:filter",
- smart, filterFactory);
+ smart, filterFactory, projectFactory);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/48bcaddc/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastSetOpRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastSetOpRule.java b/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastSetOpRule.java
index 6743a3c..14b93cb 100644
--- a/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastSetOpRule.java
+++ b/core/src/main/java/org/eigenbase/rel/rules/PushFilterPastSetOpRule.java
@@ -39,7 +39,7 @@ public class PushFilterPastSetOpRule extends RelOptRule {
/**
* Creates a PushFilterPastSetOpRule.
*/
- private PushFilterPastSetOpRule(RelFactories.FilterFactory filterFactory) {
+ public PushFilterPastSetOpRule(RelFactories.FilterFactory filterFactory) {
super(
operand(FilterRelBase.class,
operand(SetOpRel.class, any())));
http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/48bcaddc/core/src/main/java/org/eigenbase/rel/rules/RemoveTrivialProjectRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rel/rules/RemoveTrivialProjectRule.java b/core/src/main/java/org/eigenbase/rel/rules/RemoveTrivialProjectRule.java
index 630b343..d850351 100644
--- a/core/src/main/java/org/eigenbase/rel/rules/RemoveTrivialProjectRule.java
+++ b/core/src/main/java/org/eigenbase/rel/rules/RemoveTrivialProjectRule.java
@@ -24,7 +24,7 @@ import org.eigenbase.reltype.*;
import org.eigenbase.rex.*;
/**
- * Rule which, given a {@link ProjectRel} node which merely returns its input,
+ * Rule which, given a {@link ProjectRelBase} node which merely returns its input,
* converts the node into its child.
*
* <p>For example, <code>ProjectRel(ArrayReader(a), {$input0})</code> becomes
@@ -44,10 +44,10 @@ public class RemoveTrivialProjectRule extends RelOptRule {
// Create a specialized operand to detect non-matches early. This keeps
// the rule queue short.
super(
- new RelOptRuleOperand(ProjectRel.class, null, any()) {
+ new RelOptRuleOperand(ProjectRelBase.class, null, any()) {
@Override public boolean matches(RelNode rel) {
return super.matches(rel)
- && isTrivial((ProjectRel) rel);
+ && isTrivial((ProjectRelBase) rel);
}
});
}
@@ -55,7 +55,7 @@ public class RemoveTrivialProjectRule extends RelOptRule {
//~ Methods ----------------------------------------------------------------
public void onMatch(RelOptRuleCall call) {
- ProjectRel project = call.rel(0);
+ ProjectRelBase project = call.rel(0);
assert isTrivial(project);
RelNode stripped = project.getChild();
RelNode child = call.getPlanner().register(stripped, project);
http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/48bcaddc/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java b/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
index 2593966..52ddd18 100644
--- a/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
+++ b/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
@@ -496,6 +496,26 @@ public abstract class RelOptUtil {
final RelNode rel,
RelDataType castRowType,
boolean rename) {
+ return createCastRel(rel, castRowType, rename,
+ RelFactories.DEFAULT_PROJECT_FACTORY);
+ }
+
+ /**
+ * Creates a projection which casts a rel's output to a desired row type.
+ *
+ * @param rel producer of rows to be converted
+ * @param castRowType row type after cast
+ * @param rename if true, use field names from castRowType; if false,
+ * preserve field names from rel
+ * @param projectFactory Project Factory
+ * @return conversion rel
+ */
+ public static RelNode createCastRel(
+ final RelNode rel,
+ RelDataType castRowType,
+ boolean rename,
+ RelFactories.ProjectFactory projectFactory) {
+ assert projectFactory != null;
RelDataType rowType = rel.getRowType();
if (areRowTypesEqual(rowType, castRowType, rename)) {
// nothing to do
@@ -506,13 +526,13 @@ public abstract class RelOptUtil {
rel.getCluster().getRexBuilder(), castRowType, rowType);
if (rename) {
// Use names and types from castRowType.
- return CalcRel.createProject(
+ return projectFactory.createProject(
rel,
castExps,
castRowType.getFieldNames());
} else {
// Use names from rowType, types from castRowType.
- return CalcRel.createProject(
+ return projectFactory.createProject(
rel,
castExps,
rowType.getFieldNames());