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

cwylie 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 f8fa3f7e669 remove NullValueHandlingConfig, NullHandlingModule, 
NullHandling (#17778)
f8fa3f7e669 is described below

commit f8fa3f7e669c695a5dbe80c924e1ba99cd650a2f
Author: Clint Wylie <[email protected]>
AuthorDate: Thu Mar 6 20:26:33 2025 -0800

    remove NullValueHandlingConfig, NullHandlingModule, NullHandling (#17778)
---
 codestyle/checkstyle.xml                           | 10 ---
 .../org/apache/druid/indexer/InputRowSerde.java    | 14 ++--
 .../apache/druid/indexer/InputRowSerdeTest.java    |  8 +--
 .../apache/druid/common/config/NullHandling.java   | 40 ------------
 .../common/config/NullValueHandlingConfig.java     | 74 ----------------------
 .../druid/frame/field/StringFieldWriter.java       |  2 +-
 .../org/apache/druid/guice/NullHandlingModule.java | 37 -----------
 .../apache/druid/guice/StartupInjectorBuilder.java | 14 ++--
 .../druid/math/expr/ExpressionProcessing.java      |  2 +-
 ...zablePairLongObjectDeltaEncodedStagedSerde.java |  6 +-
 ...erializablePairLongObjectSimpleStagedSerde.java |  6 +-
 .../NullableNumericBufferAggregator.java           | 18 +++---
 .../NullableNumericVectorAggregator.java           | 12 ++--
 ...zablePairLongDoubleDeltaEncodedStagedSerde.java |  4 +-
 ...erializablePairLongDoubleSimpleStagedSerde.java |  4 +-
 ...izablePairLongFloatDeltaEncodedStagedSerde.java |  4 +-
 ...SerializablePairLongFloatSimpleStagedSerde.java |  4 +-
 ...lizablePairLongLongDeltaEncodedStagedSerde.java |  4 +-
 .../SerializablePairLongLongSimpleStagedSerde.java |  4 +-
 .../aggregation/SingleValueBufferAggregator.java   |  3 +-
 .../any/NumericAnyBufferAggregator.java            | 10 +--
 .../any/NumericAnyVectorAggregator.java            | 10 +--
 .../firstlast/DoubleFirstLastVectorAggregator.java | 12 ++--
 .../firstlast/FloatFirstLastVectorAggregator.java  | 12 ++--
 .../firstlast/LongFirstLastVectorAggregator.java   | 12 ++--
 ...leStringFirstLastDimensionVectorAggregator.java | 10 +--
 .../first/NumericFirstBufferAggregator.java        | 12 ++--
 .../last/NumericLastBufferAggregator.java          | 12 ++--
 .../druid/query/filter/SelectorDimFilter.java      |  4 +-
 .../GrouperBufferComparatorUtils.java              |  6 +-
 .../epinephelinae/RowBasedGrouperHelper.java       |  8 +--
 .../NullableDoubleGroupByVectorColumnSelector.java |  8 +--
 .../NullableFloatGroupByVectorColumnSelector.java  |  8 +--
 .../NullableLongGroupByVectorColumnSelector.java   |  8 +--
 .../druid/segment/column/NullableTypeStrategy.java | 13 ++--
 .../apache/druid/segment/column/TypeSignature.java |  4 +-
 .../druid/segment/column/TypeStrategies.java       | 26 ++++----
 .../apache/druid/segment/column/TypeStrategy.java  |  5 +-
 .../apache/druid/segment/data/FixedIndexed.java    |  4 +-
 .../druid/segment/data/FixedIndexedWriter.java     |  4 +-
 .../druid/segment/data/FrontCodedIndexed.java      |  4 +-
 .../segment/data/FrontCodedIndexedWriter.java      |  4 +-
 .../segment/data/FrontCodedIntArrayIndexed.java    |  4 +-
 .../data/FrontCodedIntArrayIndexedWriter.java      |  4 +-
 .../druid/guice/StartupInjectorBuilderTest.java    |  5 +-
 .../any/NumericAnyVectorAggregatorTest.java        | 18 +++---
 .../druid/sql/calcite/BaseCalciteQueryTest.java    |  4 --
 47 files changed, 168 insertions(+), 333 deletions(-)

diff --git a/codestyle/checkstyle.xml b/codestyle/checkstyle.xml
index da70ddfad3a..092150acbce 100644
--- a/codestyle/checkstyle.xml
+++ b/codestyle/checkstyle.xml
@@ -196,16 +196,6 @@
       <property name="illegalPattern" value="true"/>
       <property name="message" value='Use toArray(new Object[0]) instead'/>
     </module>
-    <module name="Regexp">
-      <property name="format" value="Strings.emptyToNull"/>
-      <property name="illegalPattern" value="true"/>
-      <property name="message" value="Use 
org.apache.druid.common.config.NullHandling.emptyToNullIfNeeded instead"/>
-    </module>
-    <module name="Regexp">
-      <property name="format" value="Strings.nullToEmpty"/>
-      <property name="illegalPattern" value="true"/>
-      <property name="message" value="Use 
org.apache.druid.common.config.NullHandling.nullToEmptyIfNeeded instead"/>
-    </module>
 
     <module name="Regexp">
       <property name="format" value='@Produces\(\"text/plain\"\)'/>
diff --git 
a/indexing-hadoop/src/main/java/org/apache/druid/indexer/InputRowSerde.java 
b/indexing-hadoop/src/main/java/org/apache/druid/indexer/InputRowSerde.java
index 720fcafc4f9..2c82dbfe1d6 100644
--- a/indexing-hadoop/src/main/java/org/apache/druid/indexer/InputRowSerde.java
+++ b/indexing-hadoop/src/main/java/org/apache/druid/indexer/InputRowSerde.java
@@ -23,7 +23,6 @@ import com.google.common.collect.Lists;
 import com.google.common.io.ByteArrayDataInput;
 import com.google.common.io.ByteArrayDataOutput;
 import com.google.common.io.ByteStreams;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.data.input.InputRow;
 import org.apache.druid.data.input.MapBasedInputRow;
 import org.apache.druid.data.input.Rows;
@@ -38,6 +37,7 @@ import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.segment.DimensionHandlerUtils;
 import org.apache.druid.segment.VirtualColumns;
 import org.apache.druid.segment.column.ColumnType;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.column.ValueType;
 import org.apache.druid.segment.incremental.IncrementalIndex;
 import org.apache.druid.segment.serde.ComplexMetricSerde;
@@ -70,18 +70,18 @@ public class InputRowSerde
       final Consumer<T> write)
   {
     if (ret == null) {
-      out.writeByte(NullHandling.IS_NULL_BYTE);
+      out.writeByte(TypeStrategies.IS_NULL_BYTE);
       return;
     }
 
-    out.writeByte(NullHandling.IS_NOT_NULL_BYTE);
+    out.writeByte(TypeStrategies.IS_NOT_NULL_BYTE);
 
     write.accept(ret);
   }
 
   private static boolean isNullByteSet(final ByteArrayDataInput in)
   {
-    return in.readByte() == NullHandling.IS_NULL_BYTE;
+    return in.readByte() == TypeStrategies.IS_NULL_BYTE;
   }
 
   public interface IndexSerdeTypeHelper<T>
@@ -336,9 +336,9 @@ public class InputRowSerde
           final ColumnType type = aggFactory.getIntermediateType();
 
           if (agg.isNull()) {
-            out.writeByte(NullHandling.IS_NULL_BYTE);
+            out.writeByte(TypeStrategies.IS_NULL_BYTE);
           } else {
-            out.writeByte(NullHandling.IS_NOT_NULL_BYTE);
+            out.writeByte(TypeStrategies.IS_NOT_NULL_BYTE);
             if (type.is(ValueType.FLOAT)) {
               out.writeFloat(agg.getFloat());
             } else if (type.is(ValueType.LONG)) {
@@ -467,7 +467,7 @@ public class InputRowSerde
         final ColumnType type = agg.getIntermediateType();
         final byte metricNullability = in.readByte();
 
-        if (metricNullability == NullHandling.IS_NULL_BYTE) {
+        if (metricNullability == TypeStrategies.IS_NULL_BYTE) {
           // metric value is null.
           continue;
         }
diff --git 
a/indexing-hadoop/src/test/java/org/apache/druid/indexer/InputRowSerdeTest.java 
b/indexing-hadoop/src/test/java/org/apache/druid/indexer/InputRowSerdeTest.java
index 27a7a173f3b..36440fa87c1 100644
--- 
a/indexing-hadoop/src/test/java/org/apache/druid/indexer/InputRowSerdeTest.java
+++ 
b/indexing-hadoop/src/test/java/org/apache/druid/indexer/InputRowSerdeTest.java
@@ -20,7 +20,6 @@
 package org.apache.druid.indexer;
 
 import com.google.common.collect.ImmutableList;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.data.input.InputRow;
 import org.apache.druid.data.input.MapBasedInputRow;
 import org.apache.druid.data.input.impl.DimensionsSpec;
@@ -38,6 +37,7 @@ import 
org.apache.druid.query.aggregation.LongSumAggregatorFactory;
 import 
org.apache.druid.query.aggregation.hyperloglog.HyperUniquesAggregatorFactory;
 import org.apache.druid.segment.ColumnSelectorFactory;
 import org.apache.druid.segment.column.ColumnType;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.easymock.EasyMock;
 import org.junit.Assert;
 import org.junit.Rule;
@@ -277,8 +277,8 @@ public class InputRowSerdeTest
     long expected = 9 + 18 + 4 + 14 + 4 + 4 + 4 + 1;
 
     Assert.assertEquals(expected, result.length);
-    Assert.assertEquals(result[48], NullHandling.IS_NULL_BYTE);
-    Assert.assertEquals(result[52], NullHandling.IS_NULL_BYTE);
-    Assert.assertEquals(result[56], NullHandling.IS_NULL_BYTE);
+    Assert.assertEquals(result[48], TypeStrategies.IS_NULL_BYTE);
+    Assert.assertEquals(result[52], TypeStrategies.IS_NULL_BYTE);
+    Assert.assertEquals(result[56], TypeStrategies.IS_NULL_BYTE);
   }
 }
diff --git 
a/processing/src/main/java/org/apache/druid/common/config/NullHandling.java 
b/processing/src/main/java/org/apache/druid/common/config/NullHandling.java
deleted file mode 100644
index e2fe0d6f303..00000000000
--- a/processing/src/main/java/org/apache/druid/common/config/NullHandling.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.common.config;
-
-import com.google.inject.Inject;
-
-/**
- * Some dead constants
- */
-public class NullHandling
-{
-  public static final byte IS_NULL_BYTE = (byte) 1;
-  public static final byte IS_NOT_NULL_BYTE = (byte) 0;
-
-  /**
-   * INSTANCE is injected using static injection to avoid adding JacksonInject 
annotations all over the code.
-   * See org.apache.druid.guice.NullHandlingModule for details.
-   * It does not take effect in all unit tests since we don't use Guice 
Injection.
-   */
-  @Inject
-  private static NullValueHandlingConfig INSTANCE;
-
-}
diff --git 
a/processing/src/main/java/org/apache/druid/common/config/NullValueHandlingConfig.java
 
b/processing/src/main/java/org/apache/druid/common/config/NullValueHandlingConfig.java
deleted file mode 100644
index 2e578b24dc5..00000000000
--- 
a/processing/src/main/java/org/apache/druid/common/config/NullValueHandlingConfig.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.common.config;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.apache.druid.java.util.common.logger.Logger;
-
-public class NullValueHandlingConfig
-{
-  private static final Logger LOG = new Logger(NullValueHandlingConfig.class);
-  public static final String NULL_HANDLING_CONFIG_STRING = 
"druid.generic.useDefaultValueForNull";
-  public static final String THREE_VALUE_LOGIC_CONFIG_STRING = 
"druid.generic.useThreeValueLogicForNativeFilters";
-  public static final String NULL_HANDLING_DURING_STRING_CARDINALITY = 
"druid.generic.ignoreNullsForStringCardinality";
-
-  @JsonProperty("useDefaultValueForNull")
-  private final boolean useDefaultValuesForNull;
-
-  @JsonProperty("useThreeValueLogicForNativeFilters")
-  private final boolean useThreeValueLogicForNativeFilters;
-
-  @JsonProperty("ignoreNullsForStringCardinality")
-  private final boolean ignoreNullsForStringCardinality;
-
-  @JsonCreator
-  public NullValueHandlingConfig(
-      @JsonProperty("useDefaultValueForNull") Boolean useDefaultValuesForNull,
-      @JsonProperty("useThreeValueLogicForNativeFilters") Boolean 
useThreeValueLogicForNativeFilters,
-      @JsonProperty("ignoreNullsForStringCardinality") Boolean 
ignoreNullsForStringCardinality
-  )
-  {
-    if (useDefaultValuesForNull == null) {
-      this.useDefaultValuesForNull = 
Boolean.valueOf(System.getProperty(NULL_HANDLING_CONFIG_STRING, "false"));
-    } else {
-      this.useDefaultValuesForNull = useDefaultValuesForNull;
-    }
-    if (useThreeValueLogicForNativeFilters == null) {
-      this.useThreeValueLogicForNativeFilters = Boolean.valueOf(
-          System.getProperty(THREE_VALUE_LOGIC_CONFIG_STRING, "true")
-      );
-    } else {
-      this.useThreeValueLogicForNativeFilters = 
useThreeValueLogicForNativeFilters;
-    }
-    if (ignoreNullsForStringCardinality == null) {
-      this.ignoreNullsForStringCardinality = 
Boolean.valueOf(System.getProperty(
-          NULL_HANDLING_DURING_STRING_CARDINALITY,
-          "false"
-      ));
-    } else {
-      if (this.useDefaultValuesForNull) {
-        this.ignoreNullsForStringCardinality = ignoreNullsForStringCardinality;
-      } else {
-        this.ignoreNullsForStringCardinality = false;
-      }
-    }
-  }
-}
diff --git 
a/processing/src/main/java/org/apache/druid/frame/field/StringFieldWriter.java 
b/processing/src/main/java/org/apache/druid/frame/field/StringFieldWriter.java
index 5b304f8a053..95a2426f8f8 100644
--- 
a/processing/src/main/java/org/apache/druid/frame/field/StringFieldWriter.java
+++ 
b/processing/src/main/java/org/apache/druid/frame/field/StringFieldWriter.java
@@ -45,7 +45,7 @@ public class StringFieldWriter implements FieldWriter
   public static final byte NULL_ROW = 0x00;
 
   /**
-   * Different from the values in {@link 
org.apache.druid.common.config.NullHandling}, since we want to be able to
+   * Different from the values in {@link 
org.apache.druid.segment.column.TypeStrategies}, since we want to be able to
    * sort as bytes, and we want nulls to come before non-nulls.
    */
   public static final byte NULL_BYTE = 0x02;
diff --git 
a/processing/src/main/java/org/apache/druid/guice/NullHandlingModule.java 
b/processing/src/main/java/org/apache/druid/guice/NullHandlingModule.java
deleted file mode 100644
index b8be2e851a8..00000000000
--- a/processing/src/main/java/org/apache/druid/guice/NullHandlingModule.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.guice;
-
-import com.google.inject.Binder;
-import com.google.inject.Module;
-import org.apache.druid.common.config.NullHandling;
-import org.apache.druid.common.config.NullValueHandlingConfig;
-
-/**
- */
-public class NullHandlingModule implements Module
-{
-  @Override
-  public void configure(Binder binder)
-  {
-    JsonConfigProvider.bind(binder, "druid.generic", 
NullValueHandlingConfig.class);
-    binder.requestStaticInjection(NullHandling.class);
-  }
-}
diff --git 
a/processing/src/main/java/org/apache/druid/guice/StartupInjectorBuilder.java 
b/processing/src/main/java/org/apache/druid/guice/StartupInjectorBuilder.java
index 1d524a9a1e7..d71ba6d3753 100644
--- 
a/processing/src/main/java/org/apache/druid/guice/StartupInjectorBuilder.java
+++ 
b/processing/src/main/java/org/apache/druid/guice/StartupInjectorBuilder.java
@@ -23,7 +23,6 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.util.Providers;
-import org.apache.druid.common.config.NullValueHandlingConfig;
 import org.apache.druid.jackson.JacksonModule;
 import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.java.util.common.StringUtils;
@@ -51,13 +50,16 @@ import java.util.Properties;
  */
 public class StartupInjectorBuilder extends 
BaseInjectorBuilder<StartupInjectorBuilder>
 {
+
+  static final String NULL_HANDLING_CONFIG_STRING = 
"druid.generic.useDefaultValueForNull";
+  static final String THREE_VALUE_LOGIC_CONFIG_STRING = 
"druid.generic.useThreeValueLogicForNativeFilters";
+
   public StartupInjectorBuilder()
   {
     add(
         new DruidGuiceExtensions(),
         new JacksonModule(),
         new ConfigModule(),
-        new NullHandlingModule(),
         new ExpressionProcessingModule(),
         binder -> binder.bind(DruidSecondaryModule.class),
         binder -> binder.bind(PropertiesValidator.class) // this gets 
properties injected, later call to validate checks
@@ -131,25 +133,25 @@ public class StartupInjectorBuilder extends 
BaseInjectorBuilder<StartupInjectorB
     public void validate()
     {
       final boolean defaultValueMode = Boolean.parseBoolean(
-          
properties.getProperty(NullValueHandlingConfig.NULL_HANDLING_CONFIG_STRING, 
"false")
+          properties.getProperty(NULL_HANDLING_CONFIG_STRING, "false")
       );
       if (defaultValueMode) {
         final String docsLink = 
StringUtils.format("https://druid.apache.org/docs/%s/release-info/migr-ansi-sql-null";,
 getVersionString());
         throw new ISE(
             "%s set to 'true', but has been removed, see %s for details for 
how to migrate to SQL compliant behavior",
-            NullValueHandlingConfig.NULL_HANDLING_CONFIG_STRING,
+            NULL_HANDLING_CONFIG_STRING,
             docsLink
         );
       }
 
       final boolean no3vl = !Boolean.parseBoolean(
-          
properties.getProperty(NullValueHandlingConfig.THREE_VALUE_LOGIC_CONFIG_STRING, 
"true")
+          properties.getProperty(THREE_VALUE_LOGIC_CONFIG_STRING, "true")
       );
       if (no3vl) {
         final String docsLink = 
StringUtils.format("https://druid.apache.org/docs/%s/release-info/migr-ansi-sql-null";,
 getVersionString());
         throw new ISE(
             "%s set to 'false', but has been removed, see %s for details for 
how to migrate to SQL compliant behavior",
-            NullValueHandlingConfig.THREE_VALUE_LOGIC_CONFIG_STRING,
+            THREE_VALUE_LOGIC_CONFIG_STRING,
             docsLink
         );
       }
diff --git 
a/processing/src/main/java/org/apache/druid/math/expr/ExpressionProcessing.java 
b/processing/src/main/java/org/apache/druid/math/expr/ExpressionProcessing.java
index 2387cea909f..2e84b33d7bf 100644
--- 
a/processing/src/main/java/org/apache/druid/math/expr/ExpressionProcessing.java
+++ 
b/processing/src/main/java/org/apache/druid/math/expr/ExpressionProcessing.java
@@ -23,7 +23,7 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.inject.Inject;
 
 /**
- * Like {@link org.apache.druid.common.config.NullHandling}, except for 
expressions processing configs
+ * Expressions processing configs
  */
 public class ExpressionProcessing
 {
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/AbstractSerializablePairLongObjectDeltaEncodedStagedSerde.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/AbstractSerializablePairLongObjectDeltaEncodedStagedSerde.java
index f276cd7b67f..aaa3303f23e 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/AbstractSerializablePairLongObjectDeltaEncodedStagedSerde.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/AbstractSerializablePairLongObjectDeltaEncodedStagedSerde.java
@@ -22,7 +22,7 @@ package org.apache.druid.query.aggregation;
 import com.google.common.base.Preconditions;
 import com.google.common.primitives.Ints;
 import org.apache.druid.collections.SerializablePair;
-import org.apache.druid.common.config.NullHandling;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.serde.cell.StagedSerde;
 import org.apache.druid.segment.serde.cell.StorableBuffer;
 
@@ -84,7 +84,7 @@ public abstract class 
AbstractSerializablePairLongObjectDeltaEncodedStagedSerde<
         }
 
         if (rhsObject != null) {
-          byteBuffer.put(NullHandling.IS_NOT_NULL_BYTE);
+          byteBuffer.put(TypeStrategies.IS_NOT_NULL_BYTE);
           if (pairClass.isAssignableFrom(SerializablePairLongLong.class)) {
             byteBuffer.putLong((long) rhsObject);
           } else if 
(pairClass.isAssignableFrom(SerializablePairLongDouble.class)) {
@@ -93,7 +93,7 @@ public abstract class 
AbstractSerializablePairLongObjectDeltaEncodedStagedSerde<
             byteBuffer.putFloat((float) rhsObject);
           }
         } else {
-          byteBuffer.put(NullHandling.IS_NULL_BYTE);
+          byteBuffer.put(TypeStrategies.IS_NULL_BYTE);
         }
       }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/AbstractSerializablePairLongObjectSimpleStagedSerde.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/AbstractSerializablePairLongObjectSimpleStagedSerde.java
index 8a7857163e4..1d826e65855 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/AbstractSerializablePairLongObjectSimpleStagedSerde.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/AbstractSerializablePairLongObjectSimpleStagedSerde.java
@@ -21,7 +21,7 @@ package org.apache.druid.query.aggregation;
 
 import com.google.common.base.Preconditions;
 import org.apache.druid.collections.SerializablePair;
-import org.apache.druid.common.config.NullHandling;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.serde.cell.StagedSerde;
 import org.apache.druid.segment.serde.cell.StorableBuffer;
 
@@ -64,7 +64,7 @@ public abstract class 
AbstractSerializablePairLongObjectSimpleStagedSerde<T exte
         Preconditions.checkNotNull(value.getLhs(), "Long in %s must be 
non-null", pairCLass.getSimpleName());
         byteBuffer.putLong(value.getLhs());
         if (rhsObject != null) {
-          byteBuffer.put(NullHandling.IS_NOT_NULL_BYTE);
+          byteBuffer.put(TypeStrategies.IS_NOT_NULL_BYTE);
           if (pairCLass.isAssignableFrom(SerializablePairLongLong.class)) {
             byteBuffer.putLong((long) rhsObject);
           } else if 
(pairCLass.isAssignableFrom(SerializablePairLongDouble.class)) {
@@ -73,7 +73,7 @@ public abstract class 
AbstractSerializablePairLongObjectSimpleStagedSerde<T exte
             byteBuffer.putFloat((float) rhsObject);
           }
         } else {
-          byteBuffer.put(NullHandling.IS_NULL_BYTE);
+          byteBuffer.put(TypeStrategies.IS_NULL_BYTE);
         }
       }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/NullableNumericBufferAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/NullableNumericBufferAggregator.java
index 4a8ce6f792a..963f298fe9b 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/NullableNumericBufferAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/NullableNumericBufferAggregator.java
@@ -19,11 +19,11 @@
 
 package org.apache.druid.query.aggregation;
 
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.guice.annotations.PublicApi;
 import org.apache.druid.query.monomorphicprocessing.RuntimeShapeInspector;
 import org.apache.druid.segment.BaseNullableColumnValueSelector;
 import org.apache.druid.segment.ColumnSelectorFactory;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -60,7 +60,7 @@ public final class NullableNumericBufferAggregator implements 
BufferAggregator
   @Override
   public void init(ByteBuffer buf, int position)
   {
-    buf.put(position, NullHandling.IS_NULL_BYTE);
+    buf.put(position, TypeStrategies.IS_NULL_BYTE);
     delegate.init(buf, position + Byte.BYTES);
   }
 
@@ -69,8 +69,8 @@ public final class NullableNumericBufferAggregator implements 
BufferAggregator
   {
     boolean isNotNull = !nullSelector.isNull();
     if (isNotNull) {
-      if (buf.get(position) == NullHandling.IS_NULL_BYTE) {
-        buf.put(position, NullHandling.IS_NOT_NULL_BYTE);
+      if (buf.get(position) == TypeStrategies.IS_NULL_BYTE) {
+        buf.put(position, TypeStrategies.IS_NOT_NULL_BYTE);
       }
       delegate.aggregate(buf, position + Byte.BYTES);
     }
@@ -80,7 +80,7 @@ public final class NullableNumericBufferAggregator implements 
BufferAggregator
   @Nullable
   public Object get(ByteBuffer buf, int position)
   {
-    if (buf.get(position) == NullHandling.IS_NULL_BYTE) {
+    if (buf.get(position) == TypeStrategies.IS_NULL_BYTE) {
       return null;
     }
     return delegate.get(buf, position + Byte.BYTES);
@@ -89,7 +89,7 @@ public final class NullableNumericBufferAggregator implements 
BufferAggregator
   @Override
   public float getFloat(ByteBuffer buf, int position)
   {
-    if (buf.get(position) == NullHandling.IS_NULL_BYTE) {
+    if (buf.get(position) == TypeStrategies.IS_NULL_BYTE) {
       throw new IllegalStateException("Cannot return float for Null Value");
     }
     return delegate.getFloat(buf, position + Byte.BYTES);
@@ -98,7 +98,7 @@ public final class NullableNumericBufferAggregator implements 
BufferAggregator
   @Override
   public long getLong(ByteBuffer buf, int position)
   {
-    if (buf.get(position) == NullHandling.IS_NULL_BYTE) {
+    if (buf.get(position) == TypeStrategies.IS_NULL_BYTE) {
       throw new IllegalStateException("Cannot return long for Null Value");
     }
     return delegate.getLong(buf, position + Byte.BYTES);
@@ -107,7 +107,7 @@ public final class NullableNumericBufferAggregator 
implements BufferAggregator
   @Override
   public double getDouble(ByteBuffer buf, int position)
   {
-    if (buf.get(position) == NullHandling.IS_NULL_BYTE) {
+    if (buf.get(position) == TypeStrategies.IS_NULL_BYTE) {
       throw new IllegalStateException("Cannot return double for Null Value");
     }
     return delegate.getDouble(buf, position + Byte.BYTES);
@@ -116,7 +116,7 @@ public final class NullableNumericBufferAggregator 
implements BufferAggregator
   @Override
   public boolean isNull(ByteBuffer buf, int position)
   {
-    return buf.get(position) == NullHandling.IS_NULL_BYTE || 
delegate.isNull(buf, position + Byte.BYTES);
+    return buf.get(position) == TypeStrategies.IS_NULL_BYTE || 
delegate.isNull(buf, position + Byte.BYTES);
   }
 
   @Override
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/NullableNumericVectorAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/NullableNumericVectorAggregator.java
index cdc4499f013..9a91176e2ab 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/NullableNumericVectorAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/NullableNumericVectorAggregator.java
@@ -19,8 +19,8 @@
 
 package org.apache.druid.query.aggregation;
 
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.java.util.common.ISE;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.vector.VectorValueSelector;
 
 import javax.annotation.Nullable;
@@ -68,7 +68,7 @@ public class NullableNumericVectorAggregator implements 
VectorAggregator
   @Override
   public void init(ByteBuffer buf, int position)
   {
-    buf.put(position, NullHandling.IS_NULL_BYTE);
+    buf.put(position, TypeStrategies.IS_NULL_BYTE);
     delegate.init(buf, position + Byte.BYTES);
   }
 
@@ -132,9 +132,9 @@ public class NullableNumericVectorAggregator implements 
VectorAggregator
   public Object get(ByteBuffer buf, int position)
   {
     switch (buf.get(position)) {
-      case NullHandling.IS_NULL_BYTE:
+      case TypeStrategies.IS_NULL_BYTE:
         return null;
-      case NullHandling.IS_NOT_NULL_BYTE:
+      case TypeStrategies.IS_NOT_NULL_BYTE:
         return delegate.get(buf, position + Byte.BYTES);
       default:
         // Corrupted byte?
@@ -156,14 +156,14 @@ public class NullableNumericVectorAggregator implements 
VectorAggregator
 
   private void doAggregate(ByteBuffer buf, int position, int start, int end)
   {
-    buf.put(position, NullHandling.IS_NOT_NULL_BYTE);
+    buf.put(position, TypeStrategies.IS_NOT_NULL_BYTE);
     delegate.aggregate(buf, position + Byte.BYTES, start, end);
   }
 
   private void doAggregate(ByteBuffer buf, int numRows, int[] positions, 
@Nullable int[] rows, int positionOffset)
   {
     for (int i = 0; i < numRows; i++) {
-      buf.put(positions[i] + positionOffset, NullHandling.IS_NOT_NULL_BYTE);
+      buf.put(positions[i] + positionOffset, TypeStrategies.IS_NOT_NULL_BYTE);
     }
 
     delegate.aggregate(buf, numRows, positions, rows, positionOffset + 
Byte.BYTES);
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongDoubleDeltaEncodedStagedSerde.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongDoubleDeltaEncodedStagedSerde.java
index ce087ec623e..d68d55e3f91 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongDoubleDeltaEncodedStagedSerde.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongDoubleDeltaEncodedStagedSerde.java
@@ -19,7 +19,7 @@
 
 package org.apache.druid.query.aggregation;
 
-import org.apache.druid.common.config.NullHandling;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -53,7 +53,7 @@ public class 
SerializablePairLongDoubleDeltaEncodedStagedSerde extends AbstractS
     lhs += minValue;
 
     Double rhs = null;
-    if (readOnlyBuffer.get() == NullHandling.IS_NOT_NULL_BYTE) {
+    if (readOnlyBuffer.get() == TypeStrategies.IS_NOT_NULL_BYTE) {
       rhs = readOnlyBuffer.getDouble();
     }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongDoubleSimpleStagedSerde.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongDoubleSimpleStagedSerde.java
index bf5c60e0c5b..ee1de745707 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongDoubleSimpleStagedSerde.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongDoubleSimpleStagedSerde.java
@@ -19,7 +19,7 @@
 
 package org.apache.druid.query.aggregation;
 
-import org.apache.druid.common.config.NullHandling;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -44,7 +44,7 @@ public class SerializablePairLongDoubleSimpleStagedSerde 
extends AbstractSeriali
     long lhs = readOnlyBuffer.getLong();
 
     Double rhs = null;
-    if (readOnlyBuffer.get() == NullHandling.IS_NOT_NULL_BYTE) {
+    if (readOnlyBuffer.get() == TypeStrategies.IS_NOT_NULL_BYTE) {
       rhs = readOnlyBuffer.getDouble();
     }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongFloatDeltaEncodedStagedSerde.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongFloatDeltaEncodedStagedSerde.java
index 0f5e4f7f4a9..0b1846a0b87 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongFloatDeltaEncodedStagedSerde.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongFloatDeltaEncodedStagedSerde.java
@@ -19,7 +19,7 @@
 
 package org.apache.druid.query.aggregation;
 
-import org.apache.druid.common.config.NullHandling;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -53,7 +53,7 @@ public class SerializablePairLongFloatDeltaEncodedStagedSerde 
extends AbstractSe
     lhs += minValue;
 
     Float rhs = null;
-    if (readOnlyBuffer.get() == NullHandling.IS_NOT_NULL_BYTE) {
+    if (readOnlyBuffer.get() == TypeStrategies.IS_NOT_NULL_BYTE) {
       rhs = readOnlyBuffer.getFloat();
     }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongFloatSimpleStagedSerde.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongFloatSimpleStagedSerde.java
index d8390974a95..ec8ae074167 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongFloatSimpleStagedSerde.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongFloatSimpleStagedSerde.java
@@ -19,7 +19,7 @@
 
 package org.apache.druid.query.aggregation;
 
-import org.apache.druid.common.config.NullHandling;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -44,7 +44,7 @@ public class SerializablePairLongFloatSimpleStagedSerde 
extends AbstractSerializ
     long lhs = readOnlyBuffer.getLong();
 
     Float rhs = null;
-    if (readOnlyBuffer.get() == NullHandling.IS_NOT_NULL_BYTE) {
+    if (readOnlyBuffer.get() == TypeStrategies.IS_NOT_NULL_BYTE) {
       rhs = readOnlyBuffer.getFloat();
     }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongLongDeltaEncodedStagedSerde.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongLongDeltaEncodedStagedSerde.java
index dad3711c3c7..7f0357d0265 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongLongDeltaEncodedStagedSerde.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongLongDeltaEncodedStagedSerde.java
@@ -19,7 +19,7 @@
 
 package org.apache.druid.query.aggregation;
 
-import org.apache.druid.common.config.NullHandling;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -53,7 +53,7 @@ public class SerializablePairLongLongDeltaEncodedStagedSerde 
extends AbstractSer
     lhs += minValue;
 
     Long rhs = null;
-    if (readOnlyBuffer.get() == NullHandling.IS_NOT_NULL_BYTE) {
+    if (readOnlyBuffer.get() == TypeStrategies.IS_NOT_NULL_BYTE) {
       rhs = readOnlyBuffer.getLong();
     }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongLongSimpleStagedSerde.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongLongSimpleStagedSerde.java
index 587ce18a0b4..2fd11b58c01 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongLongSimpleStagedSerde.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/SerializablePairLongLongSimpleStagedSerde.java
@@ -19,7 +19,7 @@
 
 package org.apache.druid.query.aggregation;
 
-import org.apache.druid.common.config.NullHandling;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -44,7 +44,7 @@ public class SerializablePairLongLongSimpleStagedSerde 
extends AbstractSerializa
     long lhs = readOnlyBuffer.getLong();
 
     Long rhs = null;
-    if (readOnlyBuffer.get() == NullHandling.IS_NOT_NULL_BYTE) {
+    if (readOnlyBuffer.get() == TypeStrategies.IS_NOT_NULL_BYTE) {
       rhs = readOnlyBuffer.getLong();
     }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/SingleValueBufferAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/SingleValueBufferAggregator.java
index 5b5b6b2e054..f847dfed156 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/SingleValueBufferAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/SingleValueBufferAggregator.java
@@ -19,7 +19,6 @@
 
 package org.apache.druid.query.aggregation;
 
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.error.DruidException;
 import org.apache.druid.error.InvalidInput;
 import org.apache.druid.segment.ColumnValueSelector;
@@ -47,7 +46,7 @@ public class SingleValueBufferAggregator implements 
BufferAggregator
   @Override
   public void init(ByteBuffer buf, int position)
   {
-    buf.put(position, NullHandling.IS_NULL_BYTE);
+    buf.put(position, TypeStrategies.IS_NULL_BYTE);
   }
 
   @Override
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/any/NumericAnyBufferAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/any/NumericAnyBufferAggregator.java
index 1b7eeeaee09..cdaf5f0533b 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/any/NumericAnyBufferAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/any/NumericAnyBufferAggregator.java
@@ -19,10 +19,10 @@
 
 package org.apache.druid.query.aggregation.any;
 
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.query.aggregation.BufferAggregator;
 import org.apache.druid.query.monomorphicprocessing.RuntimeShapeInspector;
 import org.apache.druid.segment.BaseNullableColumnValueSelector;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import java.nio.ByteBuffer;
 
@@ -59,7 +59,7 @@ public abstract class NumericAnyBufferAggregator<TSelector 
extends BaseNullableC
   @Override
   public void init(ByteBuffer buf, int position)
   {
-    buf.put(position, NullHandling.IS_NULL_BYTE);
+    buf.put(position, TypeStrategies.IS_NULL_BYTE);
     initValue(buf, position);
   }
 
@@ -69,16 +69,16 @@ public abstract class NumericAnyBufferAggregator<TSelector 
extends BaseNullableC
     if ((buf.get(position) & BYTE_FLAG_FOUND_MASK) != BYTE_FLAG_FOUND_MASK) {
       if (!valueSelector.isNull()) {
         putValue(buf, position);
-        buf.put(position, (byte) (BYTE_FLAG_FOUND_MASK | 
NullHandling.IS_NOT_NULL_BYTE));
+        buf.put(position, (byte) (BYTE_FLAG_FOUND_MASK | 
TypeStrategies.IS_NOT_NULL_BYTE));
       } else {
-        buf.put(position, (byte) (BYTE_FLAG_FOUND_MASK | 
NullHandling.IS_NULL_BYTE));
+        buf.put(position, (byte) (BYTE_FLAG_FOUND_MASK | 
TypeStrategies.IS_NULL_BYTE));
       }
     }
   }
 
   boolean isValueNull(ByteBuffer buf, int position)
   {
-    return (buf.get(position) & BYTE_FLAG_NULL_MASK) == 
NullHandling.IS_NULL_BYTE;
+    return (buf.get(position) & BYTE_FLAG_NULL_MASK) == 
TypeStrategies.IS_NULL_BYTE;
   }
 
   @Override
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/any/NumericAnyVectorAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/any/NumericAnyVectorAggregator.java
index 5bfd877fd83..9bd2131dfef 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/any/NumericAnyVectorAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/any/NumericAnyVectorAggregator.java
@@ -20,8 +20,8 @@
 package org.apache.druid.query.aggregation.any;
 
 import com.google.common.annotations.VisibleForTesting;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.query.aggregation.VectorAggregator;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.vector.VectorValueSelector;
 
 import javax.annotation.Nullable;
@@ -64,7 +64,7 @@ public abstract class NumericAnyVectorAggregator implements 
VectorAggregator
   @Override
   public void init(ByteBuffer buf, int position)
   {
-    buf.put(position, NullHandling.IS_NULL_BYTE);
+    buf.put(position, TypeStrategies.IS_NULL_BYTE);
     initValue(buf, position + FOUND_VALUE_OFFSET);
   }
 
@@ -85,7 +85,7 @@ public abstract class NumericAnyVectorAggregator implements 
VectorAggregator
       }
       // There are no nulls, so try to put a value from the value selector
       if (putAnyValueFromRow(buf, position + FOUND_VALUE_OFFSET, startRow, 
endRow)) {
-        buf.put(position, (byte) (BYTE_FLAG_FOUND_MASK | 
NullHandling.IS_NOT_NULL_BYTE));
+        buf.put(position, (byte) (BYTE_FLAG_FOUND_MASK | 
TypeStrategies.IS_NOT_NULL_BYTE));
       }
     }
   }
@@ -123,11 +123,11 @@ public abstract class NumericAnyVectorAggregator 
implements VectorAggregator
   @VisibleForTesting
   boolean isValueNull(ByteBuffer buf, int position)
   {
-    return (buf.get(position) & BYTE_FLAG_NULL_MASK) == 
NullHandling.IS_NULL_BYTE;
+    return (buf.get(position) & BYTE_FLAG_NULL_MASK) == 
TypeStrategies.IS_NULL_BYTE;
   }
 
   private void putNull(ByteBuffer buf, int position)
   {
-    buf.put(position, (byte) (BYTE_FLAG_FOUND_MASK | 
NullHandling.IS_NULL_BYTE));
+    buf.put(position, (byte) (BYTE_FLAG_FOUND_MASK | 
TypeStrategies.IS_NULL_BYTE));
   }
 }
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/DoubleFirstLastVectorAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/DoubleFirstLastVectorAggregator.java
index fe87804f463..acb4514886a 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/DoubleFirstLastVectorAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/DoubleFirstLastVectorAggregator.java
@@ -19,8 +19,8 @@
 
 package org.apache.druid.query.aggregation.firstlast;
 
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.query.aggregation.SerializablePairLongDouble;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.vector.VectorObjectSelector;
 import org.apache.druid.segment.vector.VectorValueSelector;
 
@@ -60,7 +60,7 @@ public class DoubleFirstLastVectorAggregator extends 
FirstLastVectorAggregator<D
     buf.putLong(position, selectionPredicate.initValue());
     buf.put(
         position + NULLITY_OFFSET,
-        NullHandling.IS_NULL_BYTE
+        TypeStrategies.IS_NULL_BYTE
     );
     buf.putDouble(position + VALUE_OFFSET, 0.0D);
   }
@@ -70,7 +70,7 @@ public class DoubleFirstLastVectorAggregator extends 
FirstLastVectorAggregator<D
   public Object get(ByteBuffer buf, int position)
   {
     long time = buf.getLong(position);
-    if (buf.get(position + NULLITY_OFFSET) == NullHandling.IS_NULL_BYTE) {
+    if (buf.get(position + NULLITY_OFFSET) == TypeStrategies.IS_NULL_BYTE) {
       return new SerializablePairLongDouble(time, null);
     }
     return new SerializablePairLongDouble(time, buf.getDouble(position + 
VALUE_OFFSET));
@@ -80,7 +80,7 @@ public class DoubleFirstLastVectorAggregator extends 
FirstLastVectorAggregator<D
   protected void putValue(ByteBuffer buf, int position, long time, Double 
value)
   {
     buf.putLong(position, time);
-    buf.put(position + NULLITY_OFFSET, NullHandling.IS_NOT_NULL_BYTE);
+    buf.put(position + NULLITY_OFFSET, TypeStrategies.IS_NOT_NULL_BYTE);
     buf.putDouble(position + VALUE_OFFSET, value);
   }
 
@@ -88,7 +88,7 @@ public class DoubleFirstLastVectorAggregator extends 
FirstLastVectorAggregator<D
   protected void putValue(ByteBuffer buf, int position, long time, 
VectorValueSelector valueSelector, int index)
   {
     buf.putLong(position, time);
-    buf.put(position + NULLITY_OFFSET, NullHandling.IS_NOT_NULL_BYTE);
+    buf.put(position + NULLITY_OFFSET, TypeStrategies.IS_NOT_NULL_BYTE);
     buf.putDouble(position + VALUE_OFFSET, 
valueSelector.getDoubleVector()[index]);
   }
 
@@ -96,7 +96,7 @@ public class DoubleFirstLastVectorAggregator extends 
FirstLastVectorAggregator<D
   protected void putNull(ByteBuffer buf, int position, long time)
   {
     buf.putLong(position, time);
-    buf.put(position + NULLITY_OFFSET, NullHandling.IS_NULL_BYTE);
+    buf.put(position + NULLITY_OFFSET, TypeStrategies.IS_NULL_BYTE);
     buf.putDouble(position + VALUE_OFFSET, 0.0D);
 
   }
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/FloatFirstLastVectorAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/FloatFirstLastVectorAggregator.java
index 6c9caa196b3..1b7d280837a 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/FloatFirstLastVectorAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/FloatFirstLastVectorAggregator.java
@@ -19,8 +19,8 @@
 
 package org.apache.druid.query.aggregation.firstlast;
 
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.query.aggregation.SerializablePairLongFloat;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.vector.VectorObjectSelector;
 import org.apache.druid.segment.vector.VectorValueSelector;
 
@@ -60,7 +60,7 @@ public class FloatFirstLastVectorAggregator extends 
FirstLastVectorAggregator<Fl
     buf.putLong(position, selectionPredicate.initValue());
     buf.put(
         position + NULLITY_OFFSET,
-        NullHandling.IS_NULL_BYTE
+        TypeStrategies.IS_NULL_BYTE
     );
     buf.putFloat(position + VALUE_OFFSET, 0.0F);
   }
@@ -70,7 +70,7 @@ public class FloatFirstLastVectorAggregator extends 
FirstLastVectorAggregator<Fl
   public Object get(ByteBuffer buf, int position)
   {
     long time = buf.getLong(position);
-    if (buf.get(position + NULLITY_OFFSET) == NullHandling.IS_NULL_BYTE) {
+    if (buf.get(position + NULLITY_OFFSET) == TypeStrategies.IS_NULL_BYTE) {
       return new SerializablePairLongFloat(time, null);
     }
     return new SerializablePairLongFloat(time, buf.getFloat(position + 
VALUE_OFFSET));
@@ -80,7 +80,7 @@ public class FloatFirstLastVectorAggregator extends 
FirstLastVectorAggregator<Fl
   protected void putValue(ByteBuffer buf, int position, long time, Float value)
   {
     buf.putLong(position, time);
-    buf.put(position + NULLITY_OFFSET, NullHandling.IS_NOT_NULL_BYTE);
+    buf.put(position + NULLITY_OFFSET, TypeStrategies.IS_NOT_NULL_BYTE);
     buf.putFloat(position + VALUE_OFFSET, value);
   }
 
@@ -88,7 +88,7 @@ public class FloatFirstLastVectorAggregator extends 
FirstLastVectorAggregator<Fl
   protected void putValue(ByteBuffer buf, int position, long time, 
VectorValueSelector valueSelector, int index)
   {
     buf.putLong(position, time);
-    buf.put(position + NULLITY_OFFSET, NullHandling.IS_NOT_NULL_BYTE);
+    buf.put(position + NULLITY_OFFSET, TypeStrategies.IS_NOT_NULL_BYTE);
     buf.putFloat(position + VALUE_OFFSET, 
valueSelector.getFloatVector()[index]);
   }
 
@@ -96,7 +96,7 @@ public class FloatFirstLastVectorAggregator extends 
FirstLastVectorAggregator<Fl
   protected void putNull(ByteBuffer buf, int position, long time)
   {
     buf.putLong(position, time);
-    buf.put(position + NULLITY_OFFSET, NullHandling.IS_NULL_BYTE);
+    buf.put(position + NULLITY_OFFSET, TypeStrategies.IS_NULL_BYTE);
     buf.putFloat(position + VALUE_OFFSET, 0.0F);
   }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/LongFirstLastVectorAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/LongFirstLastVectorAggregator.java
index fa3398ab925..90ef096b84d 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/LongFirstLastVectorAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/LongFirstLastVectorAggregator.java
@@ -19,8 +19,8 @@
 
 package org.apache.druid.query.aggregation.firstlast;
 
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.query.aggregation.SerializablePairLongLong;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.vector.VectorObjectSelector;
 import org.apache.druid.segment.vector.VectorValueSelector;
 
@@ -60,7 +60,7 @@ public class LongFirstLastVectorAggregator extends 
FirstLastVectorAggregator<Lon
     buf.putLong(position, selectionPredicate.initValue());
     buf.put(
         position + NULLITY_OFFSET,
-        NullHandling.IS_NULL_BYTE
+        TypeStrategies.IS_NULL_BYTE
     );
     buf.putLong(position + VALUE_OFFSET, 0L);
   }
@@ -70,7 +70,7 @@ public class LongFirstLastVectorAggregator extends 
FirstLastVectorAggregator<Lon
   public Object get(ByteBuffer buf, int position)
   {
     long time = buf.getLong(position);
-    if (buf.get(position + NULLITY_OFFSET) == NullHandling.IS_NULL_BYTE) {
+    if (buf.get(position + NULLITY_OFFSET) == TypeStrategies.IS_NULL_BYTE) {
       return new SerializablePairLongLong(time, null);
     }
     return new SerializablePairLongLong(time, buf.getLong(position + 
VALUE_OFFSET));
@@ -80,7 +80,7 @@ public class LongFirstLastVectorAggregator extends 
FirstLastVectorAggregator<Lon
   protected void putValue(ByteBuffer buf, int position, long time, Long value)
   {
     buf.putLong(position, time);
-    buf.put(position + NULLITY_OFFSET, NullHandling.IS_NOT_NULL_BYTE);
+    buf.put(position + NULLITY_OFFSET, TypeStrategies.IS_NOT_NULL_BYTE);
     buf.putLong(position + VALUE_OFFSET, value);
   }
 
@@ -88,7 +88,7 @@ public class LongFirstLastVectorAggregator extends 
FirstLastVectorAggregator<Lon
   protected void putValue(ByteBuffer buf, int position, long time, 
VectorValueSelector valueSelector, int index)
   {
     buf.putLong(position, time);
-    buf.put(position + NULLITY_OFFSET, NullHandling.IS_NOT_NULL_BYTE);
+    buf.put(position + NULLITY_OFFSET, TypeStrategies.IS_NOT_NULL_BYTE);
     buf.putLong(position + VALUE_OFFSET, valueSelector.getLongVector()[index]);
   }
 
@@ -96,7 +96,7 @@ public class LongFirstLastVectorAggregator extends 
FirstLastVectorAggregator<Lon
   protected void putNull(ByteBuffer buf, int position, long time)
   {
     buf.putLong(position, time);
-    buf.put(position + NULLITY_OFFSET, NullHandling.IS_NULL_BYTE);
+    buf.put(position + NULLITY_OFFSET, TypeStrategies.IS_NULL_BYTE);
     buf.putLong(position + VALUE_OFFSET, 0L);
   }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/SingleStringFirstLastDimensionVectorAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/SingleStringFirstLastDimensionVectorAggregator.java
index f5db20355af..7a85e100b1b 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/SingleStringFirstLastDimensionVectorAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/SingleStringFirstLastDimensionVectorAggregator.java
@@ -19,10 +19,10 @@
 
 package org.apache.druid.query.aggregation.firstlast;
 
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.error.DruidException;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.query.aggregation.SerializablePairLongString;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.vector.SingleValueDimensionVectorSelector;
 import org.apache.druid.segment.vector.VectorValueSelector;
 
@@ -60,7 +60,7 @@ public class SingleStringFirstLastDimensionVectorAggregator
     buf.putLong(position, selectionPredicate.initValue());
     buf.put(
         position + NULLITY_OFFSET,
-        NullHandling.IS_NULL_BYTE
+        TypeStrategies.IS_NULL_BYTE
     );
     buf.putInt(position + VALUE_OFFSET, 0);
   }
@@ -74,7 +74,7 @@ public class SingleStringFirstLastDimensionVectorAggregator
   public Object get(ByteBuffer buf, int position)
   {
     long time = buf.getLong(position);
-    if (buf.get(position + NULLITY_OFFSET) == NullHandling.IS_NULL_BYTE) {
+    if (buf.get(position + NULLITY_OFFSET) == TypeStrategies.IS_NULL_BYTE) {
       return new SerializablePairLongString(time, null);
     }
     int index = buf.getInt(position + VALUE_OFFSET);
@@ -92,7 +92,7 @@ public class SingleStringFirstLastDimensionVectorAggregator
   protected void putValue(ByteBuffer buf, int position, long time, 
VectorValueSelector valueSelector, int index)
   {
     buf.putLong(position, time);
-    buf.put(position + NULLITY_OFFSET, NullHandling.IS_NOT_NULL_BYTE);
+    buf.put(position + NULLITY_OFFSET, TypeStrategies.IS_NOT_NULL_BYTE);
     buf.putInt(
         position + VALUE_OFFSET,
         ((SingleValueDimensionVectorSelectorAdapter) 
valueSelector).singleValueDimensionVectorSelector.getRowVector()[index]
@@ -103,7 +103,7 @@ public class SingleStringFirstLastDimensionVectorAggregator
   protected void putNull(ByteBuffer buf, int position, long time)
   {
     buf.putLong(position, time);
-    buf.put(position + NULLITY_OFFSET, NullHandling.IS_NULL_BYTE);
+    buf.put(position + NULLITY_OFFSET, TypeStrategies.IS_NULL_BYTE);
     buf.putInt(position + VALUE_OFFSET, 0);
   }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/first/NumericFirstBufferAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/first/NumericFirstBufferAggregator.java
index 701c2955f3b..b815c752440 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/first/NumericFirstBufferAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/first/NumericFirstBufferAggregator.java
@@ -20,11 +20,11 @@
 package org.apache.druid.query.aggregation.firstlast.first;
 
 import org.apache.druid.collections.SerializablePair;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.query.aggregation.BufferAggregator;
 import org.apache.druid.query.monomorphicprocessing.RuntimeShapeInspector;
 import org.apache.druid.segment.BaseLongColumnValueSelector;
 import org.apache.druid.segment.ColumnValueSelector;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import java.nio.ByteBuffer;
 
@@ -63,33 +63,33 @@ public abstract class NumericFirstBufferAggregator 
implements BufferAggregator
   void updateTimeWithValue(ByteBuffer buf, int position, long time, 
ColumnValueSelector valueSelector)
   {
     buf.putLong(position, time);
-    buf.put(position + NULL_OFFSET, NullHandling.IS_NOT_NULL_BYTE);
+    buf.put(position + NULL_OFFSET, TypeStrategies.IS_NOT_NULL_BYTE);
     putValue(buf, position + VALUE_OFFSET, valueSelector);
   }
 
   void updateTimeWithValue(ByteBuffer buf, int position, long time, Number 
value)
   {
     buf.putLong(position, time);
-    buf.put(position + NULL_OFFSET, NullHandling.IS_NOT_NULL_BYTE);
+    buf.put(position + NULL_OFFSET, TypeStrategies.IS_NOT_NULL_BYTE);
     putValue(buf, position + VALUE_OFFSET, value);
   }
 
   void updateTimeWithNull(ByteBuffer buf, int position, long time)
   {
     buf.putLong(position, time);
-    buf.put(position + NULL_OFFSET, NullHandling.IS_NULL_BYTE);
+    buf.put(position + NULL_OFFSET, TypeStrategies.IS_NULL_BYTE);
   }
 
   boolean isValueNull(ByteBuffer buf, int position)
   {
-    return buf.get(position + NULL_OFFSET) == NullHandling.IS_NULL_BYTE;
+    return buf.get(position + NULL_OFFSET) == TypeStrategies.IS_NULL_BYTE;
   }
 
   @Override
   public void init(ByteBuffer buf, int position)
   {
     buf.putLong(position, Long.MAX_VALUE);
-    buf.put(position + NULL_OFFSET, NullHandling.IS_NULL_BYTE);
+    buf.put(position + NULL_OFFSET, TypeStrategies.IS_NULL_BYTE);
     initValue(buf, position + VALUE_OFFSET);
   }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/last/NumericLastBufferAggregator.java
 
b/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/last/NumericLastBufferAggregator.java
index 352ac17d00a..cebddf6e6ca 100644
--- 
a/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/last/NumericLastBufferAggregator.java
+++ 
b/processing/src/main/java/org/apache/druid/query/aggregation/firstlast/last/NumericLastBufferAggregator.java
@@ -20,11 +20,11 @@
 package org.apache.druid.query.aggregation.firstlast.last;
 
 import org.apache.druid.collections.SerializablePair;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.query.aggregation.BufferAggregator;
 import org.apache.druid.query.monomorphicprocessing.RuntimeShapeInspector;
 import org.apache.druid.segment.BaseLongColumnValueSelector;
 import org.apache.druid.segment.ColumnValueSelector;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import java.nio.ByteBuffer;
 
@@ -65,34 +65,34 @@ public abstract class NumericLastBufferAggregator 
implements BufferAggregator
 
   boolean isValueNull(ByteBuffer buf, int position)
   {
-    return buf.get(position + NULL_OFFSET) == NullHandling.IS_NULL_BYTE;
+    return buf.get(position + NULL_OFFSET) == TypeStrategies.IS_NULL_BYTE;
   }
 
   void updateTimeWithValue(ByteBuffer buf, int position, long time, 
ColumnValueSelector valueSelector)
   {
     buf.putLong(position, time);
-    buf.put(position + NULL_OFFSET, NullHandling.IS_NOT_NULL_BYTE);
+    buf.put(position + NULL_OFFSET, TypeStrategies.IS_NOT_NULL_BYTE);
     putValue(buf, position + VALUE_OFFSET, valueSelector);
   }
 
   void updateTimeWithValue(ByteBuffer buf, int position, long time, Number 
value)
   {
     buf.putLong(position, time);
-    buf.put(position + NULL_OFFSET, NullHandling.IS_NOT_NULL_BYTE);
+    buf.put(position + NULL_OFFSET, TypeStrategies.IS_NOT_NULL_BYTE);
     putValue(buf, position + VALUE_OFFSET, value);
   }
 
   void updateTimeWithNull(ByteBuffer buf, int position, long time)
   {
     buf.putLong(position, time);
-    buf.put(position + NULL_OFFSET, NullHandling.IS_NULL_BYTE);
+    buf.put(position + NULL_OFFSET, TypeStrategies.IS_NULL_BYTE);
   }
 
   @Override
   public void init(ByteBuffer buf, int position)
   {
     buf.putLong(position, Long.MIN_VALUE);
-    buf.put(position + NULL_OFFSET, NullHandling.IS_NULL_BYTE);
+    buf.put(position + NULL_OFFSET, TypeStrategies.IS_NULL_BYTE);
     initValue(buf, position + VALUE_OFFSET);
   }
 
diff --git 
a/processing/src/main/java/org/apache/druid/query/filter/SelectorDimFilter.java 
b/processing/src/main/java/org/apache/druid/query/filter/SelectorDimFilter.java
index afb25d7e370..a03414970e6 100644
--- 
a/processing/src/main/java/org/apache/druid/query/filter/SelectorDimFilter.java
+++ 
b/processing/src/main/java/org/apache/druid/query/filter/SelectorDimFilter.java
@@ -27,9 +27,9 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Range;
 import com.google.common.collect.RangeSet;
 import com.google.common.collect.TreeRangeSet;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.query.cache.CacheKeyBuilder;
 import org.apache.druid.query.extraction.ExtractionFn;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.filter.DimensionPredicateFilter;
 import org.apache.druid.segment.filter.SelectorFilter;
 
@@ -85,7 +85,7 @@ public class SelectorDimFilter extends 
AbstractOptimizableDimFilter implements D
         .appendByte(DimFilterUtils.STRING_SEPARATOR)
         .appendString(dimension)
         .appendByte(DimFilterUtils.STRING_SEPARATOR)
-        .appendByte(value == null ? NullHandling.IS_NULL_BYTE : 
NullHandling.IS_NOT_NULL_BYTE)
+        .appendByte(value == null ? TypeStrategies.IS_NULL_BYTE : 
TypeStrategies.IS_NOT_NULL_BYTE)
         .appendString(value)
         .appendByte(DimFilterUtils.STRING_SEPARATOR)
         .appendByteArray(extractionFn == null ? new byte[0] : 
extractionFn.getCacheKey())
diff --git 
a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GrouperBufferComparatorUtils.java
 
b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GrouperBufferComparatorUtils.java
index 109ddb66f3d..baba7bab4ab 100644
--- 
a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GrouperBufferComparatorUtils.java
+++ 
b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/GrouperBufferComparatorUtils.java
@@ -20,7 +20,6 @@
 package org.apache.druid.query.groupby.epinephelinae;
 
 import com.google.common.primitives.Longs;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.query.aggregation.AggregatorFactory;
 import org.apache.druid.query.dimension.DimensionSpec;
@@ -29,6 +28,7 @@ import 
org.apache.druid.query.groupby.orderby.OrderByColumnSpec;
 import org.apache.druid.query.ordering.StringComparator;
 import org.apache.druid.query.ordering.StringComparators;
 import org.apache.druid.segment.column.ColumnType;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -409,8 +409,8 @@ public class GrouperBufferComparatorUtils
   )
   {
     return (lhsBuffer, rhsBuffer, lhsPosition, rhsPosition) -> {
-      boolean isLhsNull = (lhsBuffer.get(lhsPosition + keyBufferPosition) == 
NullHandling.IS_NULL_BYTE);
-      boolean isRhsNull = (rhsBuffer.get(rhsPosition + keyBufferPosition) == 
NullHandling.IS_NULL_BYTE);
+      boolean isLhsNull = (lhsBuffer.get(lhsPosition + keyBufferPosition) == 
TypeStrategies.IS_NULL_BYTE);
+      boolean isRhsNull = (rhsBuffer.get(rhsPosition + keyBufferPosition) == 
TypeStrategies.IS_NULL_BYTE);
       if (isLhsNull && isRhsNull) {
         // Both are null
         return 0;
diff --git 
a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/RowBasedGrouperHelper.java
 
b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/RowBasedGrouperHelper.java
index 0f64988ddf2..665eadf7de6 100644
--- 
a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/RowBasedGrouperHelper.java
+++ 
b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/RowBasedGrouperHelper.java
@@ -34,7 +34,6 @@ import 
com.google.common.util.concurrent.ListeningExecutorService;
 import it.unimi.dsi.fastutil.ints.IntArrays;
 import it.unimi.dsi.fastutil.objects.Object2IntMap;
 import org.apache.druid.collections.ReferenceCountingResourceHolder;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.common.guava.SettableSupplier;
 import org.apache.druid.common.utils.IntArrayUtils;
 import org.apache.druid.error.DruidException;
@@ -81,6 +80,7 @@ import org.apache.druid.segment.column.ColumnCapabilitiesImpl;
 import org.apache.druid.segment.column.ColumnType;
 import org.apache.druid.segment.column.RowSignature;
 import org.apache.druid.segment.column.TypeSignature;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.column.ValueType;
 import org.apache.druid.segment.data.IndexedInts;
 import org.apache.druid.segment.filter.Filters;
@@ -2166,9 +2166,9 @@ public class RowBasedGrouperHelper
       {
         Object val = key.getKey()[idx];
         if (val == null) {
-          keyBuffer.put(NullHandling.IS_NULL_BYTE);
+          keyBuffer.put(TypeStrategies.IS_NULL_BYTE);
         } else {
-          keyBuffer.put(NullHandling.IS_NOT_NULL_BYTE);
+          keyBuffer.put(TypeStrategies.IS_NOT_NULL_BYTE);
         }
         return delegate.putToKeyBuffer(key, idx);
       }
@@ -2176,7 +2176,7 @@ public class RowBasedGrouperHelper
       @Override
       public void getFromByteBuffer(ByteBuffer buffer, int initialOffset, int 
dimValIdx, Object[] dimValues)
       {
-        if (buffer.get(initialOffset + keyBufferPosition) == 
NullHandling.IS_NULL_BYTE) {
+        if (buffer.get(initialOffset + keyBufferPosition) == 
TypeStrategies.IS_NULL_BYTE) {
           dimValues[dimValIdx] = null;
         } else {
           delegate.getFromByteBuffer(buffer, initialOffset, dimValIdx, 
dimValues);
diff --git 
a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/NullableDoubleGroupByVectorColumnSelector.java
 
b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/NullableDoubleGroupByVectorColumnSelector.java
index 7e429d25d81..e4992a9e38b 100644
--- 
a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/NullableDoubleGroupByVectorColumnSelector.java
+++ 
b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/NullableDoubleGroupByVectorColumnSelector.java
@@ -20,9 +20,9 @@
 package org.apache.druid.query.groupby.epinephelinae.vector;
 
 import org.apache.datasketches.memory.WritableMemory;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.query.groupby.ResultRow;
 import org.apache.druid.query.groupby.epinephelinae.collection.MemoryPointer;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.vector.VectorValueSelector;
 
 public class NullableDoubleGroupByVectorColumnSelector implements 
GroupByVectorColumnSelector
@@ -54,12 +54,12 @@ public class NullableDoubleGroupByVectorColumnSelector 
implements GroupByVectorC
 
     if (nulls != null) {
       for (int i = startRow, j = keyOffset; i < endRow; i++, j += keySize) {
-        keySpace.putByte(j, nulls[i] ? NullHandling.IS_NULL_BYTE : 
NullHandling.IS_NOT_NULL_BYTE);
+        keySpace.putByte(j, nulls[i] ? TypeStrategies.IS_NULL_BYTE : 
TypeStrategies.IS_NOT_NULL_BYTE);
         keySpace.putDouble(j + 1, vector[i]);
       }
     } else {
       for (int i = startRow, j = keyOffset; i < endRow; i++, j += keySize) {
-        keySpace.putByte(j, NullHandling.IS_NOT_NULL_BYTE);
+        keySpace.putByte(j, TypeStrategies.IS_NOT_NULL_BYTE);
         keySpace.putDouble(j + 1, vector[i]);
       }
     }
@@ -75,7 +75,7 @@ public class NullableDoubleGroupByVectorColumnSelector 
implements GroupByVectorC
       final int resultRowPosition
   )
   {
-    if (keyMemory.memory().getByte(keyMemory.position() + keyOffset) == 
NullHandling.IS_NULL_BYTE) {
+    if (keyMemory.memory().getByte(keyMemory.position() + keyOffset) == 
TypeStrategies.IS_NULL_BYTE) {
       resultRow.set(resultRowPosition, null);
     } else {
       resultRow.set(resultRowPosition, 
keyMemory.memory().getDouble(keyMemory.position() + keyOffset + 1));
diff --git 
a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/NullableFloatGroupByVectorColumnSelector.java
 
b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/NullableFloatGroupByVectorColumnSelector.java
index 2717a205e3f..1b8012b8d34 100644
--- 
a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/NullableFloatGroupByVectorColumnSelector.java
+++ 
b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/NullableFloatGroupByVectorColumnSelector.java
@@ -20,9 +20,9 @@
 package org.apache.druid.query.groupby.epinephelinae.vector;
 
 import org.apache.datasketches.memory.WritableMemory;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.query.groupby.ResultRow;
 import org.apache.druid.query.groupby.epinephelinae.collection.MemoryPointer;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.vector.VectorValueSelector;
 
 public class NullableFloatGroupByVectorColumnSelector implements 
GroupByVectorColumnSelector
@@ -54,12 +54,12 @@ public class NullableFloatGroupByVectorColumnSelector 
implements GroupByVectorCo
 
     if (nulls != null) {
       for (int i = startRow, j = keyOffset; i < endRow; i++, j += keySize) {
-        keySpace.putByte(j, nulls[i] ? NullHandling.IS_NULL_BYTE : 
NullHandling.IS_NOT_NULL_BYTE);
+        keySpace.putByte(j, nulls[i] ? TypeStrategies.IS_NULL_BYTE : 
TypeStrategies.IS_NOT_NULL_BYTE);
         keySpace.putFloat(j + 1, vector[i]);
       }
     } else {
       for (int i = startRow, j = keyOffset; i < endRow; i++, j += keySize) {
-        keySpace.putByte(j, NullHandling.IS_NOT_NULL_BYTE);
+        keySpace.putByte(j, TypeStrategies.IS_NOT_NULL_BYTE);
         keySpace.putFloat(j + 1, vector[i]);
       }
     }
@@ -75,7 +75,7 @@ public class NullableFloatGroupByVectorColumnSelector 
implements GroupByVectorCo
       final int resultRowPosition
   )
   {
-    if (keyMemory.memory().getByte(keyMemory.position() + keyOffset) == 
NullHandling.IS_NULL_BYTE) {
+    if (keyMemory.memory().getByte(keyMemory.position() + keyOffset) == 
TypeStrategies.IS_NULL_BYTE) {
       resultRow.set(resultRowPosition, null);
     } else {
       resultRow.set(resultRowPosition, 
keyMemory.memory().getFloat(keyMemory.position() + keyOffset + 1));
diff --git 
a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/NullableLongGroupByVectorColumnSelector.java
 
b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/NullableLongGroupByVectorColumnSelector.java
index dc221f04db1..fe08eb9fab1 100644
--- 
a/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/NullableLongGroupByVectorColumnSelector.java
+++ 
b/processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/vector/NullableLongGroupByVectorColumnSelector.java
@@ -20,9 +20,9 @@
 package org.apache.druid.query.groupby.epinephelinae.vector;
 
 import org.apache.datasketches.memory.WritableMemory;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.query.groupby.ResultRow;
 import org.apache.druid.query.groupby.epinephelinae.collection.MemoryPointer;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.vector.VectorValueSelector;
 
 public class NullableLongGroupByVectorColumnSelector implements 
GroupByVectorColumnSelector
@@ -54,12 +54,12 @@ public class NullableLongGroupByVectorColumnSelector 
implements GroupByVectorCol
 
     if (nulls != null) {
       for (int i = startRow, j = keyOffset; i < endRow; i++, j += keySize) {
-        keySpace.putByte(j, nulls[i] ? NullHandling.IS_NULL_BYTE : 
NullHandling.IS_NOT_NULL_BYTE);
+        keySpace.putByte(j, nulls[i] ? TypeStrategies.IS_NULL_BYTE : 
TypeStrategies.IS_NOT_NULL_BYTE);
         keySpace.putLong(j + 1, vector[i]);
       }
     } else {
       for (int i = startRow, j = keyOffset; i < endRow; i++, j += keySize) {
-        keySpace.putByte(j, NullHandling.IS_NOT_NULL_BYTE);
+        keySpace.putByte(j, TypeStrategies.IS_NOT_NULL_BYTE);
         keySpace.putLong(j + 1, vector[i]);
       }
     }
@@ -75,7 +75,7 @@ public class NullableLongGroupByVectorColumnSelector 
implements GroupByVectorCol
       final int resultRowPosition
   )
   {
-    if (keyMemory.memory().getByte(keyMemory.position() + keyOffset) == 
NullHandling.IS_NULL_BYTE) {
+    if (keyMemory.memory().getByte(keyMemory.position() + keyOffset) == 
TypeStrategies.IS_NULL_BYTE) {
       resultRow.set(resultRowPosition, null);
     } else {
       resultRow.set(resultRowPosition, 
keyMemory.memory().getLong(keyMemory.position() + keyOffset + 1));
diff --git 
a/processing/src/main/java/org/apache/druid/segment/column/NullableTypeStrategy.java
 
b/processing/src/main/java/org/apache/druid/segment/column/NullableTypeStrategy.java
index db619266986..09deb9f48e6 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/column/NullableTypeStrategy.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/column/NullableTypeStrategy.java
@@ -20,7 +20,6 @@
 package org.apache.druid.segment.column;
 
 import it.unimi.dsi.fastutil.Hash;
-import org.apache.druid.common.config.NullHandling;
 
 import javax.annotation.CheckReturnValue;
 import javax.annotation.Nullable;
@@ -28,9 +27,9 @@ import java.nio.ByteBuffer;
 import java.util.Comparator;
 
 /**
- * Wrapper of {@link TypeStrategy} for nullable types, which stores {@link 
NullHandling#IS_NULL_BYTE} or
- * {@link NullHandling#IS_NOT_NULL_BYTE} in the leading byte of any value, as 
appropriate. If the value is null, only
- * {@link NullHandling#IS_NULL_BYTE} will be set, otherwise, the value bytes 
will be written after the null byte.
+ * Wrapper of {@link TypeStrategy} for nullable types, which stores {@link 
TypeStrategies#IS_NULL_BYTE} or
+ * {@link TypeStrategies#IS_NOT_NULL_BYTE} in the leading byte of any value, 
as appropriate. If the value is null, only
+ * {@link TypeStrategies#IS_NULL_BYTE} will be set, otherwise, the value bytes 
will be written after the null byte.
  *
  * layout: | null (byte) | value (byte[]) |
  *
@@ -62,7 +61,7 @@ public final class NullableTypeStrategy<T> implements 
Comparator<T>, Hash.Strate
   @Nullable
   public T read(ByteBuffer buffer)
   {
-    if ((buffer.get() & NullHandling.IS_NULL_BYTE) == 
NullHandling.IS_NULL_BYTE) {
+    if ((buffer.get() & TypeStrategies.IS_NULL_BYTE) == 
TypeStrategies.IS_NULL_BYTE) {
       return null;
     }
     return delegate.read(buffer);
@@ -76,10 +75,10 @@ public final class NullableTypeStrategy<T> implements 
Comparator<T>, Hash.Strate
     if (remaining >= 0) {
       // if we have room left, write the null byte and the value
       if (value == null) {
-        buffer.put(NullHandling.IS_NULL_BYTE);
+        buffer.put(TypeStrategies.IS_NULL_BYTE);
         return Byte.BYTES;
       }
-      buffer.put(NullHandling.IS_NOT_NULL_BYTE);
+      buffer.put(TypeStrategies.IS_NOT_NULL_BYTE);
       int written = delegate.write(buffer, value, maxSizeBytes - Byte.BYTES);
       return written < 0 ? written : Byte.BYTES + written;
     } else {
diff --git 
a/processing/src/main/java/org/apache/druid/segment/column/TypeSignature.java 
b/processing/src/main/java/org/apache/druid/segment/column/TypeSignature.java
index b1b5c25d950..c0da42e329e 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/column/TypeSignature.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/column/TypeSignature.java
@@ -109,8 +109,8 @@ public interface TypeSignature<Type extends TypeDescriptor>
   /**
    * A {@link NullableTypeStrategy} is a {@link TypeStrategy} which can handle 
reading and writing null values, at the
    * very high cost of an additional byte per value, of which a single bit is 
used to store
-   * {@link org.apache.druid.common.config.NullHandling#IS_NULL_BYTE} or
-   * {@link org.apache.druid.common.config.NullHandling#IS_NOT_NULL_BYTE} as 
appropriate.
+   * {@link TypeStrategies#IS_NULL_BYTE} or
+   * {@link TypeStrategies#IS_NOT_NULL_BYTE} as appropriate.
    *
    * This pattern is common among buffer aggregators, which don't have access 
to an external memory location for more
    * efficient tracking of null values and must store this information inline 
with the accumulated value.
diff --git 
a/processing/src/main/java/org/apache/druid/segment/column/TypeStrategies.java 
b/processing/src/main/java/org/apache/druid/segment/column/TypeStrategies.java
index 7ac8def99ec..7099c7b7891 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/column/TypeStrategies.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/column/TypeStrategies.java
@@ -23,7 +23,6 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.Ordering;
 import com.google.common.primitives.Floats;
 import com.google.common.primitives.Longs;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.java.util.common.StringUtils;
@@ -36,6 +35,9 @@ import java.util.concurrent.ConcurrentHashMap;
 
 public class TypeStrategies
 {
+  public static final byte IS_NULL_BYTE = (byte) 1;
+  public static final byte IS_NOT_NULL_BYTE = (byte) 0;
+  
   public static final int VALUE_OFFSET = Byte.BYTES;
   public static final int NULLABLE_LONG_SIZE = Byte.BYTES + Long.BYTES;
   public static final int NULLABLE_DOUBLE_SIZE = Byte.BYTES + Double.BYTES;
@@ -91,7 +93,7 @@ public class TypeStrategies
   }
 
   /**
-   * Clear and set the 'null' byte of a nullable value to {@link 
NullHandling#IS_NULL_BYTE} to a {@link ByteBuffer} at
+   * Clear and set the 'null' byte of a nullable value to {@link 
TypeStrategies#IS_NULL_BYTE} to a {@link ByteBuffer} at
    * the supplied position. This method does not change the buffer position, 
limit, or mark, because it does not expect
    * to own the buffer given to it (i.e. buffer aggs)
    *
@@ -104,29 +106,29 @@ public class TypeStrategies
    */
   public static int writeNull(ByteBuffer buffer, int offset)
   {
-    buffer.put(offset, NullHandling.IS_NULL_BYTE);
+    buffer.put(offset, IS_NULL_BYTE);
     return 1;
   }
 
   /**
-   * Checks if a 'nullable' value's null byte is set to {@link 
NullHandling#IS_NULL_BYTE}. This method will mask the
+   * Checks if a 'nullable' value's null byte is set to {@link 
TypeStrategies#IS_NULL_BYTE}. This method will mask the
    * value of the null byte to only check if the null bit is set, meaning that 
the higher bits can be utilized for
    * flags as necessary (e.g. using high bits to indicate if the value has 
been set or not for aggregators).
    *
    * Note that writing nullable values with the methods of {@link Types} will 
always clear and set the null byte to
-   * either {@link NullHandling#IS_NULL_BYTE} or {@link 
NullHandling#IS_NOT_NULL_BYTE}, losing any flag bits.
+   * either {@link TypeStrategies#IS_NULL_BYTE} or {@link 
TypeStrategies#IS_NOT_NULL_BYTE}, losing any flag bits.
    *
    * layout: | null (byte) | value |
    */
   public static boolean isNullableNull(ByteBuffer buffer, int offset)
   {
     // use & so that callers can use the high bits of the null byte to pack 
additional information if necessary
-    return (buffer.get(offset) & NullHandling.IS_NULL_BYTE) == 
NullHandling.IS_NULL_BYTE;
+    return (buffer.get(offset) & IS_NULL_BYTE) == IS_NULL_BYTE;
   }
 
   /**
    * Write a non-null long value to a {@link ByteBuffer} at the supplied 
offset. The first byte is always cleared and
-   * set to {@link NullHandling#IS_NOT_NULL_BYTE}, the long value is written 
in the next 8 bytes.
+   * set to {@link TypeStrategies#IS_NOT_NULL_BYTE}, the long value is written 
in the next 8 bytes.
    *
    * layout: | null (byte) | long |
    *
@@ -137,7 +139,7 @@ public class TypeStrategies
    */
   public static int writeNotNullNullableLong(ByteBuffer buffer, int offset, 
long value)
   {
-    buffer.put(offset++, NullHandling.IS_NOT_NULL_BYTE);
+    buffer.put(offset++, IS_NOT_NULL_BYTE);
     buffer.putLong(offset, value);
     return NULLABLE_LONG_SIZE;
   }
@@ -158,7 +160,7 @@ public class TypeStrategies
 
   /**
    * Write a non-null double value to a {@link ByteBuffer} at the supplied 
offset. The first byte is always cleared and
-   * set to {@link NullHandling#IS_NOT_NULL_BYTE}, the double value is written 
in the next 8 bytes.
+   * set to {@link TypeStrategies#IS_NOT_NULL_BYTE}, the double value is 
written in the next 8 bytes.
    *
    * layout: | null (byte) | double |
    *
@@ -169,7 +171,7 @@ public class TypeStrategies
    */
   public static int writeNotNullNullableDouble(ByteBuffer buffer, int offset, 
double value)
   {
-    buffer.put(offset++, NullHandling.IS_NOT_NULL_BYTE);
+    buffer.put(offset++, IS_NOT_NULL_BYTE);
     buffer.putDouble(offset, value);
     return NULLABLE_DOUBLE_SIZE;
   }
@@ -190,7 +192,7 @@ public class TypeStrategies
 
   /**
    * Write a non-null float value to a {@link ByteBuffer} at the supplied 
offset. The first byte is always cleared and
-   * set to {@link NullHandling#IS_NOT_NULL_BYTE}, the float value is written 
in the next 4 bytes.
+   * set to {@link TypeStrategies#IS_NOT_NULL_BYTE}, the float value is 
written in the next 4 bytes.
    *
    * layout: | null (byte) | float |
    *
@@ -201,7 +203,7 @@ public class TypeStrategies
    */
   public static int writeNotNullNullableFloat(ByteBuffer buffer, int offset, 
float value)
   {
-    buffer.put(offset++, NullHandling.IS_NOT_NULL_BYTE);
+    buffer.put(offset++, IS_NOT_NULL_BYTE);
     buffer.putFloat(offset, value);
     return NULLABLE_FLOAT_SIZE;
   }
diff --git 
a/processing/src/main/java/org/apache/druid/segment/column/TypeStrategy.java 
b/processing/src/main/java/org/apache/druid/segment/column/TypeStrategy.java
index 1d75d9fde74..8020c423856 100644
--- a/processing/src/main/java/org/apache/druid/segment/column/TypeStrategy.java
+++ b/processing/src/main/java/org/apache/druid/segment/column/TypeStrategy.java
@@ -20,7 +20,6 @@
 package org.apache.druid.segment.column;
 
 import it.unimi.dsi.fastutil.Hash;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.error.DruidException;
 
 import java.nio.ByteBuffer;
@@ -41,8 +40,8 @@ import java.util.Comparator;
  * All implementations of this mechanism support reading and writing ONLY 
non-null values. To handle nulls inline with
  * your values, consider {@link NullableTypeStrategy}, which might be 
acceptable to use if you need to read and write
  * nullable values, AND, you have enough memory to burn a full byte for every 
value you want to store. It will store
- * values with a leading byte containing either {@link 
NullHandling#IS_NULL_BYTE} or
- * {@link NullHandling#IS_NOT_NULL_BYTE} as appropriate. If you have a lot of 
values to write and a lot of nulls,
+ * values with a leading byte containing either {@link 
TypeStrategies#IS_NULL_BYTE} or
+ * {@link TypeStrategies#IS_NOT_NULL_BYTE} as appropriate. If you have a lot 
of values to write and a lot of nulls,
  * consider alternative approaches to tracking your nulls instead.
  *
  * This mechanism allows using the natural {@link ByteBuffer#position()} and 
modify the underlying position as they
diff --git 
a/processing/src/main/java/org/apache/druid/segment/data/FixedIndexed.java 
b/processing/src/main/java/org/apache/druid/segment/data/FixedIndexed.java
index 3ba90c51332..10691d9e9b0 100644
--- a/processing/src/main/java/org/apache/druid/segment/data/FixedIndexed.java
+++ b/processing/src/main/java/org/apache/druid/segment/data/FixedIndexed.java
@@ -23,8 +23,8 @@ import com.google.common.base.Preconditions;
 import com.google.common.base.Supplier;
 import it.unimi.dsi.fastutil.ints.IntIntImmutablePair;
 import it.unimi.dsi.fastutil.ints.IntIntPair;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.query.monomorphicprocessing.RuntimeShapeInspector;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.column.TypeStrategy;
 
 import javax.annotation.Nullable;
@@ -59,7 +59,7 @@ public class FixedIndexed<T> implements Indexed<T>
     final byte version = buffer.get();
     Preconditions.checkState(version == 0, "Unknown version [%s]", version);
     final byte flags = buffer.get();
-    final boolean hasNull = (flags & NullHandling.IS_NULL_BYTE) == 
NullHandling.IS_NULL_BYTE ? true : false;
+    final boolean hasNull = (flags & TypeStrategies.IS_NULL_BYTE) == 
TypeStrategies.IS_NULL_BYTE ? true : false;
     final boolean isSorted = (flags & IS_SORTED_MASK) == IS_SORTED_MASK ? true 
: false;
     Preconditions.checkState(!(hasNull && !isSorted), "cannot have null values 
if not sorted");
     final int size = buffer.getInt() + (hasNull ? 1 : 0);
diff --git 
a/processing/src/main/java/org/apache/druid/segment/data/FixedIndexedWriter.java
 
b/processing/src/main/java/org/apache/druid/segment/data/FixedIndexedWriter.java
index c93b1ecc730..4bac89fa151 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/data/FixedIndexedWriter.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/data/FixedIndexedWriter.java
@@ -19,10 +19,10 @@
 
 package org.apache.druid.segment.data;
 
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.error.DruidException;
 import org.apache.druid.io.Channels;
 import org.apache.druid.java.util.common.io.smoosh.FileSmoosher;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.column.TypeStrategy;
 import org.apache.druid.segment.writeout.SegmentWriteOutMedium;
 import org.apache.druid.segment.writeout.WriteOutBytes;
@@ -137,7 +137,7 @@ public class FixedIndexedWriter<T> implements 
DictionaryWriter<T>
     scratch.put((byte) 0);
     byte flags = 0x00;
     if (hasNulls) {
-      flags = (byte) (flags | NullHandling.IS_NULL_BYTE);
+      flags = (byte) (flags | TypeStrategies.IS_NULL_BYTE);
     }
     if (isSorted) {
       flags = (byte) (flags | FixedIndexed.IS_SORTED_MASK);
diff --git 
a/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIndexed.java 
b/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIndexed.java
index 58231fd2602..bd541404b1d 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIndexed.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIndexed.java
@@ -21,11 +21,11 @@ package org.apache.druid.segment.data;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Supplier;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.query.monomorphicprocessing.RuntimeShapeInspector;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -100,7 +100,7 @@ public abstract class FrontCodedIndexed implements 
Indexed<ByteBuffer>
     final byte version = orderedBuffer.get();
     Preconditions.checkArgument(version == V0 || version == V1, "only V0 and 
V1 exist, encountered " + version);
     final int bucketSize = Byte.toUnsignedInt(orderedBuffer.get());
-    final boolean hasNull = NullHandling.IS_NULL_BYTE == orderedBuffer.get();
+    final boolean hasNull = TypeStrategies.IS_NULL_BYTE == orderedBuffer.get();
     final int numValues = VByte.readInt(orderedBuffer);
     // size of offsets + values
     final int size = VByte.readInt(orderedBuffer);
diff --git 
a/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIndexedWriter.java
 
b/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIndexedWriter.java
index 707e3894793..b2fb3583215 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIndexedWriter.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIndexedWriter.java
@@ -20,13 +20,13 @@
 package org.apache.druid.segment.data;
 
 import com.google.common.primitives.Ints;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.error.DruidException;
 import org.apache.druid.io.Channels;
 import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.java.util.common.io.smoosh.FileSmoosher;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.writeout.SegmentWriteOutMedium;
 import org.apache.druid.segment.writeout.WriteOutBytes;
 
@@ -177,7 +177,7 @@ public class FrontCodedIndexedWriter implements 
DictionaryWriter<byte[]>
     resetScratch();
     scratch.put(version);
     scratch.put((byte) bucketSize);
-    scratch.put(hasNulls ? NullHandling.IS_NULL_BYTE : 
NullHandling.IS_NOT_NULL_BYTE);
+    scratch.put(hasNulls ? TypeStrategies.IS_NULL_BYTE : 
TypeStrategies.IS_NOT_NULL_BYTE);
     VByte.writeInt(scratch, numWritten);
     VByte.writeInt(scratch, Ints.checkedCast(headerOut.size() + 
valuesOut.size()));
     scratch.flip();
diff --git 
a/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIntArrayIndexed.java
 
b/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIntArrayIndexed.java
index 9543bdfb328..c8e1893fb4d 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIntArrayIndexed.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIntArrayIndexed.java
@@ -21,10 +21,10 @@ package org.apache.druid.segment.data;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Supplier;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.query.monomorphicprocessing.RuntimeShapeInspector;
+import org.apache.druid.segment.column.TypeStrategies;
 
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
@@ -79,7 +79,7 @@ public final class FrontCodedIntArrayIndexed implements 
Indexed<int[]>
     final byte version = orderedBuffer.get();
     Preconditions.checkArgument(version == 0, "only V0 exists, encountered " + 
version);
     final int bucketSize = Byte.toUnsignedInt(orderedBuffer.get());
-    final boolean hasNull = NullHandling.IS_NULL_BYTE == orderedBuffer.get();
+    final boolean hasNull = TypeStrategies.IS_NULL_BYTE == orderedBuffer.get();
     final int numValues = VByte.readInt(orderedBuffer);
     // size of offsets + values
     final int size = VByte.readInt(orderedBuffer);
diff --git 
a/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIntArrayIndexedWriter.java
 
b/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIntArrayIndexedWriter.java
index 50e350f3d64..b02ca882bcd 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIntArrayIndexedWriter.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/data/FrontCodedIntArrayIndexedWriter.java
@@ -20,12 +20,12 @@
 package org.apache.druid.segment.data;
 
 import com.google.common.primitives.Ints;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.error.DruidException;
 import org.apache.druid.io.Channels;
 import org.apache.druid.java.util.common.IAE;
 import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.java.util.common.io.smoosh.FileSmoosher;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.writeout.SegmentWriteOutMedium;
 import org.apache.druid.segment.writeout.WriteOutBytes;
 
@@ -186,7 +186,7 @@ public class FrontCodedIntArrayIndexedWriter implements 
DictionaryWriter<int[]>
     // version 0
     scratch.put((byte) 0);
     scratch.put((byte) bucketSize);
-    scratch.put(hasNulls ? NullHandling.IS_NULL_BYTE : 
NullHandling.IS_NOT_NULL_BYTE);
+    scratch.put(hasNulls ? TypeStrategies.IS_NULL_BYTE : 
TypeStrategies.IS_NOT_NULL_BYTE);
     VByte.writeInt(scratch, numWritten);
     VByte.writeInt(scratch, Ints.checkedCast(headerOut.size() + 
valuesOut.size()));
     scratch.flip();
diff --git 
a/processing/src/test/java/org/apache/druid/guice/StartupInjectorBuilderTest.java
 
b/processing/src/test/java/org/apache/druid/guice/StartupInjectorBuilderTest.java
index bcf85742c2a..28a8085edcd 100644
--- 
a/processing/src/test/java/org/apache/druid/guice/StartupInjectorBuilderTest.java
+++ 
b/processing/src/test/java/org/apache/druid/guice/StartupInjectorBuilderTest.java
@@ -20,7 +20,6 @@
 package org.apache.druid.guice;
 
 import com.google.inject.Injector;
-import org.apache.druid.common.config.NullValueHandlingConfig;
 import org.apache.druid.error.ExceptionMatcher;
 import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.java.util.common.StringUtils;
@@ -147,7 +146,7 @@ public class StartupInjectorBuilderTest
   public void testValidator()
   {
     final Properties propsDefaultValueMode = new Properties();
-    
propsDefaultValueMode.put(NullValueHandlingConfig.NULL_HANDLING_CONFIG_STRING, 
"true");
+    
propsDefaultValueMode.put(StartupInjectorBuilder.NULL_HANDLING_CONFIG_STRING, 
"true");
 
     Throwable t = Assert.assertThrows(
         ISE.class,
@@ -164,7 +163,7 @@ public class StartupInjectorBuilderTest
     );
 
     final Properties propsNo3vl = new Properties();
-    propsNo3vl.put(NullValueHandlingConfig.THREE_VALUE_LOGIC_CONFIG_STRING, 
"false");
+    propsNo3vl.put(StartupInjectorBuilder.THREE_VALUE_LOGIC_CONFIG_STRING, 
"false");
     t = Assert.assertThrows(
         ISE.class,
         () -> new StartupInjectorBuilder().withExtensions()
diff --git 
a/processing/src/test/java/org/apache/druid/query/aggregation/any/NumericAnyVectorAggregatorTest.java
 
b/processing/src/test/java/org/apache/druid/query/aggregation/any/NumericAnyVectorAggregatorTest.java
index 76b670aac1a..e9c60d35a51 100644
--- 
a/processing/src/test/java/org/apache/druid/query/aggregation/any/NumericAnyVectorAggregatorTest.java
+++ 
b/processing/src/test/java/org/apache/druid/query/aggregation/any/NumericAnyVectorAggregatorTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.druid.query.aggregation.any;
 
-import org.apache.druid.common.config.NullHandling;
+import org.apache.druid.segment.column.TypeStrategies;
 import org.apache.druid.segment.vector.VectorValueSelector;
 import org.apache.druid.testing.InitializedNullHandlingTest;
 import org.junit.Assert;
@@ -95,7 +95,7 @@ public class NumericAnyVectorAggregatorTest extends 
InitializedNullHandlingTest
     target.init(buf, POSITION);
     Assert.assertEquals(0, buf.get(POSITION) & BYTE_FLAG_FOUND_MASK);
     Assert.assertEquals(
-        NullHandling.IS_NULL_BYTE,
+        TypeStrategies.IS_NULL_BYTE,
         buf.get(POSITION)
     );
   }
@@ -104,14 +104,14 @@ public class NumericAnyVectorAggregatorTest extends 
InitializedNullHandlingTest
   public void aggregateNotFoundAndHasNullsShouldPutNull()
   {
     target.aggregate(buf, POSITION, 0, 3);
-    Assert.assertEquals(BYTE_FLAG_FOUND_MASK | NullHandling.IS_NULL_BYTE, 
buf.get(POSITION));
+    Assert.assertEquals(BYTE_FLAG_FOUND_MASK | TypeStrategies.IS_NULL_BYTE, 
buf.get(POSITION));
   }
 
   @Test
   public void aggregateNotFoundAndHasNullsOutsideRangeShouldPutValue()
   {
     target.aggregate(buf, POSITION, 0, 1);
-    Assert.assertEquals(BYTE_FLAG_FOUND_MASK | NullHandling.IS_NOT_NULL_BYTE, 
buf.get(POSITION));
+    Assert.assertEquals(BYTE_FLAG_FOUND_MASK | 
TypeStrategies.IS_NOT_NULL_BYTE, buf.get(POSITION));
   }
 
   @Test
@@ -119,7 +119,7 @@ public class NumericAnyVectorAggregatorTest extends 
InitializedNullHandlingTest
   {
     Mockito.doReturn(null).when(selector).getNullVector();
     target.aggregate(buf, POSITION, 0, 3);
-    Assert.assertEquals(BYTE_FLAG_FOUND_MASK | NullHandling.IS_NOT_NULL_BYTE, 
buf.get(POSITION));
+    Assert.assertEquals(BYTE_FLAG_FOUND_MASK | 
TypeStrategies.IS_NOT_NULL_BYTE, buf.get(POSITION));
   }
 
   @Test
@@ -141,8 +141,8 @@ public class NumericAnyVectorAggregatorTest extends 
InitializedNullHandlingTest
     for (int i = 0; i < positions.length; i++) {
       int position = positions[i] + positionOffset;
       Assert.assertEquals(
-          BYTE_FLAG_FOUND_MASK | NullHandling.IS_NOT_NULL_BYTE,
-          buf.get(position) & (byte) (BYTE_FLAG_FOUND_MASK | 
NullHandling.IS_NOT_NULL_BYTE)
+          BYTE_FLAG_FOUND_MASK | TypeStrategies.IS_NOT_NULL_BYTE,
+          buf.get(position) & (byte) (BYTE_FLAG_FOUND_MASK | 
TypeStrategies.IS_NOT_NULL_BYTE)
       );
       Assert.assertEquals(i, buf.getLong(position + 1));
     }
@@ -160,8 +160,8 @@ public class NumericAnyVectorAggregatorTest extends 
InitializedNullHandlingTest
     for (int i = 0; i < positions.length; i++) {
       int position = positions[i] + positionOffset;
       Assert.assertEquals(
-          BYTE_FLAG_FOUND_MASK | NullHandling.IS_NOT_NULL_BYTE,
-          buf.get(position) & (byte) (BYTE_FLAG_FOUND_MASK | 
NullHandling.IS_NOT_NULL_BYTE)
+          BYTE_FLAG_FOUND_MASK | TypeStrategies.IS_NOT_NULL_BYTE,
+          buf.get(position) & (byte) (BYTE_FLAG_FOUND_MASK | 
TypeStrategies.IS_NOT_NULL_BYTE)
       );
       Assert.assertEquals(rows[i], buf.getLong(position + 1));
     }
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/BaseCalciteQueryTest.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/BaseCalciteQueryTest.java
index 61dc44a6771..52605f04dce 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/BaseCalciteQueryTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/BaseCalciteQueryTest.java
@@ -28,7 +28,6 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.ByteStreams;
 import org.apache.commons.text.StringEscapeUtils;
-import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.error.DruidException;
 import org.apache.druid.error.DruidException.Category;
 import org.apache.druid.error.DruidException.Persona;
@@ -1017,9 +1016,6 @@ public class BaseCalciteQueryTest extends CalciteTestBase
     }
   }
 
-  /**
-   * Validates the results with slight loosening in case {@link NullHandling} 
is not sql compatible.
-   */
   public void assertResultsValid(final ResultMatchMode matchMode, final 
List<Object[]> expected, final QueryResults queryResults)
   {
     final List<Object[]> results = queryResults.results;


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


Reply via email to