public <C> boolean matches(Object object, C context) { return match(object, context) .findFirst() .isPresent(); }
public final Stream<Match> match(Object object) { return match(object, Captures.empty(), null); }
public final <C> Stream<Match> match(Object object, C context) { return match(object, Captures.empty(), context); }
@Override public <C> Stream<Match> accept(Object object, Captures captures, C context) { //TODO remove cast BiFunction<? super T, C, Optional<?>> property = (BiFunction<? super T, C, Optional<?>>) propertyPattern.getProperty().getFunction(); Optional<?> propertyValue = property.apply((T) object, context); return propertyValue.map(value -> propertyPattern.getPattern().match(value, captures, context)) .orElse(Stream.of()); }
public final <C> Stream<Match> match(Object object, Captures captures, C context) { if (previous.isPresent()) { return previous.get().match(object, captures, context) .flatMap(match -> accept(object, match.captures(), context)); } else { return accept(object, captures, context); } }
private <T> Rule.Result transform(PlanNode node, Rule<T> rule, Context context) { Capture<T> nodeCapture = newCapture(); Pattern<T> pattern = rule.getPattern().capturedAs(nodeCapture); Iterator<Match> matches = pattern.match(node, context.lookup).iterator(); while (matches.hasNext()) { Match match = matches.next(); long duration; Rule.Result result; try { long start = System.nanoTime(); result = rule.apply(match.capture(nodeCapture), match.captures(), ruleContext(context)); duration = System.nanoTime() - start; } catch (RuntimeException e) { stats.recordFailure(rule); throw e; } stats.record(rule, duration, !result.isEmpty()); if (result.getTransformedPlan().isPresent()) { return result; } } return Rule.Result.empty(); }
private static <T> RuleApplication applyRule(Rule<T> rule, PlanNode planNode, Rule.Context context) { Capture<T> planNodeCapture = newCapture(); Pattern<T> pattern = rule.getPattern().capturedAs(planNodeCapture); Optional<Match> match = pattern.match(planNode, context.getLookup()) .collect(toOptional()); Rule.Result result; if (!rule.isEnabled(context.getSession()) || !match.isPresent()) { result = Rule.Result.empty(); } else { result = rule.apply(match.get().capture(planNodeCapture), match.get().captures(), context); } return new RuleApplication(context.getLookup(), context.getStatsProvider(), context.getSymbolAllocator().getTypes(), result); }