Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package com.facebook.presto.operator.window;
 
 
 import java.util.List;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
 public class AggregateWindowFunction
         implements WindowFunction
 {
     private final InternalAggregationFunction function;
     private final int[] argumentChannels;
     private final AccumulatorFactory accumulatorFactory;
 
     private WindowIndex windowIndex;
     private Accumulator accumulator;
     private int currentStart;
     private int currentEnd;
 
     private AggregateWindowFunction(InternalAggregationFunction functionList<IntegerargumentChannels)
     {
         this. = checkNotNull(function"function is null");
         this. = Ints.toArray(argumentChannels);
         this. = function.bind(createArgs(function), Optional.empty(), Optional.empty(), 1.0);
     }
 
     @Override
     public Type getType()
     {
         return .getFinalType();
     }
 
     @Override
     public void reset(WindowIndex windowIndex)
     {
         this. = windowIndex;
         resetAccumulator();
     }
 
     @Override
     public void processRow(BlockBuilder outputint peerGroupStartint peerGroupEndint frameStartint frameEnd)
     {
         if (frameStart < 0) {
             // empty frame
             resetAccumulator();
         }
         else if ((frameStart == ) && (frameEnd >= )) {
             // same or expanding frame
             accumulate( + 1, frameEnd);
              = frameEnd;
         }
         else {
             // different frame
             resetAccumulator();
             accumulate(frameStartframeEnd);
              = frameStart;
              = frameEnd;
         }
 
         .evaluateFinal(output);
     }
 
     private void accumulate(int startint end)
     {
         // TODO: add Accumulator method that does not require creating pages
         PageBuilder pageBuilder = new PageBuilder(.getParameterTypes());
         for (int position = startposition <= endposition++) {
             for (int i = 0; i < .getParameterTypes().size(); i++) {
                 .appendTo([i], positionpageBuilder.getBlockBuilder(i));
             }
             pageBuilder.declarePosition();
         }
         .addInput(pageBuilder.build());
     }
 
     private void resetAccumulator()
    {
        if ( >= 0) {
             = .createAccumulator();
             = -1;
             = -1;
        }
    }
    public static WindowFunctionSupplier supplier(Signature signaturefinal InternalAggregationFunction function)
    {
        checkNotNull(function"function is null");
        return new AbstractWindowFunctionSupplier(signaturenull)
        {
            @Override
            protected WindowFunction newWindowFunction(List<Integerinputs)
            {
                return new AggregateWindowFunction(functioninputs);
            }
        };
    }
    private static List<IntegercreateArgs(InternalAggregationFunction function)
    {
        ImmutableList.Builder<Integerlist = ImmutableList.builder();
        for (int i = 0; i < function.getParameterTypes().size(); i++) {
            list.add(i);
        }
        return list.build();
    }
New to GrepCode? Check out our FAQ X