blob: 0e0f1d23826eb10196a2a88570e3f711ff582a2c [file] [log] [blame]
/*
* 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.kylin.measure.percentile;
import java.util.Map;
import org.apache.kylin.common.util.Dictionary;
import org.apache.kylin.measure.MeasureAggregator;
import org.apache.kylin.measure.MeasureIngester;
import org.apache.kylin.measure.MeasureType;
import org.apache.kylin.measure.MeasureTypeFactory;
import org.apache.kylin.metadata.datatype.DataType;
import org.apache.kylin.metadata.datatype.DataTypeSerializer;
import org.apache.kylin.metadata.model.MeasureDesc;
import org.apache.kylin.metadata.model.TblColRef;
import com.google.common.collect.ImmutableMap;
public class PercentileMeasureType extends MeasureType<PercentileCounter> {
// compression ratio saved in DataType.precision
private final DataType dataType;
public static final String FUNC_PERCENTILE = "PERCENTILE";
public static final String FUNC_PERCENTILE_APPROX = "PERCENTILE_APPROX";
public static final String DATATYPE_PERCENTILE = "percentile";
public PercentileMeasureType(String funcName, DataType dataType) {
this.dataType = dataType;
}
public static class Factory extends MeasureTypeFactory<PercentileCounter> {
@Override
public MeasureType<PercentileCounter> createMeasureType(String funcName, DataType dataType) {
return new PercentileMeasureType(funcName, dataType);
}
@Override
public String getAggrFunctionName() {
return FUNC_PERCENTILE;
}
@Override
public String getAggrDataTypeName() {
return DATATYPE_PERCENTILE;
}
@Override
public Class<? extends DataTypeSerializer<PercentileCounter>> getAggrDataTypeSerializer() {
return PercentileSerializer.class;
}
}
@Override
public MeasureIngester<PercentileCounter> newIngester() {
return new MeasureIngester<PercentileCounter>() {
PercentileCounter current = new PercentileCounter(dataType.getPrecision());
@Override
public PercentileCounter valueOf(String[] values, MeasureDesc measureDesc,
Map<TblColRef, Dictionary<String>> dictionaryMap) {
PercentileCounter counter = current;
counter.clear();
for (String v : values) {
if (v != null)
counter.add(Double.parseDouble(v));
}
return counter;
}
@Override
public void reset() {
current = new PercentileCounter(dataType.getPrecision());
}
};
}
@Override
public MeasureAggregator<PercentileCounter> newAggregator() {
return new PercentileAggregator(dataType.getPrecision());
}
@Override
public boolean needRewrite() {
return true;
}
static final Map<String, Class<?>> UDAF_MAP = ImmutableMap.<String, Class<?>> of(
PercentileMeasureType.FUNC_PERCENTILE, PercentileAggFunc.class,
PercentileMeasureType.FUNC_PERCENTILE_APPROX, PercentileAggFunc.class);
@Override
public Map<String, Class<?>> getRewriteCalciteAggrFunctions() {
return UDAF_MAP;
}
}