diff --git a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchMergeAggregatorFactory.java b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchMergeAggregatorFactory.java index f1a0b1a89621..b82b35babe4f 100644 --- a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchMergeAggregatorFactory.java +++ b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchMergeAggregatorFactory.java @@ -25,6 +25,8 @@ import com.yahoo.sketches.hll.TgtHllType; import com.yahoo.sketches.hll.Union; import org.apache.druid.query.aggregation.Aggregator; +import org.apache.druid.query.aggregation.AggregatorFactory; +import org.apache.druid.query.aggregation.AggregatorFactoryNotMergeableException; import org.apache.druid.query.aggregation.AggregatorUtil; import org.apache.druid.query.aggregation.BufferAggregator; import org.apache.druid.segment.ColumnSelectorFactory; @@ -51,6 +53,23 @@ public HllSketchMergeAggregatorFactory( super(name, fieldName, lgK, tgtHllType); } + @Override + public AggregatorFactory getMergingFactory(AggregatorFactory other) throws AggregatorFactoryNotMergeableException + { + if (other.getName().equals(this.getName()) && other instanceof HllSketchMergeAggregatorFactory) { + HllSketchMergeAggregatorFactory castedOther = (HllSketchMergeAggregatorFactory) other; + + return new HllSketchMergeAggregatorFactory( + getName(), + getName(), + Math.max(getLgK(), castedOther.getLgK()), + getTgtHllType().compareTo(castedOther.getTgtHllType()) < 0 ? castedOther.getTgtHllType() : getTgtHllType() + ); + } else { + throw new AggregatorFactoryNotMergeableException(this, other); + } + } + @Override public String getTypeName() {