@Test public void testExpressionLineageTwoColumns() { // mgr is column 3 in catalog.sales.emp // deptno is column 7 in catalog.sales.emp final RelNode rel = convertSql("select mgr, deptno from emp"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final RexNode ref1 = RexInputRef.of(0, rel.getRowType().getFieldList()); final Set<RexNode> r1 = mq.getExpressionLineage(rel, ref1); assertThat(r1.size(), is(1)); final RexTableInputRef result1 = (RexTableInputRef) r1.iterator().next(); assertTrue(result1.getQualifiedName().equals(EMP_QNAME)); assertThat(result1.getIndex(), is(3)); final RexNode ref2 = RexInputRef.of(1, rel.getRowType().getFieldList()); final Set<RexNode> r2 = mq.getExpressionLineage(rel, ref2); assertThat(r2.size(), is(1)); final RexTableInputRef result2 = (RexTableInputRef) r2.iterator().next(); assertTrue(result2.getQualifiedName().equals(EMP_QNAME)); assertThat(result2.getIndex(), is(7)); assertThat(result1.getIdentifier(), is(result2.getIdentifier())); }
@Test public void testExpressionLineageTwoColumnsSwapped() { // deptno is column 7 in catalog.sales.emp // mgr is column 3 in catalog.sales.emp final RelNode rel = convertSql("select deptno, mgr from emp"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final RexNode ref1 = RexInputRef.of(0, rel.getRowType().getFieldList()); final Set<RexNode> r1 = mq.getExpressionLineage(rel, ref1); assertThat(r1.size(), is(1)); final RexTableInputRef result1 = (RexTableInputRef) r1.iterator().next(); assertTrue(result1.getQualifiedName().equals(EMP_QNAME)); assertThat(result1.getIndex(), is(7)); final RexNode ref2 = RexInputRef.of(1, rel.getRowType().getFieldList()); final Set<RexNode> r2 = mq.getExpressionLineage(rel, ref2); assertThat(r2.size(), is(1)); final RexTableInputRef result2 = (RexTableInputRef) r2.iterator().next(); assertTrue(result2.getQualifiedName().equals(EMP_QNAME)); assertThat(result2.getIndex(), is(3)); assertThat(result1.getIdentifier(), is(result2.getIdentifier())); }
@Test public void testExpressionLineageCombineTwoColumns() { // empno is column 0 in catalog.sales.emp // deptno is column 7 in catalog.sales.emp final RelNode rel = convertSql("select empno + deptno from emp"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final RexNode ref = RexInputRef.of(0, rel.getRowType().getFieldList()); final Set<RexNode> r = mq.getExpressionLineage(rel, ref); assertThat(r.size(), is(1)); final RexNode result = r.iterator().next(); assertThat(result.getKind(), is(SqlKind.PLUS)); final RexCall call = (RexCall) result; assertThat(call.getOperands().size(), is(2)); final RexTableInputRef inputRef1 = (RexTableInputRef) call.getOperands().get(0); assertTrue(inputRef1.getQualifiedName().equals(EMP_QNAME)); assertThat(inputRef1.getIndex(), is(0)); final RexTableInputRef inputRef2 = (RexTableInputRef) call.getOperands().get(1); assertTrue(inputRef2.getQualifiedName().equals(EMP_QNAME)); assertThat(inputRef2.getIndex(), is(7)); assertThat(inputRef1.getIdentifier(), is(inputRef2.getIdentifier())); }
@Test public void testExpressionLineageTwoColumns() { // mgr is column 3 in catalog.sales.emp // deptno is column 7 in catalog.sales.emp final RelNode rel = convertSql("select mgr, deptno from emp"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final RexNode ref1 = RexInputRef.of(0, rel.getRowType().getFieldList()); final Set<RexNode> r1 = mq.getExpressionLineage(rel, ref1); assertThat(r1.size(), is(1)); final RexTableInputRef result1 = (RexTableInputRef) r1.iterator().next(); assertEquals(result1.getQualifiedName(), EMP_QNAME); assertThat(result1.getIndex(), is(3)); final RexNode ref2 = RexInputRef.of(1, rel.getRowType().getFieldList()); final Set<RexNode> r2 = mq.getExpressionLineage(rel, ref2); assertThat(r2.size(), is(1)); final RexTableInputRef result2 = (RexTableInputRef) r2.iterator().next(); assertEquals(result2.getQualifiedName(), EMP_QNAME); assertThat(result2.getIndex(), is(7)); assertThat(result1.getIdentifier(), is(result2.getIdentifier())); }
@Test public void testExpressionLineageCombineTwoColumns() { // empno is column 0 in catalog.sales.emp // deptno is column 7 in catalog.sales.emp final RelNode rel = convertSql("select empno + deptno from emp"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final RexNode ref = RexInputRef.of(0, rel.getRowType().getFieldList()); final Set<RexNode> r = mq.getExpressionLineage(rel, ref); assertThat(r.size(), is(1)); final RexNode result = r.iterator().next(); assertThat(result.getKind(), is(SqlKind.PLUS)); final RexCall call = (RexCall) result; assertThat(call.getOperands().size(), is(2)); final RexTableInputRef inputRef1 = (RexTableInputRef) call.getOperands().get(0); assertEquals(inputRef1.getQualifiedName(), EMP_QNAME); assertThat(inputRef1.getIndex(), is(0)); final RexTableInputRef inputRef2 = (RexTableInputRef) call.getOperands().get(1); assertEquals(inputRef2.getQualifiedName(), EMP_QNAME); assertThat(inputRef2.getIndex(), is(7)); assertThat(inputRef1.getIdentifier(), is(inputRef2.getIdentifier())); }
@Test public void testExpressionLineageTwoColumnsSwapped() { // deptno is column 7 in catalog.sales.emp // mgr is column 3 in catalog.sales.emp final RelNode rel = convertSql("select deptno, mgr from emp"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final RexNode ref1 = RexInputRef.of(0, rel.getRowType().getFieldList()); final Set<RexNode> r1 = mq.getExpressionLineage(rel, ref1); assertThat(r1.size(), is(1)); final RexTableInputRef result1 = (RexTableInputRef) r1.iterator().next(); assertEquals(result1.getQualifiedName(), EMP_QNAME); assertThat(result1.getIndex(), is(7)); final RexNode ref2 = RexInputRef.of(1, rel.getRowType().getFieldList()); final Set<RexNode> r2 = mq.getExpressionLineage(rel, ref2); assertThat(r2.size(), is(1)); final RexTableInputRef result2 = (RexTableInputRef) r2.iterator().next(); assertEquals(result2.getQualifiedName(), EMP_QNAME); assertThat(result2.getIndex(), is(3)); assertThat(result1.getIdentifier(), is(result2.getIdentifier())); }
@Test public void testExpressionLineageUnion() { // sal is column 5 in catalog.sales.emp final RelNode rel = convertSql("select sal from (\n" + " select * from emp union all select * from emp) " + "where deptno = 10"); final RelNode tableRel = convertSql("select * from emp"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final RexNode ref = RexInputRef.of(0, rel.getRowType().getFieldList()); final Set<RexNode> r = mq.getExpressionLineage(rel, ref); final String inputRef = RexInputRef.of(5, tableRel.getRowType().getFieldList()).toString(); assertThat(r.size(), is(2)); for (RexNode result : r) { final String resultString = result.toString(); assertThat(resultString, startsWith(EMP_QNAME.toString())); assertThat(resultString, endsWith(inputRef)); } Iterator<RexNode> it = r.iterator(); assertThat(((RexTableInputRef) it.next()).getIdentifier(), not(((RexTableInputRef) it.next()).getIdentifier())); }
assertTrue(inputRef2.getQualifiedName().equals(EMP_QNAME)); assertThat(inputRef2.getIndex(), is(5)); assertThat(inputRef1.getIdentifier(), not(inputRef2.getIdentifier()));
@Test public void testExpressionLineageUnion() { // sal is column 5 in catalog.sales.emp final RelNode rel = convertSql("select sal from (\n" + " select * from emp union all select * from emp) " + "where deptno = 10"); final RelNode tableRel = convertSql("select * from emp"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final RexNode ref = RexInputRef.of(0, rel.getRowType().getFieldList()); final Set<RexNode> r = mq.getExpressionLineage(rel, ref); final String inputRef = RexInputRef.of(5, tableRel.getRowType().getFieldList()).toString(); assertThat(r.size(), is(2)); for (RexNode result : r) { final String resultString = result.toString(); assertThat(resultString, startsWith(EMP_QNAME.toString())); assertThat(resultString, endsWith(inputRef)); } Iterator<RexNode> it = r.iterator(); assertThat(((RexTableInputRef) it.next()).getIdentifier(), not(((RexTableInputRef) it.next()).getIdentifier())); }
assertEquals(inputRef2.getQualifiedName(), EMP_QNAME); assertThat(inputRef2.getIndex(), is(5)); assertThat(inputRef1.getIdentifier(), not(inputRef2.getIdentifier()));
@Test public void testExpressionLineageSelfJoin() { // deptno is column 7 in catalog.sales.emp // sal is column 5 in catalog.sales.emp final RelNode rel = convertSql("select a.deptno, b.sal from (select * from emp limit 7) as a\n" + "inner join (select * from emp limit 2) as b\n" + "on a.deptno = b.deptno"); final RelNode tableRel = convertSql("select * from emp"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final RexNode ref1 = RexInputRef.of(0, rel.getRowType().getFieldList()); final Set<RexNode> r1 = mq.getExpressionLineage(rel, ref1); final String inputRef1 = RexInputRef.of(7, tableRel.getRowType().getFieldList()).toString(); assertThat(r1.size(), is(1)); final String resultString1 = r1.iterator().next().toString(); assertThat(resultString1, startsWith(EMP_QNAME.toString())); assertThat(resultString1, endsWith(inputRef1)); final RexNode ref2 = RexInputRef.of(1, rel.getRowType().getFieldList()); final Set<RexNode> r2 = mq.getExpressionLineage(rel, ref2); final String inputRef2 = RexInputRef.of(5, tableRel.getRowType().getFieldList()).toString(); assertThat(r2.size(), is(1)); final String resultString2 = r2.iterator().next().toString(); assertThat(resultString2, startsWith(EMP_QNAME.toString())); assertThat(resultString2, endsWith(inputRef2)); assertThat(((RexTableInputRef) r1.iterator().next()).getIdentifier(), not(((RexTableInputRef) r2.iterator().next()).getIdentifier())); }
@Test public void testExpressionLineageSelfJoin() { // deptno is column 7 in catalog.sales.emp // sal is column 5 in catalog.sales.emp final RelNode rel = convertSql("select a.deptno, b.sal from (select * from emp limit 7) as a\n" + "inner join (select * from emp limit 2) as b\n" + "on a.deptno = b.deptno"); final RelNode tableRel = convertSql("select * from emp"); final RelMetadataQuery mq = RelMetadataQuery.instance(); final RexNode ref1 = RexInputRef.of(0, rel.getRowType().getFieldList()); final Set<RexNode> r1 = mq.getExpressionLineage(rel, ref1); final String inputRef1 = RexInputRef.of(7, tableRel.getRowType().getFieldList()).toString(); assertThat(r1.size(), is(1)); final String resultString1 = r1.iterator().next().toString(); assertThat(resultString1, startsWith(EMP_QNAME.toString())); assertThat(resultString1, endsWith(inputRef1)); final RexNode ref2 = RexInputRef.of(1, rel.getRowType().getFieldList()); final Set<RexNode> r2 = mq.getExpressionLineage(rel, ref2); final String inputRef2 = RexInputRef.of(5, tableRel.getRowType().getFieldList()).toString(); assertThat(r2.size(), is(1)); final String resultString2 = r2.iterator().next().toString(); assertThat(resultString2, startsWith(EMP_QNAME.toString())); assertThat(resultString2, endsWith(inputRef2)); assertThat(((RexTableInputRef) r1.iterator().next()).getIdentifier(), not(((RexTableInputRef) r2.iterator().next()).getIdentifier())); }