public WindowGroup( AnalyticExpr analyticExpr, SlotDescriptor logicalOutputSlot, SlotDescriptor logicalIntermediateSlot) { partitionByExprs = analyticExpr.getPartitionExprs(); orderByElements = analyticExpr.getOrderByElements(); window = analyticExpr.getWindow(); analyticExprs.add(analyticExpr); analyticFnCalls.add(analyticExpr.getFnCall()); logicalOutputSlots.add(logicalOutputSlot); logicalIntermediateSlots.add(logicalIntermediateSlot); }
/** * True if the partition exprs and ordering elements and the window of analyticExpr match ours. */ public boolean isCompatible(AnalyticExpr analyticExpr) { if (requiresIndependentEval(analyticExprs.get(0)) || requiresIndependentEval(analyticExpr)) { return false; } if (!Expr.equalSets(analyticExpr.getPartitionExprs(), partitionByExprs)) { return false; } if (!analyticExpr.getOrderByElements().equals(orderByElements)) return false; if ((window == null) != (analyticExpr.getWindow() == null)) return false; if (window == null) return true; return analyticExpr.getWindow().equals(window); }
/** True if this analytic function must be evaluated in its own WindowGroup. */ private static boolean requiresIndependentEval(AnalyticExpr analyticExpr) { return analyticExpr .getFnCall() .getFnName() .getFunction() .equals(AnalyticExpr.FIRST_VALUE_REWRITE); }
/** * Adds the given analytic expr and its logical slots to this window group. Assumes the * corresponding analyticExpr is compatible with 'this'. */ public void add( AnalyticExpr analyticExpr, SlotDescriptor logicalOutputSlot, SlotDescriptor logicalIntermediateSlot) { Preconditions.checkState(isCompatible(analyticExpr)); analyticExprs.add(analyticExpr); analyticFnCalls.add(analyticExpr.getFnCall()); logicalOutputSlots.add(logicalOutputSlot); logicalIntermediateSlots.add(logicalIntermediateSlot); }