cols = new ArrayList<>(); cols.add(inputRef.getIndex()); tabToOriginColumns.put(inputRef.getTableRef(), cols);
@Override public RexNode visitTableInputRef(RexTableInputRef inputRef) { if (tableMapping != null) { inputRef = RexTableInputRef.of( tableMapping.get(inputRef.getTableRef()), inputRef.getIndex(), inputRef.getType()); } if (ec != null) { Set<RexTableInputRef> s = ec.get(inputRef); if (s != null) { inputRef = s.iterator().next(); } } return inputRef; } };
@Override public RexNode visitTableInputRef(RexTableInputRef inputRef) { if (ec != null) { Set<RexTableInputRef> s = ec.get(inputRef); if (s != null) { inputRef = s.iterator().next(); } } if (tableMapping != null) { inputRef = RexTableInputRef.of( tableMapping.get(inputRef.getTableRef()), inputRef.getIndex(), inputRef.getType()); } return inputRef; } };
@Override public RexNode visitTableInputRef(RexTableInputRef inputRef) { if (ec != null) { Set<RexTableInputRef> s = ec.get(inputRef); if (s != null) { inputRef = s.iterator().next(); } } if (tableMapping != null) { inputRef = RexTableInputRef.of( tableMapping.get(inputRef.getTableRef()), inputRef.getIndex(), inputRef.getType()); } return inputRef; } };
@Override public RexNode visitTableInputRef(RexTableInputRef inputRef) { if (tableMapping != null) { inputRef = RexTableInputRef.of( tableMapping.get(inputRef.getTableRef()), inputRef.getIndex(), inputRef.getType()); } if (ec != null) { Set<RexTableInputRef> s = ec.get(inputRef); if (s != null) { inputRef = s.iterator().next(); } } return inputRef; } };
@Test public void testExpressionLineageInnerJoinRight() { // ename is column 0 in catalog.sales.bonus final RelNode rel = convertSql("select bonus.ename from emp join bonus using (ename)"); 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 RexTableInputRef result = (RexTableInputRef) r.iterator().next(); assertTrue(result.getQualifiedName().equals(ImmutableList.of("CATALOG", "SALES", "BONUS"))); assertThat(result.getIndex(), is(0)); }
@Test public void testExpressionLineageInnerJoinLeft() { // ename is column 1 in catalog.sales.emp final RelNode rel = convertSql("select ename from emp,dept"); 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 RexTableInputRef result = (RexTableInputRef) r.iterator().next(); assertTrue(result.getQualifiedName().equals(EMP_QNAME)); assertThat(result.getIndex(), is(1)); }
@Test public void testExpressionLineageRightJoinRight() { // ename is column 0 in catalog.sales.bonus final RelNode rel = convertSql("select bonus.ename from emp right join bonus using (ename)"); 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 RexTableInputRef result = (RexTableInputRef) r.iterator().next(); assertEquals(result.getQualifiedName(), ImmutableList.of("CATALOG", "SALES", "BONUS")); assertThat(result.getIndex(), is(0)); }
@Test public void testExpressionLineageInnerJoinRight() { // ename is column 0 in catalog.sales.bonus final RelNode rel = convertSql("select bonus.ename from emp join bonus using (ename)"); 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 RexTableInputRef result = (RexTableInputRef) r.iterator().next(); assertEquals(result.getQualifiedName(), ImmutableList.of("CATALOG", "SALES", "BONUS")); assertThat(result.getIndex(), is(0)); }
@Test public void testAllPredicatesAggregate1() { final String sql = "select a, max(b) from (\n" + " select empno as a, sal as b from emp where empno = 5)subq\n" + "group by a"; final RelNode rel = convertSql(sql); final RelMetadataQuery mq = RelMetadataQuery.instance(); RelOptPredicateList inputSet = mq.getAllPredicates(rel); ImmutableList<RexNode> pulledUpPredicates = inputSet.pulledUpPredicates; assertThat(pulledUpPredicates.size(), is(1)); RexCall call = (RexCall) pulledUpPredicates.get(0); 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 RexLiteral constant = (RexLiteral) call.getOperands().get(1); assertThat(constant.toString(), is("5")); }
@Test public void testAllPredicatesAggregate2() { final String sql = "select * from (select a, max(b) from (\n" + " select empno as a, sal as b from emp)subq\n" + "group by a) \n" + "where a = 5"; final RelNode rel = convertSql(sql); final RelMetadataQuery mq = RelMetadataQuery.instance(); RelOptPredicateList inputSet = mq.getAllPredicates(rel); ImmutableList<RexNode> pulledUpPredicates = inputSet.pulledUpPredicates; assertThat(pulledUpPredicates.size(), is(1)); RexCall call = (RexCall) pulledUpPredicates.get(0); 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 RexLiteral constant = (RexLiteral) call.getOperands().get(1); assertThat(constant.toString(), is("5")); }
@Test public void testExpressionLineageLeftJoinLeft() { // ename is column 1 in catalog.sales.emp final RelNode rel = convertSql("select ename from emp left join dept using (deptno)"); 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 RexTableInputRef result = (RexTableInputRef) r.iterator().next(); assertEquals(result.getQualifiedName(), EMP_QNAME); assertThat(result.getIndex(), is(1)); }
@Test public void testExpressionLineageInnerJoinLeft() { // ename is column 1 in catalog.sales.emp final RelNode rel = convertSql("select ename from emp,dept"); 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 RexTableInputRef result = (RexTableInputRef) r.iterator().next(); assertEquals(result.getQualifiedName(), EMP_QNAME); assertThat(result.getIndex(), is(1)); }
@Test public void testAllPredicatesAggregate1() { final String sql = "select a, max(b) from (\n" + " select empno as a, sal as b from emp where empno = 5)subq\n" + "group by a"; final RelNode rel = convertSql(sql); final RelMetadataQuery mq = RelMetadataQuery.instance(); RelOptPredicateList inputSet = mq.getAllPredicates(rel); ImmutableList<RexNode> pulledUpPredicates = inputSet.pulledUpPredicates; assertThat(pulledUpPredicates.size(), is(1)); RexCall call = (RexCall) pulledUpPredicates.get(0); 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 RexLiteral constant = (RexLiteral) call.getOperands().get(1); assertThat(constant.toString(), is("5")); }
@Test public void testAllPredicatesAggregate2() { final String sql = "select * from (select a, max(b) from (\n" + " select empno as a, sal as b from emp)subq\n" + "group by a) \n" + "where a = 5"; final RelNode rel = convertSql(sql); final RelMetadataQuery mq = RelMetadataQuery.instance(); RelOptPredicateList inputSet = mq.getAllPredicates(rel); ImmutableList<RexNode> pulledUpPredicates = inputSet.pulledUpPredicates; assertThat(pulledUpPredicates.size(), is(1)); RexCall call = (RexCall) pulledUpPredicates.get(0); 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 RexLiteral constant = (RexLiteral) call.getOperands().get(1); assertThat(constant.toString(), is("5")); }
@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 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 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())); }