xiedeyantu commented on code in PR #4315:
URL: https://github.com/apache/calcite/pull/4315#discussion_r2051434249


##########
core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml:
##########
@@ -6752,6 +6752,51 @@ LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], 
MGR=[$3], HIREDATE=[$4], SAL=[$
     LogicalJoin(condition=[AND(=($3, $12), <>($0, $9))], joinType=[inner])
       LogicalTableScan(table=[[CATALOG, SALES, EMP]])
       LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+    </Resource>
+  </TestCase>
+  <TestCase name="testJoinConditionOrExpansionRule2">
+    <Resource name="sql">
+      <![CDATA[select * from empnullables as t1 inner join empnullables as t2
+on (t1.empno = t2.empno
+and t1.job = 'Job1'
+and t1.ename in ('a', 'bb', 'cc')
+and t1.sal > 120 and t1.sal < 3000
+and t1.mgr = t1.comm)
+or
+(t1.deptno = t2.deptno
+and t2.job = 'Job2'
+and t2.ename in ('a', 'bb', 'cc')
+and t2.sal > 110 and t2.sal < 3000
+and t1.mgr + 10 < ln(15))
+or
+(t1.ename = 'Jensen'
+and t2.comm > 10)
+or
+t1.mgr between 10.0 and 20
+]]>
+    </Resource>
+    <Resource name="planBefore">
+      <![CDATA[
+LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], 
SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], EMPNO0=[$9], ENAME0=[$10], 
JOB0=[$11], MGR0=[$12], HIREDATE0=[$13], SAL0=[$14], COMM0=[$15], 
DEPTNO0=[$16], SLACKER0=[$17])
+  LogicalJoin(condition=[OR(AND(=($0, $9), =($2, 'Job1'), SEARCH($1, 
Sarg['a':VARCHAR(20), 'bb':VARCHAR(20), 'cc':VARCHAR(20)]:VARCHAR(20)), 
SEARCH($5, Sarg[(120..3000)]), =($3, $6)), AND(=($7, $16), =($11, 'Job2'), 
SEARCH($10, Sarg['a':VARCHAR(20), 'bb':VARCHAR(20), 
'cc':VARCHAR(20)]:VARCHAR(20)), SEARCH($14, Sarg[(110..3000)]), <(CAST(+($3, 
10)):DOUBLE, LN(15))), AND(=($1, 'Jensen'), >($15, 10)), 
SEARCH(CAST($3):DECIMAL(11, 1), Sarg[[10.0:DECIMAL(11, 1)..20.0:DECIMAL(11, 
1)]]:DECIMAL(11, 1)))], joinType=[inner])
+    LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
+    LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
+]]>
+    </Resource>
+    <Resource name="planAfter">
+      <![CDATA[
+LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], 
SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], EMPNO0=[$9], ENAME0=[$10], 
JOB0=[$11], MGR0=[$12], HIREDATE0=[$13], SAL0=[$14], COMM0=[$15], 
DEPTNO0=[$16], SLACKER0=[$17])
+  LogicalUnion(all=[true])
+    LogicalJoin(condition=[AND(=($0, $9), =($2, 'Job1'), SEARCH($1, 
Sarg['a':VARCHAR(20), 'bb':VARCHAR(20), 'cc':VARCHAR(20)]:VARCHAR(20)), 
SEARCH($5, Sarg[(120..3000)]), =($3, $6))], joinType=[inner])
+      LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
+      LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
+    LogicalJoin(condition=[AND(=($7, $16), =($11, 'Job2'), SEARCH($10, 
Sarg['a':VARCHAR(20), 'bb':VARCHAR(20), 'cc':VARCHAR(20)]:VARCHAR(20)), 
SEARCH($14, Sarg[(110..3000)]), <(CAST(+($3, 10)):DOUBLE, LN(15)), OR(<>($0, 
$9), <>($2, 'Job1'), SEARCH($1, Sarg[(-∞..'a':VARCHAR(20)), 
('a':VARCHAR(20)..'bb':VARCHAR(20)), ('bb':VARCHAR(20)..'cc':VARCHAR(20)), 
('cc':VARCHAR(20)..+∞)]:VARCHAR(20)), SEARCH($5, Sarg[(-∞..120], [3000..+∞)]), 
<>($3, $6)))], joinType=[inner])
+      LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
+      LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
+    LogicalJoin(condition=[AND(OR(AND(=($1, 'Jensen'), >($15, 10)), 
SEARCH(CAST($3):DECIMAL(11, 1), Sarg[[10.0:DECIMAL(11, 1)..20.0:DECIMAL(11, 
1)]]:DECIMAL(11, 1))), OR(<>($0, $9), <>($2, 'Job1'), SEARCH($1, 
Sarg[(-∞..'a':VARCHAR(20)), ('a':VARCHAR(20)..'bb':VARCHAR(20)), 
('bb':VARCHAR(20)..'cc':VARCHAR(20)), ('cc':VARCHAR(20)..+∞)]:VARCHAR(20)), 
SEARCH($5, Sarg[(-∞..120], [3000..+∞)]), <>($3, $6)), OR(<>($7, $16), <>($11, 
'Job2'), SEARCH($10, Sarg[(-∞..'a':VARCHAR(20)), 
('a':VARCHAR(20)..'bb':VARCHAR(20)), ('bb':VARCHAR(20)..'cc':VARCHAR(20)), 
('cc':VARCHAR(20)..+∞)]:VARCHAR(20)), SEARCH($14, Sarg[(-∞..110], [3000..+∞)]), 
>=(CAST(+($3, 10)):DOUBLE, LN(15))))], joinType=[inner])

Review Comment:
   I have tried some existing rules, and this case can currently be optimized 
as follows:
   ```
     @Test void testJoinConditionOrExpansionRule2() {
       String sql = "select * from empnullables as t1 inner join empnullables 
as t2\n"
           + "on (t1.empno = t2.empno\n"
           + "and t1.job = 'Job1'\n"
           + "and t1.ename in ('a', 'bb', 'cc')\n"
           + "and t1.sal > 120 and t1.sal < 3000\n"
           + "and t1.mgr = t1.comm)\n"
           + "or\n"
           + "(t1.deptno = t2.deptno\n"
           + "and t2.job = 'Job2'\n"
           + "and t2.ename in ('a', 'bb', 'cc')\n"
           + "and t2.sal > 110 and t2.sal < 3000\n"
           + "and t1.mgr + 10 < ln(15))\n"
           + "or\n"
           + "(t1.ename = 'Jensen'\n"
           + "and t2.comm > 10)\n"
           + "or\n"
           + "t1.mgr between 10.0 and 20\n";
   
       sql(sql).withTrim(true).withRule(CoreRules.PROJECT_JOIN_TRANSPOSE,
                   CoreRules.JOIN_EXPAND_OR_TO_UNION_RULE)
           .check();
   ```
   The plan is:
   ```
   LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], 
SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], EMPNO0=[$16], ENAME0=[$17], 
JOB0=[$18], MGR0=[$19], HIREDATE0=[$20], SAL0=[$21], COMM0=[$22], 
DEPTNO0=[$23], SLACKER0=[$24])
     LogicalUnion(all=[true])
       LogicalJoin(condition=[AND(=($0, $16), $9, $10, $11, $12)], 
joinType=[inner])
         LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], 
HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], EXPR$0=[=($2, 
'Job1')], EXPR$1=[SEARCH($1, Sarg['a':VARCHAR(20), 'bb':VARCHAR(20), 
'cc':VARCHAR(20)]:VARCHAR(20))], EXPR$2=[SEARCH($5, Sarg[(120..3000)])], 
EXPR$3=[=($3, $6)], EXPR$4=[<(CAST(+($3, 10)):DOUBLE, LN(15))], EXPR$5=[=($1, 
'Jensen')], EXPR$6=[SEARCH(CAST($3):DECIMAL(11, 1), Sarg[[10.0:DECIMAL(11, 
1)..20.0:DECIMAL(11, 1)]]:DECIMAL(11, 1))])
           LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
         LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], 
HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], EXPR$0=[=($2, 
'Job2')], EXPR$1=[SEARCH($1, Sarg['a':VARCHAR(20), 'bb':VARCHAR(20), 
'cc':VARCHAR(20)]:VARCHAR(20))], EXPR$2=[SEARCH($5, Sarg[(110..3000)])], 
EXPR$3=[>($6, 10)])
           LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
       LogicalJoin(condition=[AND(=($7, $23), $25, $26, $27, $13, OR(<>($0, 
$16), NOT($9), NOT($10), NOT($11), NOT($12)))], joinType=[inner])
         LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], 
HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], EXPR$0=[=($2, 
'Job1')], EXPR$1=[SEARCH($1, Sarg['a':VARCHAR(20), 'bb':VARCHAR(20), 
'cc':VARCHAR(20)]:VARCHAR(20))], EXPR$2=[SEARCH($5, Sarg[(120..3000)])], 
EXPR$3=[=($3, $6)], EXPR$4=[<(CAST(+($3, 10)):DOUBLE, LN(15))], EXPR$5=[=($1, 
'Jensen')], EXPR$6=[SEARCH(CAST($3):DECIMAL(11, 1), Sarg[[10.0:DECIMAL(11, 
1)..20.0:DECIMAL(11, 1)]]:DECIMAL(11, 1))])
           LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
         LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], 
HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], EXPR$0=[=($2, 
'Job2')], EXPR$1=[SEARCH($1, Sarg['a':VARCHAR(20), 'bb':VARCHAR(20), 
'cc':VARCHAR(20)]:VARCHAR(20))], EXPR$2=[SEARCH($5, Sarg[(110..3000)])], 
EXPR$3=[>($6, 10)])
           LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
       LogicalJoin(condition=[AND(OR(AND($14, $28), $15), OR(<>($0, $16), 
NOT($9), NOT($10), NOT($11), NOT($12)), OR(<>($7, $23), NOT($25), NOT($26), 
NOT($27), NOT($13)))], joinType=[inner])
         LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], 
HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], EXPR$0=[=($2, 
'Job1')], EXPR$1=[SEARCH($1, Sarg['a':VARCHAR(20), 'bb':VARCHAR(20), 
'cc':VARCHAR(20)]:VARCHAR(20))], EXPR$2=[SEARCH($5, Sarg[(120..3000)])], 
EXPR$3=[=($3, $6)], EXPR$4=[<(CAST(+($3, 10)):DOUBLE, LN(15))], EXPR$5=[=($1, 
'Jensen')], EXPR$6=[SEARCH(CAST($3):DECIMAL(11, 1), Sarg[[10.0:DECIMAL(11, 
1)..20.0:DECIMAL(11, 1)]]:DECIMAL(11, 1))])
           LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
         LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], 
HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], EXPR$0=[=($2, 
'Job2')], EXPR$1=[SEARCH($1, Sarg['a':VARCHAR(20), 'bb':VARCHAR(20), 
'cc':VARCHAR(20)]:VARCHAR(20))], EXPR$2=[SEARCH($5, Sarg[(110..3000)])], 
EXPR$3=[>($6, 10)])
           LogicalTableScan(table=[[CATALOG, SALES, EMPNULLABLES]])
   ```
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to