private static <T> RuleApplication applyRule(Rule<T> rule, PlanNode planNode, Rule.Context context)
{
PlanNodeMatcher matcher = new PlanNodeMatcher(context.getLookup());
Match<T> match = matcher.match(rule.getPattern(), planNode);
Rule.Result result;
if (!rule.isEnabled(context.getSession()) || match.isEmpty()) {
result = Rule.Result.empty();
}
else {
result = rule.apply(match.value(), match.captures(), context);
}
return new RuleApplication(context.getLookup(), context.getStatsProvider(), context.getSymbolAllocator().getTypes(), result);
}