/**
* Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com)
*
* 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.linkedin.pinot.core.query.aggregation.function;
import com.linkedin.pinot.core.common.BlockValSet;
import com.linkedin.pinot.core.query.aggregation.AggregationResultHolder;
import com.linkedin.pinot.core.query.aggregation.groupby.GroupByResultHolder;
import javax.annotation.Nonnull;
public class MinMaxRangeMVAggregationFunction extends MinMaxRangeAggregationFunction {
private static final String NAME = AggregationFunctionFactory.AggregationFunctionType.MINMAXRANGEMV.getName();
@Nonnull
@Override
public String getName() {
return NAME;
}
@Nonnull
@Override
public String getColumnName(@Nonnull String[] columns) {
return NAME + "_" + columns[0];
}
@Override
public void aggregate(int length, @Nonnull AggregationResultHolder aggregationResultHolder,
@Nonnull BlockValSet... blockValSets) {
double[][] valuesArray = blockValSets[0].getDoubleValuesMV();
double min = Double.POSITIVE_INFINITY;
double max = Double.NEGATIVE_INFINITY;
for (int i = 0; i < length; i++) {
double[] values = valuesArray[i];
for (double value : values) {
if (value < min) {
min = value;
}
if (value > max) {
max = value;
}
}
}
setAggregationResult(aggregationResultHolder, min, max);
}
@Override
public void aggregateGroupBySV(int length, @Nonnull int[] groupKeyArray,
@Nonnull GroupByResultHolder groupByResultHolder, @Nonnull BlockValSet... blockValSets) {
double[][] valuesArray = blockValSets[0].getDoubleValuesMV();
for (int i = 0; i < length; i++) {
aggregateOnGroupKey(groupKeyArray[i], groupByResultHolder, valuesArray[i]);
}
}
@Override
public void aggregateGroupByMV(int length, @Nonnull int[][] groupKeysArray,
@Nonnull GroupByResultHolder groupByResultHolder, @Nonnull BlockValSet... blockValSets) {
double[][] valuesArray = blockValSets[0].getDoubleValuesMV();
for (int i = 0; i < length; i++) {
double[] values = valuesArray[i];
for (int groupKey : groupKeysArray[i]) {
aggregateOnGroupKey(groupKey, groupByResultHolder, values);
}
}
}
private void aggregateOnGroupKey(int groupKey, @Nonnull GroupByResultHolder groupByResultHolder, double[] values) {
double min = Double.POSITIVE_INFINITY;
double max = Double.NEGATIVE_INFINITY;
for (double value : values) {
if (value < min) {
min = value;
}
if (value > max) {
max = value;
}
}
setGroupByResult(groupKey, groupByResultHolder, min, max);
}
}