/** Extract a minimal set of WindowGroups from analyticExprs. */ private List<WindowGroup> collectWindowGroups() { List<Expr> analyticExprs = analyticInfo_.getAnalyticExprs(); List<WindowGroup> groups = Lists.newArrayList(); for (int i = 0; i < analyticExprs.size(); ++i) { AnalyticExpr analyticExpr = (AnalyticExpr) analyticExprs.get(i); // Do not generate the plan for non-materialized analytic exprs. if (!analyticInfo_.getOutputTupleDesc().getSlots().get(i).isMaterialized()) { continue; } boolean match = false; for (WindowGroup group : groups) { if (group.isCompatible(analyticExpr)) { group.add( (AnalyticExpr) analyticInfo_.getAnalyticExprs().get(i), analyticInfo_.getOutputTupleDesc().getSlots().get(i), analyticInfo_.getIntermediateTupleDesc().getSlots().get(i)); match = true; break; } } if (!match) { groups.add( new WindowGroup( (AnalyticExpr) analyticInfo_.getAnalyticExprs().get(i), analyticInfo_.getOutputTupleDesc().getSlots().get(i), analyticInfo_.getIntermediateTupleDesc().getSlots().get(i))); } } return groups; }