This is an automated email from the ASF dual-hosted git repository.

gian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 741b4ed  add output type information to ExpressionPostAggregator 
(#11818)
741b4ed is described below

commit 741b4ed516044ef95e685419ef5cf4aa5c0d1e8e
Author: Clint Wylie <[email protected]>
AuthorDate: Fri Oct 22 13:52:51 2021 -0700

    add output type information to ExpressionPostAggregator (#11818)
    
    * add ColumnInspector argument to PostAggregator.getType to allow post-aggs 
to compute their output type based on input types
    
    * add test for test for coverage
    
    * simplify
    
    * Remove unused imports.
    
    Co-authored-by: Gian Merlino <[email protected]>
---
 .../druid/math/expr/SettableObjectBinding.java     |   7 +
 .../math/expr/SettableObjectBindingTest.java}      |  42 ++----
 .../aggregator/MomentSketchMaxPostAggregator.java  |   3 +-
 .../aggregator/MomentSketchMinPostAggregator.java  |   3 +-
 .../MomentSketchQuantilePostAggregator.java        |   3 +-
 .../TDigestSketchToQuantilePostAggregator.java     |   3 +-
 .../TDigestSketchToQuantilesPostAggregator.java    |   3 +-
 .../hll/HllSketchToEstimatePostAggregator.java     |   3 +-
 ...llSketchToEstimateWithBoundsPostAggregator.java |   3 +-
 .../hll/HllSketchToStringPostAggregator.java       |   3 +-
 .../hll/HllSketchUnionPostAggregator.java          |   4 +-
 .../DoublesSketchToCDFPostAggregator.java          |   3 +-
 .../DoublesSketchToHistogramPostAggregator.java    |   4 +-
 .../DoublesSketchToQuantilePostAggregator.java     |   3 +-
 .../DoublesSketchToQuantilesPostAggregator.java    |   3 +-
 .../DoublesSketchToRankPostAggregator.java         |   3 +-
 .../DoublesSketchToStringPostAggregator.java       |   3 +-
 .../theta/SketchConstantPostAggregator.java        |   4 +-
 .../theta/SketchEstimatePostAggregator.java        |   3 +-
 .../theta/SketchSetPostAggregator.java             |   4 +-
 .../theta/SketchToStringPostAggregator.java        |   3 +-
 .../ArrayOfDoublesSketchSetOpPostAggregator.java   |   4 +-
 .../ArrayOfDoublesSketchTTestPostAggregator.java   |   3 +-
 ...lesSketchToEstimateAndBoundsPostAggregator.java |   3 +-
 ...rayOfDoublesSketchToEstimatePostAggregator.java |   3 +-
 .../ArrayOfDoublesSketchToMeansPostAggregator.java |   3 +-
 ...yOfDoublesSketchToNumEntriesPostAggregator.java |   3 +-
 ...ublesSketchToQuantilesSketchPostAggregator.java |   4 +-
 ...ArrayOfDoublesSketchToStringPostAggregator.java |   3 +-
 ...ayOfDoublesSketchToVariancesPostAggregator.java |   3 +-
 .../histogram/BucketsPostAggregator.java           |   4 +-
 .../histogram/CustomBucketsPostAggregator.java     |   4 +-
 .../histogram/EqualBucketsPostAggregator.java      |   4 +-
 .../aggregation/histogram/MaxPostAggregator.java   |   3 +-
 .../aggregation/histogram/MinPostAggregator.java   |   3 +-
 .../histogram/QuantilePostAggregator.java          |   3 +-
 .../histogram/QuantilesPostAggregator.java         |   4 +-
 .../teststats/PvaluefromZscorePostAggregator.java  |   3 +-
 .../aggregation/teststats/ZtestPostAggregator.java |   3 +-
 .../variance/StandardDeviationPostAggregator.java  |   3 +-
 .../druid/query/aggregation/PostAggregator.java    |   4 +-
 .../HyperUniqueFinalizingPostAggregator.java       |   3 +-
 .../aggregation/post/ArithmeticPostAggregator.java |   3 +-
 .../aggregation/post/ConstantPostAggregator.java   |   3 +-
 .../post/DoubleGreatestPostAggregator.java         |   3 +-
 .../post/DoubleLeastPostAggregator.java            |   3 +-
 .../aggregation/post/ExpressionPostAggregator.java |  25 ++--
 .../post/FieldAccessPostAggregator.java            |  13 +-
 .../post/FinalizingFieldAccessPostAggregator.java  |   3 +-
 .../aggregation/post/JavaScriptPostAggregator.java |   3 +-
 .../post/LongGreatestPostAggregator.java           |   3 +-
 .../aggregation/post/LongLeastPostAggregator.java  |   3 +-
 .../apache/druid/segment/column/RowSignature.java  |   5 +-
 .../post/ExpressionPostAggregatorTest.java         | 144 +++++++++++++++++++++
 .../post/FieldAccessPostAggregatorTest.java        |  46 ++++++-
 55 files changed, 337 insertions(+), 100 deletions(-)

diff --git 
a/core/src/main/java/org/apache/druid/math/expr/SettableObjectBinding.java 
b/core/src/main/java/org/apache/druid/math/expr/SettableObjectBinding.java
index 8b414e5..600e1e2 100644
--- a/core/src/main/java/org/apache/druid/math/expr/SettableObjectBinding.java
+++ b/core/src/main/java/org/apache/druid/math/expr/SettableObjectBinding.java
@@ -19,6 +19,7 @@
 
 package org.apache.druid.math.expr;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Maps;
 
 import javax.annotation.Nullable;
@@ -54,4 +55,10 @@ public class SettableObjectBinding implements 
Expr.ObjectBinding
     bindings.put(name, value);
     return this;
   }
+
+  @VisibleForTesting
+  public Map<String, Object> asMap()
+  {
+    return bindings;
+  }
 }
diff --git 
a/core/src/main/java/org/apache/druid/math/expr/SettableObjectBinding.java 
b/core/src/test/java/org/apache/druid/math/expr/SettableObjectBindingTest.java
similarity index 55%
copy from 
core/src/main/java/org/apache/druid/math/expr/SettableObjectBinding.java
copy to 
core/src/test/java/org/apache/druid/math/expr/SettableObjectBindingTest.java
index 8b414e5..399094f 100644
--- a/core/src/main/java/org/apache/druid/math/expr/SettableObjectBinding.java
+++ 
b/core/src/test/java/org/apache/druid/math/expr/SettableObjectBindingTest.java
@@ -19,39 +19,21 @@
 
 package org.apache.druid.math.expr;
 
-import com.google.common.collect.Maps;
 
-import javax.annotation.Nullable;
-import java.util.HashMap;
-import java.util.Map;
+import com.google.common.collect.ImmutableMap;
+import org.junit.Assert;
+import org.junit.Test;
 
-/**
- * Simple map backed object binding
- */
-public class SettableObjectBinding implements Expr.ObjectBinding
+public class SettableObjectBindingTest
 {
-  private final Map<String, Object> bindings;
-
-  public SettableObjectBinding()
-  {
-    this.bindings = new HashMap<>();
-  }
-
-  public SettableObjectBinding(int expectedSize)
-  {
-    this.bindings = Maps.newHashMapWithExpectedSize(expectedSize);
-  }
-
-  @Nullable
-  @Override
-  public Object get(String name)
-  {
-    return bindings.get(name);
-  }
-
-  public SettableObjectBinding withBinding(String name, @Nullable Object value)
+  @Test
+  public void testSettableBinding()
   {
-    bindings.put(name, value);
-    return this;
+    SettableObjectBinding binding = new SettableObjectBinding(10);
+    Assert.assertEquals(0, binding.asMap().size());
+    binding = binding.withBinding("x", ExpressionType.LONG);
+    Assert.assertEquals(ExpressionType.LONG, binding.get("x"));
+    Assert.assertNull(binding.get("y"));
+    Assert.assertEquals(ImmutableMap.of("x", ExpressionType.LONG), 
binding.asMap());
   }
 }
diff --git 
a/extensions-contrib/momentsketch/src/main/java/org/apache/druid/query/aggregation/momentsketch/aggregator/MomentSketchMaxPostAggregator.java
 
b/extensions-contrib/momentsketch/src/main/java/org/apache/druid/query/aggregation/momentsketch/aggregator/MomentSketchMaxPostAggregator.java
index 9237041..1e7a625 100644
--- 
a/extensions-contrib/momentsketch/src/main/java/org/apache/druid/query/aggregation/momentsketch/aggregator/MomentSketchMaxPostAggregator.java
+++ 
b/extensions-contrib/momentsketch/src/main/java/org/apache/druid/query/aggregation/momentsketch/aggregator/MomentSketchMaxPostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.momentsketch.MomentSketchWrapper;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -59,7 +60,7 @@ public class MomentSketchMaxPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/extensions-contrib/momentsketch/src/main/java/org/apache/druid/query/aggregation/momentsketch/aggregator/MomentSketchMinPostAggregator.java
 
b/extensions-contrib/momentsketch/src/main/java/org/apache/druid/query/aggregation/momentsketch/aggregator/MomentSketchMinPostAggregator.java
index 34f3af0..f0646f2 100644
--- 
a/extensions-contrib/momentsketch/src/main/java/org/apache/druid/query/aggregation/momentsketch/aggregator/MomentSketchMinPostAggregator.java
+++ 
b/extensions-contrib/momentsketch/src/main/java/org/apache/druid/query/aggregation/momentsketch/aggregator/MomentSketchMinPostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.momentsketch.MomentSketchWrapper;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -58,7 +59,7 @@ public class MomentSketchMinPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/extensions-contrib/momentsketch/src/main/java/org/apache/druid/query/aggregation/momentsketch/aggregator/MomentSketchQuantilePostAggregator.java
 
b/extensions-contrib/momentsketch/src/main/java/org/apache/druid/query/aggregation/momentsketch/aggregator/MomentSketchQuantilePostAggregator.java
index 3852e78..f1710f4 100644
--- 
a/extensions-contrib/momentsketch/src/main/java/org/apache/druid/query/aggregation/momentsketch/aggregator/MomentSketchQuantilePostAggregator.java
+++ 
b/extensions-contrib/momentsketch/src/main/java/org/apache/druid/query/aggregation/momentsketch/aggregator/MomentSketchQuantilePostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.momentsketch.MomentSketchWrapper;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Arrays;
@@ -63,7 +64,7 @@ public class MomentSketchQuantilePostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE_ARRAY;
   }
diff --git 
a/extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchToQuantilePostAggregator.java
 
b/extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchToQuantilePostAggregator.java
index 987a15a..845546c 100644
--- 
a/extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchToQuantilePostAggregator.java
+++ 
b/extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchToQuantilePostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -68,7 +69,7 @@ public class TDigestSketchToQuantilePostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchToQuantilesPostAggregator.java
 
b/extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchToQuantilesPostAggregator.java
index 25f4c25..932a772 100644
--- 
a/extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchToQuantilesPostAggregator.java
+++ 
b/extensions-contrib/tdigestsketch/src/main/java/org/apache/druid/query/aggregation/tdigestsketch/TDigestSketchToQuantilesPostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Arrays;
@@ -69,7 +70,7 @@ public class TDigestSketchToQuantilesPostAggregator 
implements PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE_ARRAY;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchToEstimatePostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchToEstimatePostAggregator.java
index df4b4ec..52dc625 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchToEstimatePostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchToEstimatePostAggregator.java
@@ -27,6 +27,7 @@ import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.ArithmeticPostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -64,7 +65,7 @@ public class HllSketchToEstimatePostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return round ? ColumnType.LONG : ColumnType.DOUBLE;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchToEstimateWithBoundsPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchToEstimateWithBoundsPostAggregator.java
index ff9d796..e36b41e 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchToEstimateWithBoundsPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchToEstimateWithBoundsPostAggregator.java
@@ -27,6 +27,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -70,7 +71,7 @@ public class HllSketchToEstimateWithBoundsPostAggregator 
implements PostAggregat
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE_ARRAY;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchToStringPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchToStringPostAggregator.java
index a673ad2..f213ad9 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchToStringPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchToStringPostAggregator.java
@@ -26,6 +26,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -87,7 +88,7 @@ public class HllSketchToStringPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.STRING;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchUnionPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchUnionPostAggregator.java
index f180dbc..833d12d 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchUnionPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/hll/HllSketchUnionPostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -73,9 +74,10 @@ public class HllSketchUnionPostAggregator implements 
PostAggregator
 
   /**
    * actual type is {@link HllSketch}
+   * @param signature
    */
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return HllSketchMergeAggregatorFactory.TYPE;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToCDFPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToCDFPostAggregator.java
index 3af4413..7427f94 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToCDFPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToCDFPostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Arrays;
@@ -73,7 +74,7 @@ public class DoublesSketchToCDFPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE_ARRAY;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToHistogramPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToHistogramPostAggregator.java
index 34cdd6a..f707c27 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToHistogramPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToHistogramPostAggregator.java
@@ -29,6 +29,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -105,9 +106,10 @@ public class DoublesSketchToHistogramPostAggregator 
implements PostAggregator
 
   /**
    * actual type is {@link DoublesSketch}
+   * @param signature
    */
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE_ARRAY;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToQuantilePostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToQuantilePostAggregator.java
index f387ee8..97de4e2 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToQuantilePostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToQuantilePostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -61,7 +62,7 @@ public class DoublesSketchToQuantilePostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToQuantilesPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToQuantilesPostAggregator.java
index a4bf3bc..d0c8af2 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToQuantilesPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToQuantilesPostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Arrays;
@@ -61,7 +62,7 @@ public class DoublesSketchToQuantilesPostAggregator 
implements PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE_ARRAY;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToRankPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToRankPostAggregator.java
index 5ab2683..5196029 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToRankPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToRankPostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -61,7 +62,7 @@ public class DoublesSketchToRankPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToStringPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToStringPostAggregator.java
index 8857e6e..1f98f42 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToStringPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/quantiles/DoublesSketchToStringPostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -58,7 +59,7 @@ public class DoublesSketchToStringPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.STRING;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchConstantPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchConstantPostAggregator.java
index 708a5e4..b3541bd 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchConstantPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchConstantPostAggregator.java
@@ -27,6 +27,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Collections;
@@ -80,9 +81,10 @@ public class SketchConstantPostAggregator implements 
PostAggregator
 
   /**
    * actual type is {@link SketchHolder}
+   * @param signature
    */
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return SketchModule.BUILD_TYPE;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchEstimatePostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchEstimatePostAggregator.java
index ccda663..119fb01 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchEstimatePostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchEstimatePostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -102,7 +103,7 @@ public class SketchEstimatePostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return errorBoundsStdDev != null ? SketchModule.MERGE_TYPE : 
ColumnType.DOUBLE;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchSetPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchSetPostAggregator.java
index 92ff6aa..eef2889 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchSetPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchSetPostAggregator.java
@@ -27,6 +27,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -97,9 +98,10 @@ public class SketchSetPostAggregator implements 
PostAggregator
 
   /**
    * actual type is {@link SketchHolder}
+   * @param signature
    */
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return SketchModule.MERGE_TYPE;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchToStringPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchToStringPostAggregator.java
index 9dab445..29265de 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchToStringPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/theta/SketchToStringPostAggregator.java
@@ -25,6 +25,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -80,7 +81,7 @@ public class SketchToStringPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.STRING;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchSetOpPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchSetOpPostAggregator.java
index cd19337..6cbb3a0 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchSetOpPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchSetOpPostAggregator.java
@@ -27,6 +27,7 @@ import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -95,9 +96,10 @@ public class ArrayOfDoublesSketchSetOpPostAggregator extends 
ArrayOfDoublesSketc
 
   /**
    * actual type is {@link ArrayOfDoublesSketch}
+   * @param signature
    */
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ArrayOfDoublesSketchModule.MERGE_TYPE;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchTTestPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchTTestPostAggregator.java
index 86930b4..e04f558 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchTTestPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchTTestPostAggregator.java
@@ -29,6 +29,7 @@ import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Arrays;
@@ -88,7 +89,7 @@ public class ArrayOfDoublesSketchTTestPostAggregator extends 
ArrayOfDoublesSketc
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE_ARRAY;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToEstimateAndBoundsPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToEstimateAndBoundsPostAggregator.java
index d9519df..ed6008e 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToEstimateAndBoundsPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToEstimateAndBoundsPostAggregator.java
@@ -26,6 +26,7 @@ import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -70,7 +71,7 @@ public class 
ArrayOfDoublesSketchToEstimateAndBoundsPostAggregator extends Array
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE_ARRAY;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToEstimatePostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToEstimatePostAggregator.java
index 0052e06..bb6cb3f 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToEstimatePostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToEstimatePostAggregator.java
@@ -25,6 +25,7 @@ import 
org.apache.datasketches.tuple.arrayofdoubles.ArrayOfDoublesSketch;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -53,7 +54,7 @@ public class ArrayOfDoublesSketchToEstimatePostAggregator 
extends ArrayOfDoubles
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToMeansPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToMeansPostAggregator.java
index 4054b64..fb490c8 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToMeansPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToMeansPostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Arrays;
@@ -69,7 +70,7 @@ public class ArrayOfDoublesSketchToMeansPostAggregator 
extends ArrayOfDoublesSke
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE_ARRAY;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToNumEntriesPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToNumEntriesPostAggregator.java
index b4dad0b..d696c82 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToNumEntriesPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToNumEntriesPostAggregator.java
@@ -25,6 +25,7 @@ import 
org.apache.datasketches.tuple.arrayofdoubles.ArrayOfDoublesSketch;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -53,7 +54,7 @@ public class ArrayOfDoublesSketchToNumEntriesPostAggregator 
extends ArrayOfDoubl
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.LONG;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToQuantilesSketchPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToQuantilesSketchPostAggregator.java
index 60fc04e..dc95af4 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToQuantilesSketchPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToQuantilesSketchPostAggregator.java
@@ -29,6 +29,7 @@ import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import 
org.apache.druid.query.aggregation.datasketches.quantiles.DoublesSketchAggregatorFactory;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -94,9 +95,10 @@ public class 
ArrayOfDoublesSketchToQuantilesSketchPostAggregator extends ArrayOf
 
   /**
    * actual type is {@link DoublesSketch}
+   * @param signature
    */
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ArrayOfDoublesSketchModule.MERGE_TYPE;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToStringPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToStringPostAggregator.java
index 8ed72e8..6eacf00 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToStringPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToStringPostAggregator.java
@@ -26,6 +26,7 @@ import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -56,7 +57,7 @@ public class ArrayOfDoublesSketchToStringPostAggregator 
extends ArrayOfDoublesSk
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.STRING;
   }
diff --git 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToVariancesPostAggregator.java
 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToVariancesPostAggregator.java
index 359792b..61579fe 100644
--- 
a/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToVariancesPostAggregator.java
+++ 
b/extensions-core/datasketches/src/main/java/org/apache/druid/query/aggregation/datasketches/tuple/ArrayOfDoublesSketchToVariancesPostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.query.aggregation.AggregatorUtil;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Arrays;
@@ -69,7 +70,7 @@ public class ArrayOfDoublesSketchToVariancesPostAggregator 
extends ArrayOfDouble
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE_ARRAY;
   }
diff --git 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/BucketsPostAggregator.java
 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/BucketsPostAggregator.java
index d42c15f..34115db 100644
--- 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/BucketsPostAggregator.java
+++ 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/BucketsPostAggregator.java
@@ -29,6 +29,7 @@ import 
org.apache.druid.query.aggregation.HistogramAggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Map;
@@ -72,9 +73,10 @@ public class BucketsPostAggregator extends 
ApproximateHistogramPostAggregator
 
   /**
    * actual type is {@link Histogram}
+   * @param signature
    */
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return HistogramAggregatorFactory.TYPE;
   }
diff --git 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/CustomBucketsPostAggregator.java
 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/CustomBucketsPostAggregator.java
index 01e22c5..0caf0bd 100644
--- 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/CustomBucketsPostAggregator.java
+++ 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/CustomBucketsPostAggregator.java
@@ -28,6 +28,7 @@ import 
org.apache.druid.query.aggregation.HistogramAggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Arrays;
@@ -65,9 +66,10 @@ public class CustomBucketsPostAggregator extends 
ApproximateHistogramPostAggrega
 
   /**
    * actual type is {@link Histogram}
+   * @param signature
    */
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return HistogramAggregatorFactory.TYPE;
   }
diff --git 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/EqualBucketsPostAggregator.java
 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/EqualBucketsPostAggregator.java
index cad63c7..a1efd79 100644
--- 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/EqualBucketsPostAggregator.java
+++ 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/EqualBucketsPostAggregator.java
@@ -29,6 +29,7 @@ import 
org.apache.druid.query.aggregation.HistogramAggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Map;
@@ -69,9 +70,10 @@ public class EqualBucketsPostAggregator extends 
ApproximateHistogramPostAggregat
 
   /**
    * actual type is {@link Histogram}
+   * @param signature
    */
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return HistogramAggregatorFactory.TYPE;
   }
diff --git 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/MaxPostAggregator.java
 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/MaxPostAggregator.java
index 7f0f5ba..d845e8f 100644
--- 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/MaxPostAggregator.java
+++ 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/MaxPostAggregator.java
@@ -27,6 +27,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -74,7 +75,7 @@ public class MaxPostAggregator extends 
ApproximateHistogramPostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/MinPostAggregator.java
 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/MinPostAggregator.java
index 5d856f7..21c7e21 100644
--- 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/MinPostAggregator.java
+++ 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/MinPostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -76,7 +77,7 @@ public class MinPostAggregator extends 
ApproximateHistogramPostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/QuantilePostAggregator.java
 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/QuantilePostAggregator.java
index f2efe05..86f6a06 100644
--- 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/QuantilePostAggregator.java
+++ 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/QuantilePostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -85,7 +86,7 @@ public class QuantilePostAggregator extends 
ApproximateHistogramPostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.FLOAT;
   }
diff --git 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/QuantilesPostAggregator.java
 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/QuantilesPostAggregator.java
index e2cca39..ceee9f1 100644
--- 
a/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/QuantilesPostAggregator.java
+++ 
b/extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/QuantilesPostAggregator.java
@@ -29,6 +29,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Arrays;
@@ -95,9 +96,10 @@ public class QuantilesPostAggregator extends 
ApproximateHistogramPostAggregator
 
   /**
    * actual type is {@link Quantiles}
+   * @param signature
    */
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     // todo: ???
     return ColumnType.UNKNOWN_COMPLEX;
diff --git 
a/extensions-core/stats/src/main/java/org/apache/druid/query/aggregation/teststats/PvaluefromZscorePostAggregator.java
 
b/extensions-core/stats/src/main/java/org/apache/druid/query/aggregation/teststats/PvaluefromZscorePostAggregator.java
index c25df5fa..df52cfe 100644
--- 
a/extensions-core/stats/src/main/java/org/apache/druid/query/aggregation/teststats/PvaluefromZscorePostAggregator.java
+++ 
b/extensions-core/stats/src/main/java/org/apache/druid/query/aggregation/teststats/PvaluefromZscorePostAggregator.java
@@ -31,6 +31,7 @@ import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.ArithmeticPostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Collections;
@@ -109,7 +110,7 @@ public class PvaluefromZscorePostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/extensions-core/stats/src/main/java/org/apache/druid/query/aggregation/teststats/ZtestPostAggregator.java
 
b/extensions-core/stats/src/main/java/org/apache/druid/query/aggregation/teststats/ZtestPostAggregator.java
index 2a647bb..f59949e 100644
--- 
a/extensions-core/stats/src/main/java/org/apache/druid/query/aggregation/teststats/ZtestPostAggregator.java
+++ 
b/extensions-core/stats/src/main/java/org/apache/druid/query/aggregation/teststats/ZtestPostAggregator.java
@@ -30,6 +30,7 @@ import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.ArithmeticPostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Collections;
@@ -123,7 +124,7 @@ public class ZtestPostAggregator implements PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/extensions-core/stats/src/main/java/org/apache/druid/query/aggregation/variance/StandardDeviationPostAggregator.java
 
b/extensions-core/stats/src/main/java/org/apache/druid/query/aggregation/variance/StandardDeviationPostAggregator.java
index f7d2bc6..2d01167 100644
--- 
a/extensions-core/stats/src/main/java/org/apache/druid/query/aggregation/variance/StandardDeviationPostAggregator.java
+++ 
b/extensions-core/stats/src/main/java/org/apache/druid/query/aggregation/variance/StandardDeviationPostAggregator.java
@@ -30,6 +30,7 @@ import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.ArithmeticPostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -90,7 +91,7 @@ public class StandardDeviationPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/PostAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/PostAggregator.java
index 61e85e4..06e64af 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/PostAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/PostAggregator.java
@@ -21,6 +21,7 @@ package org.apache.druid.query.aggregation;
 
 import org.apache.druid.guice.annotations.ExtensionPoint;
 import org.apache.druid.java.util.common.Cacheable;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -47,9 +48,10 @@ public interface PostAggregator extends Cacheable
   /**
    * Return the output type of a row processed with this post aggregator. 
Refer to the {@link ColumnType} javadocs
    * for details on the implications of choosing a type.
+   * @param signature
    */
   @Nullable
-  ColumnType getType();
+  ColumnType getType(ColumnInspector signature);
 
   /**
    * Allows returning an enriched post aggregator, built from contextual 
information available from the given map of
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniqueFinalizingPostAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniqueFinalizingPostAggregator.java
index 301eff3..b69f3fa 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniqueFinalizingPostAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/hyperloglog/HyperUniqueFinalizingPostAggregator.java
@@ -28,6 +28,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.aggregation.post.PostAggregatorIds;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -104,7 +105,7 @@ public class HyperUniqueFinalizingPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return aggregatorFactory != null
            ? aggregatorFactory.getFinalizedType()
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/ArithmeticPostAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/ArithmeticPostAggregator.java
index a8007fa..d428a2b 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/ArithmeticPostAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/ArithmeticPostAggregator.java
@@ -29,6 +29,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.DoubleSumAggregator;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -134,7 +135,7 @@ public class ArithmeticPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/ConstantPostAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/ConstantPostAggregator.java
index 6f49727..d605d3d 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/ConstantPostAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/ConstantPostAggregator.java
@@ -26,6 +26,7 @@ import org.apache.druid.java.util.common.guava.Comparators;
 import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -76,7 +77,7 @@ public class ConstantPostAggregator implements PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return constantValue instanceof Long ? ColumnType.LONG : ColumnType.DOUBLE;
   }
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/DoubleGreatestPostAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/DoubleGreatestPostAggregator.java
index 4d28de6..106fb9e 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/DoubleGreatestPostAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/DoubleGreatestPostAggregator.java
@@ -27,6 +27,7 @@ import org.apache.druid.query.Queries;
 import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -101,7 +102,7 @@ public class DoubleGreatestPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/DoubleLeastPostAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/DoubleLeastPostAggregator.java
index ae343c7..828f9fa 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/DoubleLeastPostAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/DoubleLeastPostAggregator.java
@@ -27,6 +27,7 @@ import org.apache.druid.query.Queries;
 import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -101,7 +102,7 @@ public class DoubleLeastPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/ExpressionPostAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/ExpressionPostAggregator.java
index 5fecc98..d3fa29b 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/ExpressionPostAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/ExpressionPostAggregator.java
@@ -31,11 +31,13 @@ import com.google.common.collect.Maps;
 import org.apache.druid.java.util.common.guava.Comparators;
 import org.apache.druid.math.expr.Expr;
 import org.apache.druid.math.expr.ExprMacroTable;
+import org.apache.druid.math.expr.ExpressionType;
 import org.apache.druid.math.expr.InputBindings;
 import org.apache.druid.math.expr.Parser;
 import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 import org.apache.druid.utils.CollectionUtils;
 
@@ -65,11 +67,6 @@ public class ExpressionPostAggregator implements 
PostAggregator
   @Nullable
   private final String ordering;
 
-  // type is ignored from equals and friends because it is computed by 
decorate, and all post-aggs should be decorated
-  // prior to usage (and is currently done so in the query constructors of all 
queries which can have post-aggs)
-  @Nullable
-  private final ColumnType outputType;
-
   private final ExprMacroTable macroTable;
   private final Map<String, Function<Object, Object>> finalizers;
 
@@ -111,7 +108,6 @@ public class ExpressionPostAggregator implements 
PostAggregator
         name,
         expression,
         ordering,
-        null, // in the future this will be computed by decorate
         macroTable,
         finalizers,
         parsed,
@@ -123,7 +119,6 @@ public class ExpressionPostAggregator implements 
PostAggregator
       final String name,
       final String expression,
       @Nullable final String ordering,
-      @Nullable final ColumnType outputType,
       final ExprMacroTable macroTable,
       final Map<String, Function<Object, Object>> finalizers,
       final Supplier<Expr> parsed,
@@ -135,9 +130,6 @@ public class ExpressionPostAggregator implements 
PostAggregator
     this.name = name;
     this.expression = expression;
     this.ordering = ordering;
-    // allow nulls to match previous behavior when type was never specified, 
however this should be non-nullable
-    // in the future, when expression support type inference
-    this.outputType = outputType;
     // comparator should be specialized to output type ... someday
     this.comparator = ordering == null ? DEFAULT_COMPARATOR : 
Ordering.valueOf(ordering);
     this.macroTable = macroTable;
@@ -189,10 +181,14 @@ public class ExpressionPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
-    // computed by decorate
-    return outputType;
+    final ExpressionType type = parsed.get().getOutputType(signature);
+    if (type == null) {
+      return null;
+    } else {
+      return ExpressionType.toColumnType(type);
+    }
   }
 
   @Override
@@ -202,7 +198,6 @@ public class ExpressionPostAggregator implements 
PostAggregator
         name,
         expression,
         ordering,
-        null, // this should be computed from expression output type once it 
supports output type inference
         macroTable,
         CollectionUtils.mapValues(aggregators, aggregatorFactory -> 
aggregatorFactory::finalizeComputation),
         parsed,
@@ -245,7 +240,7 @@ public class ExpressionPostAggregator implements 
PostAggregator
      * Ensures the following order: numeric > NaN > Infinite.
      *
      * The name may be referenced via Ordering.valueOf(String) in the 
constructor {@link
-     * ExpressionPostAggregator#ExpressionPostAggregator(String, String, 
String, ColumnType, ExprMacroTable, Map, Supplier, Supplier)}.
+     * ExpressionPostAggregator#ExpressionPostAggregator(String, String, 
String, ExprMacroTable, Map, Supplier, Supplier)}.
      */
     @SuppressWarnings("unused")
     numericFirst {
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/FieldAccessPostAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/FieldAccessPostAggregator.java
index 2593567..596fb01 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/FieldAccessPostAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/FieldAccessPostAggregator.java
@@ -26,6 +26,8 @@ import com.google.common.collect.Sets;
 import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
+import org.apache.druid.segment.column.ColumnCapabilities;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -89,9 +91,16 @@ public class FieldAccessPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
-    return type;
+    if (type != null) {
+      return type;
+    }
+    final ColumnCapabilities capabilities = 
signature.getColumnCapabilities(fieldName);
+    if (capabilities != null) {
+      return capabilities.toColumnType();
+    }
+    return null;
   }
 
   @Override
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/FinalizingFieldAccessPostAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/FinalizingFieldAccessPostAggregator.java
index 70bf6ca..967e059 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/FinalizingFieldAccessPostAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/FinalizingFieldAccessPostAggregator.java
@@ -26,6 +26,7 @@ import org.apache.druid.java.util.common.guava.Comparators;
 import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import javax.annotation.Nullable;
@@ -106,7 +107,7 @@ public class FinalizingFieldAccessPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return finalizedType;
   }
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/JavaScriptPostAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/JavaScriptPostAggregator.java
index dd20b73..cea2937 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/JavaScriptPostAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/JavaScriptPostAggregator.java
@@ -29,6 +29,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.DoubleSumAggregator;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
 import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@@ -176,7 +177,7 @@ public class JavaScriptPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.DOUBLE;
   }
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/LongGreatestPostAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/LongGreatestPostAggregator.java
index 2c7a10c..3c02b90 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/LongGreatestPostAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/LongGreatestPostAggregator.java
@@ -27,6 +27,7 @@ import org.apache.druid.query.Queries;
 import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -101,7 +102,7 @@ public class LongGreatestPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.LONG;
   }
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/LongLeastPostAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/LongLeastPostAggregator.java
index be8cc6d..70e7fb4 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/post/LongLeastPostAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/post/LongLeastPostAggregator.java
@@ -27,6 +27,7 @@ import org.apache.druid.query.Queries;
 import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.aggregation.PostAggregator;
 import org.apache.druid.query.cache.CacheKeyBuilder;
+import org.apache.druid.segment.ColumnInspector;
 import org.apache.druid.segment.column.ColumnType;
 
 import java.util.Comparator;
@@ -101,7 +102,7 @@ public class LongLeastPostAggregator implements 
PostAggregator
   }
 
   @Override
-  public ColumnType getType()
+  public ColumnType getType(ColumnInspector signature)
   {
     return ColumnType.LONG;
   }
diff --git 
a/processing/src/main/java/org/apache/druid/segment/column/RowSignature.java 
b/processing/src/main/java/org/apache/druid/segment/column/RowSignature.java
index 5f88ee4..663926f 100644
--- a/processing/src/main/java/org/apache/druid/segment/column/RowSignature.java
+++ b/processing/src/main/java/org/apache/druid/segment/column/RowSignature.java
@@ -276,8 +276,9 @@ public class RowSignature implements ColumnInspector
             "postAggregators must have nonnull names"
         );
 
-        // unlike aggregators, the type we see here is what we get, no further 
finalization will occur
-        add(name, postAggregator.getType());
+        // It's OK to call getType in the order that post-aggregators appear, 
because post-aggregators are only
+        // allowed to refer to *earlier* post-aggregators (not later ones; the 
order is meaningful).
+        add(name, postAggregator.getType(build()));
       }
 
       return this;
diff --git 
a/processing/src/test/java/org/apache/druid/query/aggregation/post/ExpressionPostAggregatorTest.java
 
b/processing/src/test/java/org/apache/druid/query/aggregation/post/ExpressionPostAggregatorTest.java
new file mode 100644
index 0000000..4511199
--- /dev/null
+++ 
b/processing/src/test/java/org/apache/druid/query/aggregation/post/ExpressionPostAggregatorTest.java
@@ -0,0 +1,144 @@
+/*
+ * 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.druid.query.aggregation.post;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import nl.jqno.equalsverifier.EqualsVerifier;
+import org.apache.druid.java.util.common.granularity.Granularities;
+import org.apache.druid.math.expr.SettableObjectBinding;
+import org.apache.druid.query.Druids;
+import org.apache.druid.query.aggregation.CountAggregatorFactory;
+import org.apache.druid.query.aggregation.DoubleSumAggregatorFactory;
+import org.apache.druid.query.aggregation.FloatSumAggregatorFactory;
+import org.apache.druid.query.expression.TestExprMacroTable;
+import org.apache.druid.query.timeseries.TimeseriesQuery;
+import org.apache.druid.query.timeseries.TimeseriesQueryQueryToolChest;
+import org.apache.druid.segment.TestHelper;
+import org.apache.druid.segment.column.ColumnType;
+import org.apache.druid.segment.column.RowSignature;
+import org.apache.druid.testing.InitializedNullHandlingTest;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ExpressionPostAggregatorTest extends InitializedNullHandlingTest
+{
+  private static final ObjectMapper JSON_MAPPER = TestHelper.makeJsonMapper();
+
+  @Test
+  public void testSerde() throws JsonProcessingException
+  {
+    ExpressionPostAggregator postAgg = new ExpressionPostAggregator(
+        "p0",
+        "2 + 3",
+        null,
+        TestExprMacroTable.INSTANCE
+    );
+
+    Assert.assertEquals(
+        postAgg,
+        JSON_MAPPER.readValue(JSON_MAPPER.writeValueAsString(postAgg), 
ExpressionPostAggregator.class)
+    );
+  }
+
+  @Test
+  public void testEqualsAndHashcode()
+  {
+    EqualsVerifier.forClass(ExpressionPostAggregator.class)
+                  .usingGetClass()
+                  .withIgnoredFields("macroTable", "finalizers", "parsed", 
"dependentFields", "cacheKey")
+                  .verify();
+  }
+
+  @Test
+  public void testOutputTypeAndCompute()
+  {
+    ExpressionPostAggregator postAgg = new ExpressionPostAggregator(
+        "p0",
+        "x + y",
+        null,
+        TestExprMacroTable.INSTANCE
+    );
+
+    RowSignature signature = RowSignature.builder()
+                                         .add("x", ColumnType.LONG)
+                                         .add("y", ColumnType.DOUBLE)
+                                         .build();
+
+    SettableObjectBinding binding = new 
SettableObjectBinding().withBinding("x", 2L)
+                                                               
.withBinding("y", 3.0);
+
+    Assert.assertEquals(ColumnType.DOUBLE, postAgg.getType(signature));
+
+    Assert.assertEquals(5.0, postAgg.compute(binding.asMap()));
+  }
+
+  @Test
+  public void testNilOutputType()
+  {
+    ExpressionPostAggregator postAgg = new ExpressionPostAggregator(
+        "p0",
+        "x + y",
+        null,
+        TestExprMacroTable.INSTANCE
+    );
+
+    RowSignature signature = RowSignature.builder().build();
+
+    // columns not existing in the output signature means they don't exist, so 
the output is also null
+    Assert.assertNull(postAgg.getType(signature));
+  }
+
+  @Test
+  public void testResultArraySignature()
+  {
+    final TimeseriesQuery query =
+        Druids.newTimeseriesQueryBuilder()
+              .dataSource("dummy")
+              .intervals("2000/3000")
+              .granularity(Granularities.HOUR)
+              .aggregators(
+                  new CountAggregatorFactory("count"),
+                  new DoubleSumAggregatorFactory("double", "col1"),
+                  new FloatSumAggregatorFactory("float", "col2")
+              )
+              .postAggregators(
+                  new ExpressionPostAggregator("a", "double + float", null, 
TestExprMacroTable.INSTANCE),
+                  new ExpressionPostAggregator("b", "count + count", null, 
TestExprMacroTable.INSTANCE),
+                  new ExpressionPostAggregator("c", "count + double", null, 
TestExprMacroTable.INSTANCE),
+                  new ExpressionPostAggregator("d", "float + float", null, 
TestExprMacroTable.INSTANCE)
+              )
+              .build();
+
+    Assert.assertEquals(
+        RowSignature.builder()
+                    .addTimeColumn()
+                    .add("count", ColumnType.LONG)
+                    .add("double", ColumnType.DOUBLE)
+                    .add("float", ColumnType.FLOAT)
+                    .add("a", ColumnType.DOUBLE)
+                    .add("b", ColumnType.LONG)
+                    .add("c", ColumnType.DOUBLE)
+                    .add("d", ColumnType.DOUBLE) // floats don't exist in 
expressions
+                    .build(),
+        new TimeseriesQueryQueryToolChest().resultArraySignature(query)
+    );
+  }
+}
diff --git 
a/processing/src/test/java/org/apache/druid/query/aggregation/post/FieldAccessPostAggregatorTest.java
 
b/processing/src/test/java/org/apache/druid/query/aggregation/post/FieldAccessPostAggregatorTest.java
index 4748da7..d80eb10 100644
--- 
a/processing/src/test/java/org/apache/druid/query/aggregation/post/FieldAccessPostAggregatorTest.java
+++ 
b/processing/src/test/java/org/apache/druid/query/aggregation/post/FieldAccessPostAggregatorTest.java
@@ -19,6 +19,9 @@
 
 package org.apache.druid.query.aggregation.post;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import nl.jqno.equalsverifier.EqualsVerifier;
 import org.apache.druid.java.util.common.granularity.Granularities;
 import org.apache.druid.query.Druids;
 import org.apache.druid.query.aggregation.CountAggregator;
@@ -27,18 +30,55 @@ import 
org.apache.druid.query.aggregation.DoubleSumAggregatorFactory;
 import org.apache.druid.query.aggregation.FloatSumAggregatorFactory;
 import org.apache.druid.query.timeseries.TimeseriesQuery;
 import org.apache.druid.query.timeseries.TimeseriesQueryQueryToolChest;
+import org.apache.druid.segment.TestHelper;
 import org.apache.druid.segment.column.ColumnType;
 import org.apache.druid.segment.column.RowSignature;
+import org.apache.druid.testing.InitializedNullHandlingTest;
 import org.junit.Assert;
 import org.junit.Test;
 
 import java.util.HashMap;
 import java.util.Map;
 
-/**
- */
-public class FieldAccessPostAggregatorTest
+public class FieldAccessPostAggregatorTest extends InitializedNullHandlingTest
 {
+  private static final ObjectMapper JSON_MAPPER = TestHelper.makeJsonMapper();
+
+  @Test
+  public void testSerde() throws JsonProcessingException
+  {
+    FieldAccessPostAggregator postAgg = new FieldAccessPostAggregator("name", 
"column");
+    Assert.assertEquals(
+        postAgg,
+        JSON_MAPPER.readValue(JSON_MAPPER.writeValueAsString(postAgg), 
FieldAccessPostAggregator.class)
+    );
+  }
+
+  @Test
+  public void testEqualsAndHashcode()
+  {
+    // type is computed by decorate
+    
EqualsVerifier.forClass(FieldAccessPostAggregator.class).usingGetClass().withIgnoredFields("type").verify();
+  }
+
+  @Test
+  public void testGetTypeBeforeDecorate()
+  {
+    FieldAccessPostAggregator postAgg = new FieldAccessPostAggregator("name", 
"column");
+    RowSignature signature = RowSignature.builder()
+                                         .add("column", ColumnType.LONG)
+                                         .build();
+    Assert.assertEquals(ColumnType.LONG, postAgg.getType(signature));
+  }
+
+  @Test
+  public void testGetTypeBeforeDecorateNil()
+  {
+    FieldAccessPostAggregator postAgg = new FieldAccessPostAggregator("name", 
"column");
+    RowSignature signature = RowSignature.builder().build();
+    Assert.assertNull(postAgg.getType(signature));
+  }
+
   @Test
   public void testCompute()
   {

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to