/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.hadoop.hive.ql.exec.vector.expressions.aggregates; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.vector.VectorAggregationBufferRow; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.plan.AggregationDesc; import org.apache.hadoop.hive.ql.util.JavaDataModel; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.io.LongWritable; /** * VectorUDAFCountStar. Vectorized implementation for COUNT(*) aggregates. */ @Description(name = "count", value = "_FUNC_(expr) - Returns count(*) (vectorized)") public class VectorUDAFCountStar extends VectorAggregateExpression { private static final long serialVersionUID = 1L; /** * class for storing the current aggregate value. */ static class Aggregation implements AggregationBuffer { private static final long serialVersionUID = 1L; transient private long count; @Override public int getVariableSize() { throw new UnsupportedOperationException(); } @Override public void reset() { count = 0L; } } @Override public VectorExpression inputExpression() { // None. return null; } transient private final LongWritable result; public VectorUDAFCountStar(VectorExpression inputExpression) { this(); } public VectorUDAFCountStar() { super(); result = new LongWritable(0); } private Aggregation getCurrentAggregationBuffer( VectorAggregationBufferRow[] aggregationBufferSets, int aggregateIndex, int row) { VectorAggregationBufferRow mySet = aggregationBufferSets[row]; Aggregation myagg = (Aggregation) mySet.getAggregationBuffer(aggregateIndex); return myagg; } @Override public void aggregateInputSelection( VectorAggregationBufferRow[] aggregationBufferSets, int aggregateIndex, VectorizedRowBatch batch) throws HiveException { int batchSize = batch.size; if (batchSize == 0) { return; } // count(*) cares not about NULLs nor selection for (int i=0; i < batchSize; ++i) { Aggregation myAgg = getCurrentAggregationBuffer( aggregationBufferSets, aggregateIndex, i); ++myAgg.count; } } @Override public void aggregateInput(AggregationBuffer agg, VectorizedRowBatch batch) throws HiveException { int batchSize = batch.size; if (batchSize == 0) { return; } Aggregation myagg = (Aggregation)agg; myagg.count += batchSize; } @Override public AggregationBuffer getNewAggregationBuffer() throws HiveException { return new Aggregation(); } @Override public void reset(AggregationBuffer agg) throws HiveException { Aggregation myAgg = (Aggregation) agg; myAgg.reset(); } @Override public Object evaluateOutput(AggregationBuffer agg) throws HiveException { Aggregation myagg = (Aggregation) agg; result.set (myagg.count); return result; } @Override public ObjectInspector getOutputObjectInspector() { return PrimitiveObjectInspectorFactory.writableLongObjectInspector; } @Override public long getAggregationBufferFixedSize() { JavaDataModel model = JavaDataModel.get(); return JavaDataModel.alignUp( model.object() + model.primitive2() + model.primitive1(), model.memoryAlign()); } @Override public void init(AggregationDesc desc) throws HiveException { // No-op } }