/** * As {@link #getRels()} but returns a list. */ public List<RelNode> getRelList() { final List<RelNode> list = new ArrayList<>(); for (RelNode rel : set.rels) { if (rel.getTraitSet().satisfies(traitSet)) { list.add(rel); } } return list; }
/** * As {@link #getRels()} but returns a list. */ public List<RelNode> getRelList() { final List<RelNode> list = new ArrayList<>(); for (RelNode rel : set.rels) { if (rel.getTraitSet().satisfies(traitSet)) { list.add(rel); } } return list; }
/** * Returns the collection of RelNodes one of whose inputs is in this * subset. */ Set<RelNode> getParents() { final Set<RelNode> list = new LinkedHashSet<>(); for (RelNode parent : set.getParentRels()) { for (RelSubset rel : inputSubsets(parent)) { if (rel.set == set && traitSet.satisfies(rel.getTraitSet())) { list.add(parent); } } } return list; }
/** * Returns the collection of RelNodes one of whose inputs is in this * subset. */ Set<RelNode> getParents() { final Set<RelNode> list = new LinkedHashSet<>(); for (RelNode parent : set.getParentRels()) { for (RelSubset rel : inputSubsets(parent)) { if (rel.set == set && traitSet.satisfies(rel.getTraitSet())) { list.add(parent); } } } return list; }
/** * Checks whether a relexp has made its subset cheaper, and if it so, * recursively checks whether that subset's parents have gotten cheaper. * * @param planner Planner * @param mq Metadata query * @param rel Relational expression whose cost has improved * @param activeSet Set of active subsets, for cycle detection */ void propagateCostImprovements(VolcanoPlanner planner, RelMetadataQuery mq, RelNode rel, Set<RelSubset> activeSet) { for (RelSubset subset : set.subsets) { if (rel.getTraitSet().satisfies(subset.traitSet)) { subset.propagateCostImprovements0(planner, mq, rel, activeSet); } } }
/** * Returns a list of relational expressions one of whose children is this * subset. The elements of the list are distinct. */ public Collection<RelNode> getParentRels() { final Set<RelNode> list = new LinkedHashSet<>(); parentLoop: for (RelNode parent : set.getParentRels()) { for (RelSubset rel : inputSubsets(parent)) { if (rel.set == set && traitSet.satisfies(rel.getTraitSet())) { list.add(parent); continue parentLoop; } } } return list; }
/** * Returns a list of relational expressions one of whose children is this * subset. The elements of the list are distinct. */ public Collection<RelNode> getParentRels() { final Set<RelNode> list = new LinkedHashSet<>(); parentLoop: for (RelNode parent : set.getParentRels()) { for (RelSubset rel : inputSubsets(parent)) { if (rel.set == set && traitSet.satisfies(rel.getTraitSet())) { list.add(parent); continue parentLoop; } } } return list; }
/** * Checks whether a relexp has made its subset cheaper, and if it so, * recursively checks whether that subset's parents have gotten cheaper. * * @param planner Planner * @param mq Metadata query * @param rel Relational expression whose cost has improved * @param activeSet Set of active subsets, for cycle detection */ void propagateCostImprovements(VolcanoPlanner planner, RelMetadataQuery mq, RelNode rel, Set<RelSubset> activeSet) { for (RelSubset subset : set.subsets) { if (rel.getTraitSet().satisfies(subset.traitSet)) { subset.propagateCostImprovements0(planner, mq, rel, activeSet); } } }
/** * Returns the rel nodes in this rel subset. All rels must have the same * traits and are logically equivalent. * * @return all the rels in the subset */ public Iterable<RelNode> getRels() { return () -> Linq4j.asEnumerable(set.rels) .where(v1 -> v1.getTraitSet().satisfies(traitSet)) .iterator(); }
/** * Returns the rel nodes in this rel subset. All rels must have the same * traits and are logically equivalent. * * @return all the rels in the subset */ public Iterable<RelNode> getRels() { return () -> Linq4j.asEnumerable(set.rels) .where(v1 -> v1.getTraitSet().satisfies(traitSet)) .iterator(); }
if (rels.hasNext()) { input = rels.next(); assert input.getTraitSet().satisfies(inputSubset.getTraitSet()); assert inputSet.rels.contains(input); assert inputSet.subsets.contains(inputSubset);
if (rels.hasNext()) { input = rels.next(); assert input.getTraitSet().satisfies(inputSubset.getTraitSet()); assert inputSet.rels.contains(input); assert inputSet.subsets.contains(inputSubset);
@Test public void testRelDistributionSatisfy() { RelDistribution distribution1 = RelDistributions.hash(ImmutableList.of(0)); RelDistribution distribution2 = RelDistributions.hash(ImmutableList.of(1)); RelTraitSet traitSet = RelTraitSet.createEmpty(); RelTraitSet simpleTrait1 = traitSet.plus(distribution1); RelTraitSet simpleTrait2 = traitSet.plus(distribution2); RelTraitSet compositeTrait = traitSet.replace(RelDistributionTraitDef.INSTANCE, ImmutableList.of(distribution1, distribution2)); assertThat(compositeTrait.satisfies(simpleTrait1), is(true)); assertThat(compositeTrait.satisfies(simpleTrait2), is(true)); assertThat(distribution1.compareTo(distribution2), is(-1)); assertThat(distribution2.compareTo(distribution1), is(1)); //noinspection EqualsWithItself assertThat(distribution2.compareTo(distribution2), is(0)); } }
@Test public void testRelDistributionSatisfy() { RelDistribution distribution1 = RelDistributions.hash(ImmutableList.of(0)); RelDistribution distribution2 = RelDistributions.hash(ImmutableList.of(1)); RelTraitSet traitSet = RelTraitSet.createEmpty(); RelTraitSet simpleTrait1 = traitSet.plus(distribution1); RelTraitSet simpleTrait2 = traitSet.plus(distribution2); RelTraitSet compositeTrait = traitSet.replace(RelDistributionTraitDef.INSTANCE, ImmutableList.of(distribution1, distribution2)); assertThat(compositeTrait.satisfies(simpleTrait1), is(true)); assertThat(compositeTrait.satisfies(simpleTrait2), is(true)); assertThat(distribution1.compareTo(distribution2), is(-1)); assertThat(distribution2.compareTo(distribution1), is(1)); //noinspection EqualsWithItself assertThat(distribution2.compareTo(distribution2), is(0)); } }
assert converted.getTraitSet().satisfies(toTraits);
assert converted.getTraitSet().satisfies(toTraits);