asolimando commented on a change in pull request #2613:
URL: https://github.com/apache/calcite/pull/2613#discussion_r764650446



##########
File path: core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
##########
@@ -2482,6 +2483,115 @@ private void checkPredicates(RelOptCluster cluster, 
RelOptTable empTable,
     assertThat(inputRef1.getIdentifier(), is(inputRef2.getIdentifier()));
   }
 
+  @Test void testExpressionLineageComplexExpression() {
+    // empno is column 0 in catalog.sales.emp
+    // ename is column 1 in catalog.sales.emp
+    // deptno is column 7 in catalog.sales.emp
+    final RelNode rel = convertSql("select (empno = 1 or ename = 'abc') and 
deptno > 1 from emp");
+    final RelMetadataQuery mq = rel.getCluster().getMetadataQuery();
+
+    final RexNode ref = RexInputRef.of(0, rel.getRowType().getFieldList());
+    final Set<RexNode> r = mq.getExpressionLineage(rel, ref);
+
+    // check '(empno = 1 or ename = 'abc') and deptno > 1'
+    assertThat(r.size(), is(1));
+    final RexNode result = r.iterator().next();
+    assertThat(result.getKind(), is(SqlKind.AND));
+    final RexCall and = (RexCall) result;
+
+    // check '(empno = 1 or ename = 'abc')'
+    assertThat(and.getOperands().size(), is(2));
+    final RexCall or = (RexCall) and.getOperands().get(0);
+    assertThat(or.getKind(), is(SqlKind.OR));
+    assertThat(or.getOperands().size(), is(2));
+
+    // check 'empno = 1'
+    final RexCall eq1 = (RexCall) or.getOperands().get(0);
+    assertThat(eq1.getKind(), is(SqlKind.EQUALS));
+    final RexTableInputRef inputRef1 = (RexTableInputRef) 
eq1.getOperands().get(0);
+    assertThat(inputRef1.getQualifiedName(), is(EMP_QNAME));
+    assertThat(inputRef1.getIndex(), is(0));
+    final RexLiteral literal1 = (RexLiteral) eq1.getOperands().get(1);
+    assertThat(literal1.getValueAs(Integer.class), is(1));
+
+    // check 'ename = 'abc''
+    final RexCall eq2 = (RexCall) or.getOperands().get(1);
+    assertThat(eq2.getKind(), is(SqlKind.EQUALS));
+    final RexTableInputRef inputRef2 = (RexTableInputRef) 
eq2.getOperands().get(0);
+    assertThat(inputRef2.getQualifiedName(), is(EMP_QNAME));
+    assertThat(inputRef2.getIndex(), is(1));
+    final RexLiteral literal2 = (RexLiteral) eq2.getOperands().get(1);
+    assertThat(literal2.getValueAs(String.class), is("abc"));
+
+    // check 'deptno > 1'
+    final RexCall gt = (RexCall) and.getOperands().get(1);
+    assertThat(gt.getKind(), is(SqlKind.GREATER_THAN));
+    final RexTableInputRef inputRef3 = (RexTableInputRef) 
gt.getOperands().get(0);
+    assertThat(inputRef3.getQualifiedName(), is(EMP_QNAME));
+    assertThat(inputRef3.getIndex(), is(7));
+    final RexLiteral literal3 = (RexLiteral) gt.getOperands().get(1);
+    assertThat(literal3.getValueAs(Integer.class), is(1));

Review comment:
       As you say, I have just adapted to the style of the tests, but if 
breaking uniformity is an option I am more than happy to switch to string-based 
tests. The other format is hard to write, read and maintain, for no real added 
value IMO.




-- 
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