/** * Creates an AggregateExtractProjectRule. * * @param relBuilderFactory Builder for relational expressions */ public AggregateExtractProjectRule( Class<? extends Aggregate> aggregateClass, Class<? extends RelNode> inputClass, RelBuilderFactory relBuilderFactory) { // Predicate prevents matching against an Aggregate whose input // is already a Project. Prevents this rule firing repeatedly. this( operand(aggregateClass, operandJ(inputClass, null, r -> !(r instanceof Project), any())), relBuilderFactory); }
@Test public void testAggregateExtractProjectRuleWithGroupingSets() { final String sql = "select empno, deptno, sum(sal)\n" + "from emp\n" + "group by grouping sets ((empno, deptno),(deptno),(empno))"; HepProgram pre = new HepProgramBuilder() .addRuleInstance(AggregateProjectMergeRule.INSTANCE) .build(); final AggregateExtractProjectRule rule = new AggregateExtractProjectRule(Aggregate.class, LogicalTableScan.class, RelFactories.LOGICAL_BUILDER); sql(sql).withPre(pre).withRule(rule).check(); }
@Test public void testAggregateExtractProjectRule() { final String sql = "select sum(sal)\n" + "from emp"; HepProgram pre = new HepProgramBuilder() .addRuleInstance(AggregateProjectMergeRule.INSTANCE) .build(); final AggregateExtractProjectRule rule = new AggregateExtractProjectRule(Aggregate.class, LogicalTableScan.class, RelFactories.LOGICAL_BUILDER); sql(sql).withPre(pre).withRule(rule).check(); }
/** * Creates an AggregateExtractProjectRule. * * @param relBuilderFactory Builder for relational expressions */ public AggregateExtractProjectRule( Class<? extends Aggregate> aggregateClass, Class<? extends RelNode> inputClass, RelBuilderFactory relBuilderFactory) { // Predicate prevents matching against an Aggregate whose input // is already a Project. Prevents this rule firing repeatedly. this( operand(aggregateClass, operandJ(inputClass, null, r -> !(r instanceof Project), any())), relBuilderFactory); }
@Test public void testAggregateExtractProjectRule() { final String sql = "select sum(sal)\n" + "from emp"; HepProgram pre = new HepProgramBuilder() .addRuleInstance(AggregateProjectMergeRule.INSTANCE) .build(); final AggregateExtractProjectRule rule = new AggregateExtractProjectRule(Aggregate.class, LogicalTableScan.class, RelFactories.LOGICAL_BUILDER); sql(sql).withPre(pre).withRule(rule).check(); }
@Test public void testAggregateExtractProjectRuleWithGroupingSets() { final String sql = "select empno, deptno, sum(sal)\n" + "from emp\n" + "group by grouping sets ((empno, deptno),(deptno),(empno))"; HepProgram pre = new HepProgramBuilder() .addRuleInstance(AggregateProjectMergeRule.INSTANCE) .build(); final AggregateExtractProjectRule rule = new AggregateExtractProjectRule(Aggregate.class, LogicalTableScan.class, RelFactories.LOGICAL_BUILDER); sql(sql).withPre(pre).withRule(rule).check(); }
/** Test with column used in both grouping set and argument to aggregate * function. */ @Test public void testAggregateExtractProjectRuleWithGroupingSets2() { final String sql = "select empno, deptno, sum(empno)\n" + "from emp\n" + "group by grouping sets ((empno, deptno),(deptno),(empno))"; HepProgram pre = new HepProgramBuilder() .addRuleInstance(AggregateProjectMergeRule.INSTANCE) .build(); final AggregateExtractProjectRule rule = new AggregateExtractProjectRule(Aggregate.class, LogicalTableScan.class, RelFactories.LOGICAL_BUILDER); sql(sql).withPre(pre).withRule(rule).check(); }
/** Test with column used in both grouping set and argument to aggregate * function. */ @Test public void testAggregateExtractProjectRuleWithGroupingSets2() { final String sql = "select empno, deptno, sum(empno)\n" + "from emp\n" + "group by grouping sets ((empno, deptno),(deptno),(empno))"; HepProgram pre = new HepProgramBuilder() .addRuleInstance(AggregateProjectMergeRule.INSTANCE) .build(); final AggregateExtractProjectRule rule = new AggregateExtractProjectRule(Aggregate.class, LogicalTableScan.class, RelFactories.LOGICAL_BUILDER); sql(sql).withPre(pre).withRule(rule).check(); }
@Test public void testAggregateExtractProjectRuleWithFilter() { final String sql = "select sum(sal) filter (where empno = 40)\n" + "from emp"; HepProgram pre = new HepProgramBuilder() .addRuleInstance(AggregateProjectMergeRule.INSTANCE) .build(); // AggregateProjectMergeRule does not merges Project with Filter. // Force match Aggregate on top of Project once explicitly in unit test. final AggregateExtractProjectRule rule = new AggregateExtractProjectRule( operand(Aggregate.class, operandJ(Project.class, null, new Predicate<Project>() { int matchCount = 0; public boolean test(Project project) { return matchCount++ == 0; } }, none())), RelFactories.LOGICAL_BUILDER); sql(sql).withPre(pre).withRule(rule).checkUnchanged(); }
@Test public void testAggregateExtractProjectRuleWithFilter() { final String sql = "select sum(sal) filter (where empno = 40)\n" + "from emp"; HepProgram pre = new HepProgramBuilder() .addRuleInstance(AggregateProjectMergeRule.INSTANCE) .build(); // AggregateProjectMergeRule does not merges Project with Filter. // Force match Aggregate on top of Project once explicitly in unit test. final AggregateExtractProjectRule rule = new AggregateExtractProjectRule( operand(Aggregate.class, operandJ(Project.class, null, new Predicate<Project>() { int matchCount = 0; public boolean test(Project project) { return matchCount++ == 0; } }, none())), RelFactories.LOGICAL_BUILDER); sql(sql).withPre(pre).withRule(rule).checkUnchanged(); }