private WindowOperator createHelperWindowOperator(List<Mutable<ILogicalExpression>> partExprList,
List<Pair<OrderOperator.IOrder, Mutable<ILogicalExpression>>> orderExprList, LogicalVariable rowNumVar,
LogicalVariable denseRankVar, ListSet<LogicalVariable> usedVars, SourceLocation sourceLoc)
throws CompilationException {
WindowOperator winOp = new WindowOperator(partExprList, orderExprList);
winOp.setSourceLocation(sourceLoc);
for (LogicalVariable usedVar : usedVars) {
FunctionIdentifier fid;
if (usedVar.equals(rowNumVar)) {
fid = BuiltinFunctions.ROW_NUMBER_IMPL;
} else if (usedVar.equals(denseRankVar)) {
fid = BuiltinFunctions.DENSE_RANK_IMPL;
} else {
throw new CompilationException(ErrorCode.COMPILATION_ILLEGAL_STATE, sourceLoc, usedVar.toString());
}
AbstractFunctionCallExpression valueExpr =
BuiltinFunctions.makeWindowFunctionExpression(fid, new ArrayList<>());
if (BuiltinFunctions.windowFunctionHasProperty(valueExpr.getFunctionIdentifier(),
BuiltinFunctions.WindowFunctionProperty.INJECT_ORDER_ARGS)) {
for (Pair<OrderOperator.IOrder, Mutable<ILogicalExpression>> p : orderExprList) {
valueExpr.getArguments().add(new MutableObject<>(p.second.getValue().cloneExpression()));
}
}
valueExpr.setSourceLocation(winOp.getSourceLocation());
winOp.getVariables().add(usedVar);
winOp.getExpressions().add(new MutableObject<>(valueExpr));
}
return winOp;
}
}