@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void execute(PartitionIterator<Object> pItr, Partition outP) throws WindowingException
{
ArrayList<List<?>> oColumns = new ArrayList<List<?>>();
Partition iPart = pItr.getPartition();
StructObjectInspector inputOI;
try {
inputOI = (StructObjectInspector) iPart.getSerDe().getObjectInspector();
} catch (SerDeException se) {
throw new WindowingException(se);
}
try
{
for(WindowFunctionDef wFn : wFnDefs)
{
boolean processWindow = wFn.getWindow() != null;
pItr.reset();
if ( !processWindow )
{
GenericUDAFEvaluator fEval = wFn.getEvaluator();
Object[] args = new Object[wFn.getArgs().size()];
AggregationBuffer aggBuffer = fEval.getNewAggregationBuffer();
while(pItr.hasNext())
{
Object row = pItr.next();
int i =0;
for(ArgDef arg : wFn.getArgs())
{
args[i++] = arg.getExprEvaluator().evaluate(row);
}
fEval.aggregate(aggBuffer, args);
}
Object out = fEval.evaluate(aggBuffer);
WindowFunctionInfo wFnInfo = FunctionRegistry.getWindowFunctionInfo(wFn.getSpec().getName());
if ( !wFnInfo.isPivotResult())
{
out = new SameList(iPart.size(), out);
}
oColumns.add((List<?>)out);
}
else
{
oColumns.add(executeFnwithWindow(getQueryDef(), wFn, iPart));
}
}
for(int i=0; i < iPart.size(); i++)
{
ArrayList oRow = new ArrayList();
Object iRow = iPart.getAt(i);
for(StructField f : inputOI.getAllStructFieldRefs())
{
oRow.add(inputOI.getStructFieldData(iRow, f));
}