public PlanNode execute( QueryContext context,
PlanNode plan,
LinkedList<OptimizerRule> ruleStack ) {
// Prepare a cache of the view plans ...
Map<SelectorName, PlanNode> viewPlanCache = new HashMap<SelectorName, PlanNode>();
CanonicalPlanner planner = new CanonicalPlanner();
// Prepare the maps that will record the old-to-new mappings from the old view SOURCE nodes to the table SOURCEs ...
// For each of the SOURCE nodes ...
Schemata schemata = context.getSchemata();
Set<PlanNode> processedSources = new HashSet<PlanNode>();
boolean foundViews = false;
do {
foundViews = false;
for (PlanNode sourceNode : plan.findAllAtOrBelow(Type.SOURCE)) {
if (processedSources.contains(sourceNode)) continue;
processedSources.add(sourceNode);
// Resolve the node to find the definition in the schemata ...
SelectorName tableName = sourceNode.getProperty(Property.SOURCE_NAME, SelectorName.class);
SelectorName tableAlias = sourceNode.getProperty(Property.SOURCE_ALIAS, SelectorName.class);
Table table = schemata.getTable(tableName);
if (table instanceof View) {
View view = (View)table;
PlanNode viewPlan = viewPlanCache.get(tableName);
if (viewPlan == null) {
viewPlan = planner.createPlan(context, view.getDefinition());
if (viewPlan != null) viewPlanCache.put(tableName, viewPlan);
}
if (viewPlan == null) continue; // there were likely errors when creating the plan
viewPlan = viewPlan.clone();