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)