You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jc...@apache.org on 2018/04/09 08:38:52 UTC
calcite git commit: [CALCITE-2242] Using custom RelBuilder for
FilterRemoveIsNotDistinctFromRule (Vitalii Diravka)
Repository: calcite
Updated Branches:
refs/heads/master d023671a3 -> 8c1b34e35
[CALCITE-2242] Using custom RelBuilder for FilterRemoveIsNotDistinctFromRule (Vitalii Diravka)
Close apache/calcite#659
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/8c1b34e3
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/8c1b34e3
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/8c1b34e3
Branch: refs/heads/master
Commit: 8c1b34e3518620ac023f43b170610c9b783f1ae5
Parents: d023671
Author: Vitalii Diravka <vi...@gmail.com>
Authored: Fri Apr 6 17:41:07 2018 +0300
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Mon Apr 9 10:38:39 2018 +0200
----------------------------------------------------------------------
.../FilterRemoveIsNotDistinctFromRule.java | 20 +++++++-------
.../apache/calcite/test/RelOptRulesTest.java | 29 ++++++++++++++++++++
.../org/apache/calcite/test/RelOptRulesTest.xml | 14 ++++++++++
3 files changed, 53 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/8c1b34e3/core/src/main/java/org/apache/calcite/rel/rules/FilterRemoveIsNotDistinctFromRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/FilterRemoveIsNotDistinctFromRule.java b/core/src/main/java/org/apache/calcite/rel/rules/FilterRemoveIsNotDistinctFromRule.java
index 5739ed9..c5a5649 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/FilterRemoveIsNotDistinctFromRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterRemoveIsNotDistinctFromRule.java
@@ -20,20 +20,20 @@ import org.apache.calcite.plan.RelOptRule;
import org.apache.calcite.plan.RelOptRuleCall;
import org.apache.calcite.plan.RelOptUtil;
import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Filter;
import org.apache.calcite.rel.core.RelFactories;
-import org.apache.calcite.rel.logical.LogicalFilter;
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexCall;
import org.apache.calcite.rex.RexNode;
import org.apache.calcite.rex.RexShuttle;
import org.apache.calcite.rex.RexUtil;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
+import org.apache.calcite.tools.RelBuilder;
import org.apache.calcite.tools.RelBuilderFactory;
/**
* Planner rule that replaces {@code IS NOT DISTINCT FROM}
- * in a {@link org.apache.calcite.rel.logical.LogicalFilter}
- * with logically equivalent operations.
+ * in a {@link Filter} with logically equivalent operations.
*
* @see org.apache.calcite.sql.fun.SqlStdOperatorTable#IS_NOT_DISTINCT_FROM
*/
@@ -53,13 +53,13 @@ public final class FilterRemoveIsNotDistinctFromRule extends RelOptRule {
*/
public FilterRemoveIsNotDistinctFromRule(
RelBuilderFactory relBuilderFactory) {
- super(operand(LogicalFilter.class, any()), relBuilderFactory, null);
+ super(operand(Filter.class, any()), relBuilderFactory, null);
}
//~ Methods ----------------------------------------------------------------
public void onMatch(RelOptRuleCall call) {
- LogicalFilter oldFilter = call.rel(0);
+ Filter oldFilter = call.rel(0);
RexNode oldFilterCond = oldFilter.getCondition();
if (RexUtil.findOperatorCall(
@@ -77,11 +77,11 @@ public final class FilterRemoveIsNotDistinctFromRule extends RelOptRule {
new RemoveIsNotDistinctFromRexShuttle(
oldFilter.getCluster().getRexBuilder());
- final RelFactories.FilterFactory factory =
- RelFactories.DEFAULT_FILTER_FACTORY;
- RelNode newFilterRel =
- factory.createFilter(oldFilter.getInput(),
- oldFilterCond.accept(rewriteShuttle));
+ final RelBuilder relBuilder = call.builder();
+ final RelNode newFilterRel = relBuilder
+ .push(oldFilter.getInput())
+ .filter(oldFilterCond.accept(rewriteShuttle))
+ .build();
call.transformTo(newFilterRel);
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/8c1b34e3/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 9fa401f..776b666 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -64,6 +64,7 @@ import org.apache.calcite.rel.rules.FilterAggregateTransposeRule;
import org.apache.calcite.rel.rules.FilterJoinRule;
import org.apache.calcite.rel.rules.FilterMergeRule;
import org.apache.calcite.rel.rules.FilterProjectTransposeRule;
+import org.apache.calcite.rel.rules.FilterRemoveIsNotDistinctFromRule;
import org.apache.calcite.rel.rules.FilterSetOpTransposeRule;
import org.apache.calcite.rel.rules.FilterToCalcRule;
import org.apache.calcite.rel.rules.IntersectToDistinctRule;
@@ -105,6 +106,7 @@ import org.apache.calcite.rex.RexNode;
import org.apache.calcite.runtime.Hook;
import org.apache.calcite.runtime.PredicateImpl;
import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.sql.validate.SqlValidator;
import org.apache.calcite.sql2rel.SqlToRelConverter;
@@ -3817,6 +3819,33 @@ public class RelOptRulesTest extends RelOptTestBase {
sql(sql).with(program).withContext(context).check();
}
+ @Test public void testFilterRemoveIsNotDistinctFromRule() {
+ final DiffRepository diffRepos = getDiffRepos();
+ final RelBuilder builder = RelBuilder.create(RelBuilderTest.config().build());
+ RelNode root = builder
+ .scan("EMP")
+ .filter(
+ builder.call(SqlStdOperatorTable.IS_NOT_DISTINCT_FROM,
+ builder.field("DEPTNO"), builder.literal(20)))
+ .build();
+
+ HepProgram preProgram = new HepProgramBuilder().build();
+ HepPlanner prePlanner = new HepPlanner(preProgram);
+ prePlanner.setRoot(root);
+ final RelNode relBefore = prePlanner.findBestExp();
+ final String planBefore = NL + RelOptUtil.toString(relBefore);
+ diffRepos.assertEquals("planBefore", "${planBefore}", planBefore);
+
+ HepProgram hepProgram = new HepProgramBuilder()
+ .addRuleInstance(FilterRemoveIsNotDistinctFromRule.INSTANCE)
+ .build();
+
+ HepPlanner hepPlanner = new HepPlanner(hepProgram);
+ hepPlanner.setRoot(root);
+ final RelNode relAfter = hepPlanner.findBestExp();
+ final String planAfter = NL + RelOptUtil.toString(relAfter);
+ diffRepos.assertEquals("planAfter", "${planAfter}", planAfter);
+ }
}
// End RelOptRulesTest.java
http://git-wip-us.apache.org/repos/asf/calcite/blob/8c1b34e3/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 8fae1ff..77ddbd3 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -8284,4 +8284,18 @@ LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$
]]>
</Resource>
</TestCase>
+ <TestCase name="testFilterRemoveIsNotDistinctFromRule">
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalFilter(condition=[IS NOT DISTINCT FROM($7, 20)])
+ LogicalTableScan(table=[[scott, EMP]])
+]]>
+ </Resource>
+ <Resource name="planAfter">
+ <![CDATA[
+LogicalFilter(condition=[CASE(IS NULL($7), IS NULL(20), =(CAST($7):TINYINT NOT NULL, 20))])
+ LogicalTableScan(table=[[scott, EMP]])
+]]>
+ </Resource>
+ </TestCase>
</Root>