Java Code Examples for org.apache.calcite.plan.hep.HepProgramBuilder#addRuleInstance()
The following examples show how to use
org.apache.calcite.plan.hep.HepProgramBuilder#addRuleInstance() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: HepPlannerTest.java From calcite with Apache License 2.0 | 6 votes |
/** Tests that if two relational expressions are equivalent, the planner * notices, and only applies the rule once. */ @Test void testCommonSubExpression() { // In the following, // (select 1 from dept where abs(-1)=20) // occurs twice, but it's a common sub-expression, so the rule should only // apply once. HepProgramBuilder programBuilder = HepProgram.builder(); programBuilder.addRuleInstance(FilterToCalcRule.INSTANCE); final HepTestListener listener = new HepTestListener(0); HepPlanner planner = new HepPlanner(programBuilder.build()); planner.addListener(listener); final String sql = "(select 1 from dept where abs(-1)=20)\n" + "union all\n" + "(select 1 from dept where abs(-1)=20)"; planner.setRoot(tester.convertSqlToRel(sql).rel); RelNode bestRel = planner.findBestExp(); assertThat(bestRel.getInput(0).equals(bestRel.getInput(1)), is(true)); assertThat(listener.getApplyTimes() == 1, is(true)); }
Example 2
Source File: HepPlannerTest.java From calcite with Apache License 2.0 | 6 votes |
@Test void testSubprogram() throws Exception { // Verify that subprogram gets re-executed until fixpoint. // In this case, the first time through we limit it to generate // only one calc; the second time through it will generate // a second calc, and then merge them. HepProgramBuilder subprogramBuilder = HepProgram.builder(); subprogramBuilder.addMatchOrder(HepMatchOrder.TOP_DOWN); subprogramBuilder.addMatchLimit(1); subprogramBuilder.addRuleInstance(ProjectToCalcRule.INSTANCE); subprogramBuilder.addRuleInstance(FilterToCalcRule.INSTANCE); subprogramBuilder.addRuleInstance(CalcMergeRule.INSTANCE); HepProgramBuilder programBuilder = HepProgram.builder(); programBuilder.addSubprogram(subprogramBuilder.build()); final String sql = "select upper(ename) from\n" + "(select lower(ename) as ename from emp where empno = 100)"; sql(sql).with(programBuilder.build()).check(); }
Example 3
Source File: HepPlannerTest.java From calcite with Apache License 2.0 | 6 votes |
@Test void testGC() throws Exception { HepProgramBuilder programBuilder = HepProgram.builder(); programBuilder.addMatchOrder(HepMatchOrder.TOP_DOWN); programBuilder.addRuleInstance(CalcMergeRule.INSTANCE); programBuilder.addRuleInstance(ProjectToCalcRule.INSTANCE); programBuilder.addRuleInstance(FilterToCalcRule.INSTANCE); HepPlanner planner = new HepPlanner(programBuilder.build()); planner.setRoot( tester.convertSqlToRel("select upper(name) from dept where deptno=20").rel); planner.findBestExp(); // Reuse of HepPlanner (should trigger GC). planner.setRoot( tester.convertSqlToRel("select upper(name) from dept where deptno=20").rel); planner.findBestExp(); }
Example 4
Source File: AbstractMaterializedViewRule.java From Bats with Apache License 2.0 | 5 votes |
@Override public Pair<RelNode, RelNode> pushFilterToOriginalViewPlan(RelBuilder builder, RelNode topViewProject, RelNode viewNode, RexNode cond) { // We add (and push) the filter to the view plan before triggering the rewriting. // This is useful in case some of the columns can be folded to same value after // filter is added. HepProgramBuilder pushFiltersProgram = new HepProgramBuilder(); if (topViewProject != null) { pushFiltersProgram.addRuleInstance(filterProjectTransposeRule); } pushFiltersProgram.addRuleInstance(this.filterAggregateTransposeRule) .addRuleInstance(this.aggregateProjectPullUpConstantsRule).addRuleInstance(this.projectMergeRule); final HepPlanner tmpPlanner = new HepPlanner(pushFiltersProgram.build()); // Now that the planner is created, push the node RelNode topNode = builder.push(topViewProject != null ? topViewProject : viewNode).filter(cond).build(); tmpPlanner.setRoot(topNode); topNode = tmpPlanner.findBestExp(); RelNode resultTopViewProject = null; RelNode resultViewNode = null; while (topNode != null) { if (topNode instanceof Project) { if (resultTopViewProject != null) { // Both projects could not be merged, we will bail out return Pair.of(topViewProject, viewNode); } resultTopViewProject = topNode; topNode = topNode.getInput(0); } else if (topNode instanceof Aggregate) { resultViewNode = topNode; topNode = null; } else { // We move to the child topNode = topNode.getInput(0); } } return Pair.of(resultTopViewProject, resultViewNode); }
Example 5
Source File: Programs.java From Bats with Apache License 2.0 | 5 votes |
/** Creates a program that executes a list of rules in a HEP planner. */ public static Program hep(Iterable<? extends RelOptRule> rules, boolean noDag, RelMetadataProvider metadataProvider) { final HepProgramBuilder builder = HepProgram.builder(); for (RelOptRule rule : rules) { builder.addRuleInstance(rule); } return of(builder.build(), noDag, metadataProvider); }
Example 6
Source File: MaterializedViewAggregateRule.java From calcite with Apache License 2.0 | 5 votes |
@Override public Pair<RelNode, RelNode> pushFilterToOriginalViewPlan(RelBuilder builder, RelNode topViewProject, RelNode viewNode, RexNode cond) { // We add (and push) the filter to the view plan before triggering the rewriting. // This is useful in case some of the columns can be folded to same value after // filter is added. HepProgramBuilder pushFiltersProgram = new HepProgramBuilder(); if (topViewProject != null) { pushFiltersProgram.addRuleInstance(filterProjectTransposeRule); } pushFiltersProgram .addRuleInstance(this.filterAggregateTransposeRule) .addRuleInstance(this.aggregateProjectPullUpConstantsRule) .addRuleInstance(this.projectMergeRule); final HepPlanner tmpPlanner = new HepPlanner(pushFiltersProgram.build()); // Now that the planner is created, push the node RelNode topNode = builder .push(topViewProject != null ? topViewProject : viewNode) .filter(cond).build(); tmpPlanner.setRoot(topNode); topNode = tmpPlanner.findBestExp(); RelNode resultTopViewProject = null; RelNode resultViewNode = null; while (topNode != null) { if (topNode instanceof Project) { if (resultTopViewProject != null) { // Both projects could not be merged, we will bail out return Pair.of(topViewProject, viewNode); } resultTopViewProject = topNode; topNode = topNode.getInput(0); } else if (topNode instanceof Aggregate) { resultViewNode = topNode; topNode = null; } else { // We move to the child topNode = topNode.getInput(0); } } return Pair.of(resultTopViewProject, resultViewNode); }
Example 7
Source File: Programs.java From calcite with Apache License 2.0 | 5 votes |
/** Creates a program that executes a list of rules in a HEP planner. */ public static Program hep(Iterable<? extends RelOptRule> rules, boolean noDag, RelMetadataProvider metadataProvider) { final HepProgramBuilder builder = HepProgram.builder(); for (RelOptRule rule : rules) { builder.addRuleInstance(rule); } return of(builder.build(), noDag, metadataProvider); }
Example 8
Source File: HepPlannerTest.java From calcite with Apache License 2.0 | 5 votes |
@Test void testMatchLimitOneTopDown() throws Exception { // Verify that only the top union gets rewritten. HepProgramBuilder programBuilder = HepProgram.builder(); programBuilder.addMatchOrder(HepMatchOrder.TOP_DOWN); programBuilder.addMatchLimit(1); programBuilder.addRuleInstance(UnionToDistinctRule.INSTANCE); sql(UNION_TREE).with(programBuilder.build()).check(); }
Example 9
Source File: HepPlannerTest.java From calcite with Apache License 2.0 | 5 votes |
@Test void testMatchLimitOneBottomUp() throws Exception { // Verify that only the bottom union gets rewritten. HepProgramBuilder programBuilder = HepProgram.builder(); programBuilder.addMatchLimit(1); programBuilder.addMatchOrder(HepMatchOrder.BOTTOM_UP); programBuilder.addRuleInstance(UnionToDistinctRule.INSTANCE); sql(UNION_TREE).with(programBuilder.build()).check(); }
Example 10
Source File: HepPlannerTest.java From calcite with Apache License 2.0 | 5 votes |
@Test void testMatchUntilFixpoint() throws Exception { // Verify that both unions get rewritten. HepProgramBuilder programBuilder = HepProgram.builder(); programBuilder.addMatchLimit(HepProgram.MATCH_UNTIL_FIXPOINT); programBuilder.addRuleInstance(UnionToDistinctRule.INSTANCE); sql(UNION_TREE).with(programBuilder.build()).check(); }
Example 11
Source File: HepPlannerTest.java From calcite with Apache License 2.0 | 5 votes |
@Test void testGroup() throws Exception { // Verify simultaneous application of a group of rules. // Intentionally add them in the wrong order to make sure // that order doesn't matter within the group. HepProgramBuilder programBuilder = HepProgram.builder(); programBuilder.addGroupBegin(); programBuilder.addRuleInstance(CalcMergeRule.INSTANCE); programBuilder.addRuleInstance(ProjectToCalcRule.INSTANCE); programBuilder.addRuleInstance(FilterToCalcRule.INSTANCE); programBuilder.addGroupEnd(); final String sql = "select upper(name) from dept where deptno=20"; sql(sql).with(programBuilder.build()).check(); }
Example 12
Source File: HepPlannerTest.java From calcite with Apache License 2.0 | 5 votes |
private long checkRuleApplyCount(HepMatchOrder matchOrder) { final HepProgramBuilder programBuilder = HepProgram.builder(); programBuilder.addMatchOrder(matchOrder); programBuilder.addRuleInstance(ReduceExpressionsRule.FILTER_INSTANCE); programBuilder.addRuleInstance(ReduceExpressionsRule.PROJECT_INSTANCE); final HepTestListener listener = new HepTestListener(0); HepPlanner planner = new HepPlanner(programBuilder.build()); planner.addListener(listener); planner.setRoot(tester.convertSqlToRel(COMPLEX_UNION_TREE).rel); planner.findBestExp(); return listener.getApplyTimes(); }
Example 13
Source File: RelOptTestBase.java From calcite with Apache License 2.0 | 5 votes |
public Sql withRule(RelOptRule... rules) { final HepProgramBuilder builder = HepProgram.builder(); for (RelOptRule rule : rules) { builder.addRuleInstance(rule); } return with(builder.build()); }
Example 14
Source File: CalciteRunners.java From Mycat2 with GNU General Public License v3.0 | 4 votes |
@SneakyThrows public static RowBaseIterator run(String sql, MycatCalciteDataContext calciteDataContext, RelNode relNode) { SqlRecorder recorder = SqlRecorderRuntime.INSTANCE.getCurrentRecorder(); Map<String, List<SingeTargetSQLTable>> map = new HashMap<>(); relNode.accept(new RelShuttleImpl() { @Override public RelNode visit(TableScan scan) { SingeTargetSQLTable unwrap = scan.getTable().unwrap(SingeTargetSQLTable.class); if (unwrap != null && !unwrap.existsEnumerable()) { List<SingeTargetSQLTable> tables = map.computeIfAbsent(unwrap.getTargetName(), s -> new ArrayList<>(2)); tables.add(unwrap); } return super.visit(scan); } }); HepProgramBuilder hepProgramBuilder = new HepProgramBuilder(); hepProgramBuilder.addMatchLimit(64); hepProgramBuilder.addRuleInstance(StreamUnionRule.INSTANCE); final HepPlanner planner2 = new HepPlanner(hepProgramBuilder.build()); planner2.setRoot(relNode); relNode = planner2.findBestExp(); //check relNode.accept(new RelShuttleImpl() { @Override public RelNode visit(LogicalUnion union) { if (union.getInputs().size() > 2) { throw new AssertionError("union input more 2"); } return super.visit(union); } }); long startGetConnectionTime = TimeProvider.INSTANCE.now(); fork(sql, calciteDataContext, map); long cbo = TimeProvider.INSTANCE.now(); recorder.addRecord(SqlRecorderType.GET_CONNECTION, sql, cbo - startGetConnectionTime); ArrayBindable bindable1 = Interpreters.bindable(relNode); long execution_start = TimeProvider.INSTANCE.now(); recorder.addRecord(SqlRecorderType.CBO, sql, execution_start - cbo); // EnumerableInterpretable.toBindable() Enumerable<Object[]> bind = bindable1.bind(calciteDataContext); Enumerator<Object[]> enumerator = bind.enumerator(); return new EnumeratorRowIterator(CalciteConvertors.getMycatRowMetaData(relNode.getRowType()), enumerator, () -> { recorder.addRecord(SqlRecorderType.EXECUTION_TIME, sql, TimeProvider.INSTANCE.now()-execution_start); recorder.addRecord(SqlRecorderType.AT_END, sql, TimeProvider.INSTANCE.now()); }); }