use of com.apple.foundationdb.record.query.plan.temp.matchers.PlannerBindings in project fdb-record-layer by FoundationDB.
the class ImplementUnorderedUnionRule method onMatch.
@Override
public void onMatch(@Nonnull PlannerRuleCall call) {
final PlannerBindings bindings = call.getBindings();
final List<? extends Collection<? extends RecordQueryPlan>> groupedPlansByLeg = bindings.getAll(unionLegPlansMatcher);
final ImmutableList<Quantifier.Physical> quantifiers = groupedPlansByLeg.stream().map(GroupExpressionRef::from).map(Quantifier::physical).collect(ImmutableList.toImmutableList());
call.yield(call.ref(RecordQueryUnorderedUnionPlan.fromQuantifiers(quantifiers)));
}
use of com.apple.foundationdb.record.query.plan.temp.matchers.PlannerBindings in project fdb-record-layer by FoundationDB.
the class MatchIntermediateRule method onMatch.
@Override
public void onMatch(@Nonnull PlannerRuleCall call) {
final PlannerBindings bindings = call.getBindings();
final RelationalExpression expression = bindings.get(root);
final List<? extends Quantifier> quantifiers = bindings.getAll(quantifierMatcher);
final ImmutableList<? extends ExpressionRef<? extends RelationalExpression>> rangesOverRefs = quantifiers.stream().map(Quantifier::getRangesOver).collect(ImmutableList.toImmutableList());
// form union of all possible match candidates that this rule application should look at
final Set<MatchCandidate> childMatchCandidates = new LinkedIdentitySet<>();
for (int i = 0; i < rangesOverRefs.size(); i++) {
final ExpressionRef<? extends RelationalExpression> rangesOverGroup = rangesOverRefs.get(i);
childMatchCandidates.addAll(rangesOverGroup.getMatchCandidates());
}
// go through all match candidates
for (final MatchCandidate matchCandidate : childMatchCandidates) {
final SetMultimap<ExpressionRef<? extends RelationalExpression>, RelationalExpression> refToExpressionMap = matchCandidate.findReferencingExpressions(rangesOverRefs);
// go through all reference paths, i.e., (ref, expression) pairs
for (final Map.Entry<ExpressionRef<? extends RelationalExpression>, RelationalExpression> entry : refToExpressionMap.entries()) {
final ExpressionRef<? extends RelationalExpression> candidateReference = entry.getKey();
final RelationalExpression candidateExpression = entry.getValue();
// match this expression with the candidate expression and yield zero to n new partial matches
final Iterable<BoundMatch<MatchInfo>> boundMatchInfos = matchWithCandidate(expression, matchCandidate, candidateExpression);
boundMatchInfos.forEach(boundMatchInfo -> call.yieldPartialMatch(boundMatchInfo.getAliasMap(), matchCandidate, expression, candidateReference, boundMatchInfo.getMatchResult()));
}
}
}
Aggregations