/** * Returns the importance of an equivalence class of relational expressions. * Subset importances are held in a lookup table, and importance changes * gradually propagate through that table. * * <p>If a subset in the same set but with a different calling convention is * deemed to be important, then this subset has at least half of its * importance. (This rule is designed to encourage conversions to take * place.)</p> */ double getImportance(RelSubset rel) { assert rel != null; double importance = 0; final RelSet set = planner.getSet(rel); assert set != null; for (RelSubset subset2 : set.subsets) { final Double d = subsetImportances.get(subset2); if (d == null) { continue; } double subsetImportance = d; if (subset2 != rel) { subsetImportance /= 2; } if (subsetImportance > importance) { importance = subsetImportance; } } return importance; }
final RelSet set = planner.getSet(rel); assert set != null; assert set.subsets != null;
/** * Creates a <code>VolcanoRuleMatch</code>. * * @param operand0 Primary operand * @param rels List of targets; copied by the constructor, so the client can * modify it later * * @pre rels[i] != null */ VolcanoRuleMatch( VolcanoPlanner volcanoPlanner, RelOptRuleOperand operand0, RelNode [] rels) { super(volcanoPlanner, operand0, rels.clone()); this.volcanoPlanner = volcanoPlanner; for (int i = 0; i < rels.length; i++) { assert (rels[i] != null); } // Try to deduce which subset the result will belong to. Assume -- // for now -- that the set is the same as the root relexp. targetSet = volcanoPlanner.getSet(rels[0]); assert targetSet != null : rels[0].toString() + " isn't in a set"; digest = computeDigest(); }
/** * Creates a <code>VolcanoRuleMatch</code>. * * @param operand0 Primary operand * @param rels List of targets; copied by the constructor, so the client * can modify it later * @pre rels[i] != null */ VolcanoRuleMatch( VolcanoPlanner volcanoPlanner, RelOptRuleOperand operand0, RelNode[] rels) { super(volcanoPlanner, operand0, rels.clone()); this.volcanoPlanner = volcanoPlanner; for (int i = 0; i < rels.length; i++) { assert rels[i] != null; } // Try to deduce which subset the result will belong to. Assume -- // for now -- that the set is the same as the root relexp. targetSet = volcanoPlanner.getSet(rels[0]); assert targetSet != null : rels[0].toString() + " isn't in a set"; digest = computeDigest(); }
if (set2 == getSet(root)) { root = set.getOrCreateSubset(
if (set2 == getSet(root)) { root = set.getOrCreateSubset(
public RelSubset register( RelNode rel, RelNode equivRel) { assert !isRegistered(rel) : "pre: isRegistered(rel)"; final RelSet set; if (equivRel == null) { set = null; } else { assert RelOptUtil.equal( "rel rowtype", rel.getRowType(), "equivRel rowtype", equivRel.getRowType(), true); set = getSet(equivRel); } final RelSubset subset = registerImpl(rel, set); if (LOGGER.isLoggable(Level.FINE)) { validate(); } return subset; }
public RelSubset register( RelNode rel, RelNode equivRel) { assert !isRegistered(rel) : "pre: isRegistered(rel)"; final RelSet set; if (equivRel == null) { set = null; } else { assert RelOptUtil.equal( "rel rowtype", rel.getRowType(), "equivRel rowtype", equivRel.getRowType(), true); set = getSet(equivRel); } final RelSubset subset = registerImpl(rel, set); if (tracer.isLoggable(Level.FINE)) { validate(); } return subset; }
public RelSubset getSubset( RelNode rel, RelTraitSet traits, boolean createIfMissing) { if ((rel instanceof RelSubset) && (rel.getTraitSet().equals(traits))) { return (RelSubset) rel; } RelSet set = getSet(rel); if (set == null) { return null; } if (createIfMissing) { return set.getOrCreateSubset(rel.getCluster(), traits); } return set.getSubset(traits); }
public RelSubset getSubset( RelNode rel, RelTraitSet traits, boolean createIfMissing) { if ((rel instanceof RelSubset) && (rel.getTraitSet().equals(traits))) { return (RelSubset) rel; } RelSet set = getSet(rel); if (set == null) { return null; } if (createIfMissing) { return set.getOrCreateSubset(rel.getCluster(), traits); } return set.getSubset(traits); }
assert planner.getSet(rel) == this; planner.fireRules(rel, true);
assert (previousOperand.getParent() == operand); final RelNode childRel = rels[previousOperandOrdinal]; RelSet set = volcanoPlanner.getSet(childRel); successors = set.getParentRels(); } else {
assert planner.getSet(rel) == this; planner.fireRules(rel, true);