Julian Hyde created CALCITE-7420:
------------------------------------

             Summary: Convert RelOptRulesTest to Quidem scripts
                 Key: CALCITE-7420
                 URL: https://issues.apache.org/jira/browse/CALCITE-7420
             Project: Calcite
          Issue Type: Bug
            Reporter: Julian Hyde


Many test cases in RelOptRulesTest are simple - involve just a SQL query, set 
of rules, before and after plan. If these were converted to Quidem scripts they 
would be easier to write (because you are writing just one file), more 
maintainable (because Quidem scripts merge more easily than XML), and could 
potentially be run from another language (which would enable ports of Calcite 
to language such as Rust or Python).

Here is how one test would look:
{noformat}
# Pull aggregate through union ====================
# Tests that AggregateUnionAggregateRule can convert
# a union of two ’select distinct’ queries to a ’select distinct’
# of a union.
!set rules "AGGREGATE_UNION_AGGREGATE"
select deptno, job
from (select deptno, job
 from emp as e1
 group by deptno, job
 union all
 select deptno, job
 from emp as e2
  group by deptno, job)
group by deptno, job;
+--------+-----------+
| DEPTNO |    JOB    |
+--------+-----------+
| 20     | CLERK     |
| 30     | SALESMAN  |
| 20     | MANAGER   |
| 30     | MANAGER   |
| 10     | MANAGER   |
| 20     | ANALYST   |
| 10     | PRESIDENT |
| 30     | CLERK     |
| 10     | CLERK     |
+--------+-----------+
(9 rows)

!ok
LogicalAggregate(group=[{0, 1}])
 LogicalUnion(all=[true])
   LogicalAggregate(group=[{0, 1}])
     LogicalProject(DEPTNO=[$7], JOB=[$2])
       LogicalTableScan(table=[[CATALOG, SALES, EMP]])
   LogicalAggregate(group=[{0, 1}])
     LogicalProject(DEPTNO=[$7], JOB=[$2])
       LogicalTableScan(table=[[CATALOG, SALES, EMP]])
!plan-before
LogicalAggregate(group=[{0, 1}])
 LogicalUnion(all=[true])
   LogicalProject(DEPTNO=[$7], JOB=[$2])
     LogicalTableScan(table=[[CATALOG, SALES, EMP]])
   LogicalProject(DEPTNO=[$7], JOB=[$2])
     LogicalTableScan(table=[[CATALOG, SALES, EMP]])
!plan-after
{noformat}
 

It has the same information as the Java method
{code:java}
  @Test void testPullAggregateThroughUnion() {
    final String sql = "select deptno, job from"
        + " (select deptno, job from emp as e1"
        + " group by deptno,job"
        + "  union all"
        + " select deptno, job from emp as e2"
        + " group by deptno,job)"
        + " group by deptno,job";
    sql(sql)
        .withRule(CoreRules.AGGREGATE_UNION_AGGREGATE)
        .check();
  }
{code}

and XML resources

{code:xml}
  <TestCase name="testPullAggregateThroughUnion">
    <Resource name="sql">
      <![CDATA[select deptno, job from (select deptno, job from emp as e1 group 
by deptno,job  union all select deptno, job from emp as e2 group by deptno,job) 
group by deptno,job]]>
    </Resource>
    <Resource name="planBefore">
      <![CDATA[
LogicalAggregate(group=[{0, 1}])
  LogicalUnion(all=[true])
    LogicalAggregate(group=[{0, 1}])
      LogicalProject(DEPTNO=[$7], JOB=[$2])
        LogicalTableScan(table=[[CATALOG, SALES, EMP]])
    LogicalAggregate(group=[{0, 1}])
      LogicalProject(DEPTNO=[$7], JOB=[$2])
        LogicalTableScan(table=[[CATALOG, SALES, EMP]])
]]>
    </Resource>
{code}

It uses {{!set rules}} command (added in CALCITE-6335) and would require new 
{{!plan-before}} and {{!plan-after}} commands.

I suspect that Claude would do a quite good job migrating tests from .java and 
.xml to .iq. I think it could also group tests by subject area (e.g. join and 
aggregate) so that .iq files are ~1,000 lines.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to