private void infer(List<RexNode> predicates, Set<String> allExprsDigests, List<RexNode> inferedPredicates, List<RexNode> nonFieldsPredicates, boolean includeEqualityInference, ImmutableBitSet inferringFields) { for (RexNode r : predicates) { if (!includeEqualityInference && equalityPredicates.contains(r.toString())) { continue; } Iterable<Mapping> ms = mappings(r); if (ms.iterator().hasNext()) { for (Mapping m : ms) { RexNode tr = r.accept( new RexPermuteInputsShuttle(m, joinRel.getInput(0), joinRel.getInput(1))); if (inferringFields.contains(RelOptUtil.InputFinder.bits(tr)) && !allExprsDigests.contains(tr.toString()) && !isAlwaysTrue(tr)) { inferedPredicates.add(tr); allExprsDigests.add(tr.toString()); } } } else { if (!isAlwaysTrue(r)) { nonFieldsPredicates.add(r); } } } }
/** Infers predicates for a {@link org.apache.calcite.rel.core.Join}. */ public RelOptPredicateList getPredicates(Join join, RelMetadataQuery mq) { RexBuilder rB = join.getCluster().getRexBuilder(); RelNode left = join.getInput(0); RelNode right = join.getInput(1); final RelOptPredicateList leftInfo = mq.getPulledUpPredicates(left); final RelOptPredicateList rightInfo = mq.getPulledUpPredicates(right); JoinConditionBasedPredicateInference jI = new JoinConditionBasedPredicateInference(join, RexUtil.composeConjunction(rB, leftInfo.pulledUpPredicates, false), RexUtil.composeConjunction(rB, rightInfo.pulledUpPredicates, false)); return jI.inferPredicates(false); }
private void infer(List<RexNode> predicates, Set<String> allExprsDigests, List<RexNode> inferedPredicates, List<RexNode> nonFieldsPredicates, boolean includeEqualityInference, ImmutableBitSet inferringFields) { for (RexNode r : predicates) { if (!includeEqualityInference && equalityPredicates.contains(r.toString())) { continue; } Iterable<Mapping> ms = mappings(r); if (ms.iterator().hasNext()) { for (Mapping m : ms) { RexNode tr = r.accept( new RexPermuteInputsShuttle(m, joinRel.getInput(0), joinRel.getInput(1))); if (inferringFields.contains(RelOptUtil.InputFinder.bits(tr)) && !allExprsDigests.contains(tr.toString()) && !isAlwaysTrue(tr)) { inferedPredicates.add(tr); allExprsDigests.add(tr.toString()); } } } else { if (!isAlwaysTrue(r)) { nonFieldsPredicates.add(r); } } } }
/** Infers predicates for a {@link org.apache.calcite.rel.core.Join}. */ public RelOptPredicateList getPredicates(Join join, RelMetadataQuery mq) { RexBuilder rB = join.getCluster().getRexBuilder(); RelNode left = join.getInput(0); RelNode right = join.getInput(1); final RelOptPredicateList leftInfo = mq.getPulledUpPredicates(left); final RelOptPredicateList rightInfo = mq.getPulledUpPredicates(right); JoinConditionBasedPredicateInference jI = new JoinConditionBasedPredicateInference(join, RexUtil.composeConjunction(rB, leftInfo.pulledUpPredicates, false), RexUtil.composeConjunction(rB, rightInfo.pulledUpPredicates, false)); return jI.inferPredicates(false); }
private boolean filterRefersToBothSidesOfJoin(RexNode filter, Join j) { boolean refersToBothSides = false; int joinNoOfProjects = j.getRowType().getFieldCount(); ImmutableBitSet filterProjs = ImmutableBitSet.FROM_BIT_SET.apply(new BitSet(joinNoOfProjects)); ImmutableBitSet allLeftProjs = filterProjs.union(ImmutableBitSet.range(0, j.getInput(0) .getRowType().getFieldCount())); ImmutableBitSet allRightProjs = filterProjs.union(ImmutableBitSet.range(j.getInput(0) .getRowType().getFieldCount(), joinNoOfProjects)); filterProjs = filterProjs.union(InputFinder.bits(filter)); if (allLeftProjs.intersects(filterProjs) && allRightProjs.intersects(filterProjs)) refersToBothSides = true; return refersToBothSides; } }
private boolean filterRefersToBothSidesOfJoin(RexNode filter, Join j) { boolean refersToBothSides = false; int joinNoOfProjects = j.getRowType().getFieldCount(); ImmutableBitSet filterProjs = ImmutableBitSet.FROM_BIT_SET.apply(new BitSet(joinNoOfProjects)); ImmutableBitSet allLeftProjs = filterProjs.union(ImmutableBitSet.range(0, j.getInput(0) .getRowType().getFieldCount())); ImmutableBitSet allRightProjs = filterProjs.union(ImmutableBitSet.range(j.getInput(0) .getRowType().getFieldCount(), joinNoOfProjects)); filterProjs = filterProjs.union(InputFinder.bits(filter)); if (allLeftProjs.intersects(filterProjs) && allRightProjs.intersects(filterProjs)) refersToBothSides = true; return refersToBothSides; } }
nSysFields + nFieldsLeft, nSysFields, 0, nFieldsLeft); leftChildPredicates = lPreds.accept( new RexPermuteInputsShuttle(leftMapping, joinRel.getInput(0))); nSysFields + nFieldsLeft, 0, nFieldsRight); rightChildPredicates = rPreds.accept( new RexPermuteInputsShuttle(rightMapping, joinRel.getInput(1)));
nSysFields + nFieldsLeft, nSysFields, 0, nFieldsLeft); leftChildPredicates = lPreds.accept( new RexPermuteInputsShuttle(leftMapping, joinRel.getInput(0))); nSysFields + nFieldsLeft, 0, nFieldsRight); rightChildPredicates = rPreds.accept( new RexPermuteInputsShuttle(rightMapping, joinRel.getInput(1)));
for (int s = 0; s < 2; s++) { final Side side = new Side(); final RelNode joinInput = join.getInput(s); int fieldCount = joinInput.getRowType().getFieldCount(); final ImmutableBitSet fieldSet =
for (int s = 0; s < 2; s++) { final Side side = new Side(); final RelNode joinInput = join.getInput(s); int fieldCount = joinInput.getRowType().getFieldCount(); final ImmutableBitSet fieldSet =
@Test public void testAllPredicates() { final Project rel = (Project) convertSql("select * from emp, dept"); final Join join = (Join) rel.getInput(); final RelOptTable empTable = join.getInput(0).getTable(); final RelOptTable deptTable = join.getInput(1).getTable(); Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { checkAllPredicates(cluster, empTable, deptTable); return null; }); }
/** Unit test for * {@link org.apache.calcite.rel.metadata.RelMdCollation#project} * and other helper functions for deducing collations. */ @Test public void testCollation() { final Project rel = (Project) convertSql("select * from emp, dept"); final Join join = (Join) rel.getInput(); final RelOptTable empTable = join.getInput(0).getTable(); final RelOptTable deptTable = join.getInput(1).getTable(); Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { checkCollation(cluster, empTable, deptTable); return null; }); }
@Test public void testAllPredicates() { final Project rel = (Project) convertSql("select * from emp, dept"); final Join join = (Join) rel.getInput(); final RelOptTable empTable = join.getInput(0).getTable(); final RelOptTable deptTable = join.getInput(1).getTable(); Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { checkAllPredicates(cluster, empTable, deptTable); return null; }); }
/** Unit test for * {@link org.apache.calcite.rel.metadata.RelMdPredicates#getPredicates(Join, RelMetadataQuery)}. */ @Test public void testPredicates() { final Project rel = (Project) convertSql("select * from emp, dept"); final Join join = (Join) rel.getInput(); final RelOptTable empTable = join.getInput(0).getTable(); final RelOptTable deptTable = join.getInput(1).getTable(); Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { checkPredicates(cluster, empTable, deptTable); return null; }); }
/** Unit test for * {@link org.apache.calcite.rel.metadata.RelMdCollation#project} * and other helper functions for deducing collations. */ @Test public void testCollation() { final Project rel = (Project) convertSql("select * from emp, dept"); final Join join = (Join) rel.getInput(); final RelOptTable empTable = join.getInput(0).getTable(); final RelOptTable deptTable = join.getInput(1).getTable(); Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { checkCollation(cluster, empTable, deptTable); return null; }); }
/** Unit test for * {@link org.apache.calcite.rel.metadata.RelMetadataQuery#getAverageColumnSizes(org.apache.calcite.rel.RelNode)}, * {@link org.apache.calcite.rel.metadata.RelMetadataQuery#getAverageRowSize(org.apache.calcite.rel.RelNode)}. */ @Test public void testAverageRowSize() { final Project rel = (Project) convertSql("select * from emp, dept"); final Join join = (Join) rel.getInput(); final RelOptTable empTable = join.getInput(0).getTable(); final RelOptTable deptTable = join.getInput(1).getTable(); Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { checkAverageRowSize(cluster, empTable, deptTable); return null; }); }
/** Unit test for * {@link org.apache.calcite.rel.metadata.RelMdPredicates#getPredicates(Join, RelMetadataQuery)}. */ @Test public void testPredicates() { final Project rel = (Project) convertSql("select * from emp, dept"); final Join join = (Join) rel.getInput(); final RelOptTable empTable = join.getInput(0).getTable(); final RelOptTable deptTable = join.getInput(1).getTable(); Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { checkPredicates(cluster, empTable, deptTable); return null; }); }
/** Unit test for * {@link org.apache.calcite.rel.metadata.RelMetadataQuery#getAverageColumnSizes(org.apache.calcite.rel.RelNode)}, * {@link org.apache.calcite.rel.metadata.RelMetadataQuery#getAverageRowSize(org.apache.calcite.rel.RelNode)}. */ @Test public void testAverageRowSize() { final Project rel = (Project) convertSql("select * from emp, dept"); final Join join = (Join) rel.getInput(); final RelOptTable empTable = join.getInput(0).getTable(); final RelOptTable deptTable = join.getInput(1).getTable(); Frameworks.withPlanner((cluster, relOptSchema, rootSchema) -> { checkAverageRowSize(cluster, empTable, deptTable); return null; }); }
private static boolean isAggregateKeyApplicable(ImmutableBitSet aggregateKeys, Join join) { JoinInfo joinInfo = join.analyzeCondition(); return (join.getJoinType() == JoinRelType.LEFT && joinInfo.leftSet().contains(aggregateKeys)) || (join.getJoinType() == JoinRelType.RIGHT && joinInfo.rightSet().shift(join.getInput(0).getRowType().getFieldCount()) .contains(aggregateKeys)); }