package brickhouse.udf.collect; import org.apache.hadoop.hive.ql.metadata.HiveException; import java.util.HashMap; import java.util.Map; import static org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory; import static org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory.*; public class CollectMergeMaxUDAF extends AbstractCollectMergeUDAF { @Override public Map<PrimitiveCategory, Class<? extends CollectMergeUDAFEvaluator>> evaluators() { return new HashMap<PrimitiveCategory, Class<? extends CollectMergeUDAFEvaluator>>() {{ put(BOOLEAN, BooleanEvaluator.class); put(BYTE, ByteEvaluator.class); put(SHORT, ShortEvaluator.class); put(INT, IntEvaluator.class); put(LONG, LongEvaluator.class); put(FLOAT, FloatEvaluator.class); put(DOUBLE, DoubleEvaluator.class); put(STRING, ComparableEvaluator.class); put(TIMESTAMP, ComparableEvaluator.class); }}; } public static class BooleanEvaluator extends CollectMergeUDAFEvaluator { public BooleanEvaluator() { } @Override public MergeAggBuffer getNewAggregationBuffer() throws HiveException { return new BooleanMergeMaxAggBuffer(); } } public static class BooleanMergeMaxAggBuffer extends HashMapMergeAggBuffer<Boolean> { public BooleanMergeMaxAggBuffer() { } @Override public Boolean mergeValues(Boolean left, Boolean right) { return left ? left : right; } } public static class ByteEvaluator extends CollectMergeUDAFEvaluator { public ByteEvaluator() { } @Override public MergeAggBuffer getNewAggregationBuffer() throws HiveException { return new ByteMergeMaxAggBuffer(); } } public static class ByteMergeMaxAggBuffer extends HashMapMergeAggBuffer<Byte> { public ByteMergeMaxAggBuffer() { } @Override public Byte mergeValues(Byte left, Byte right) { return left >= right ? left : right; } } public static class ShortEvaluator extends CollectMergeUDAFEvaluator { public ShortEvaluator() { } @Override public MergeAggBuffer getNewAggregationBuffer() throws HiveException { return new ShortMergeMaxAggBuffer(); } } public static class ShortMergeMaxAggBuffer extends HashMapMergeAggBuffer<Short> { public ShortMergeMaxAggBuffer() { } @Override public Short mergeValues(Short left, Short right) { return left >= right ? left : right; } } public static class IntEvaluator extends CollectMergeUDAFEvaluator { public IntEvaluator() { } @Override public MergeAggBuffer getNewAggregationBuffer() throws HiveException { return new IntMergeMaxAggBuffer(); } } public static class IntMergeMaxAggBuffer extends HashMapMergeAggBuffer<Integer> { public IntMergeMaxAggBuffer() { } @Override public Integer mergeValues(Integer left, Integer right) { return left >= right ? left : right; } } public static class LongEvaluator extends CollectMergeUDAFEvaluator { public LongEvaluator() { } @Override public MergeAggBuffer getNewAggregationBuffer() throws HiveException { return new LongMergeMaxAggBuffer(); } } public static class LongMergeMaxAggBuffer extends HashMapMergeAggBuffer<Long> { public LongMergeMaxAggBuffer() { } @Override public Long mergeValues(Long left, Long right) { return left >= right ? left : right; } } public static class FloatEvaluator extends CollectMergeUDAFEvaluator { public FloatEvaluator() { } @Override public MergeAggBuffer getNewAggregationBuffer() throws HiveException { return new FloatMergeMaxAggBuffer(); } } public static class FloatMergeMaxAggBuffer extends HashMapMergeAggBuffer<Float> { public FloatMergeMaxAggBuffer() { } @Override public Float mergeValues(Float left, Float right) { return left >= right ? left : right; } } public static class DoubleEvaluator extends CollectMergeUDAFEvaluator { public DoubleEvaluator() { } @Override public MergeAggBuffer getNewAggregationBuffer() throws HiveException { return new DoubleMergeMaxAggBuffer(); } } public static class DoubleMergeMaxAggBuffer extends HashMapMergeAggBuffer<Double> { public DoubleMergeMaxAggBuffer() { } @Override public Double mergeValues(Double left, Double right) { return left >= right ? left : right; } } public static class ComparableEvaluator<T extends Comparable<? super T>> extends CollectMergeUDAFEvaluator { public ComparableEvaluator() { } @Override public MergeAggBuffer getNewAggregationBuffer() throws HiveException { return new ComparableMergeMaxAggBuffer<T>(); } } public static class ComparableMergeMaxAggBuffer<T extends Comparable<? super T>> extends HashMapMergeAggBuffer<T> { public ComparableMergeMaxAggBuffer() { } @Override public T mergeValues(T left, T right) { return left.compareTo(right) >= 0 ? left : right; } } }