From 0866c37eb9127457f15612a0099ac472a884ffbc Mon Sep 17 00:00:00 2001
From: Xiang Fu <xiangfu@apache.org>
Date: Sun, 2 Aug 2026 14:44:44 -0700
Subject: [PATCH 1/3] Address review feedback from the deprecation-removal PRs

Follow-ups to the review comments on #19139 and #19142. No API is removed
here; this is cleanup of loose ends left by those PRs plus one bug fix.

- Drop the now-redundant (List<IndexType>) null casts at FieldConfig call
  sites. Those casts existed only to disambiguate the singular-IndexType
  5-arg constructor from the List one; #19139 removes the former, so bare
  null now resolves unambiguously. Also drops the java.util.List import in
  AvgAggregationFunctionTest, which is unused once the casts are gone.

- GET /tables/livebrokers mapped every exception to 404 NOT_FOUND while
  declaring only 200 and 500. getTableToLiveBrokersMapping filters unknown
  tables rather than reporting them, so nothing it throws is a lookup miss:
  a missing broker ExternalView surfaces as IllegalStateException and was
  being reported to clients as "not found", and the documented 500 was
  unreachable. Map to INTERNAL_SERVER_ERROR and keep the cause.

- MaterializedViewTaskExecutorFactory fell back to an empty PinotConfiguration
  when _minionConf was null. Once #19139 removes the deprecated 1-arg init,
  _minionConf is always set, so the branch is dead; if it were ever reached it
  would silently build a plaintext gRPC client with default limits instead of
  the configured TLS one. Replaced with a Preconditions check.
---
 .../api/resources/PinotTableInstances.java          |  4 +++-
 .../function/AvgAggregationFunctionTest.java        |  7 +++----
 .../MaterializedViewTaskExecutorFactory.java        | 13 +++++++------
 .../local/utils/IndexCombinationValidationTest.java | 12 ++++++------
 .../spi/config/table/OpenStructIndexConfigTest.java |  6 +++---
 5 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotTableInstances.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotTableInstances.java
index 1d2c9fb2aff3..0a7a34e2d15a 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotTableInstances.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotTableInstances.java
@@ -172,7 +172,9 @@ public Map<String, List<InstanceInfo>> getLiveBrokers(@Context HttpHeaders heade
     try {
       return _pinotHelixResourceManager.getTableToLiveBrokersMapping(headers.getHeaderString(DATABASE), tables);
     } catch (Exception e) {
-      throw new ControllerApplicationException(LOGGER, e.getMessage(), Response.Status.NOT_FOUND);
+      // Unknown tables are filtered out rather than reported, so anything thrown here (e.g. a missing broker
+      // ExternalView) is a server-side failure, not a lookup miss.
+      throw new ControllerApplicationException(LOGGER, e.getMessage(), Response.Status.INTERNAL_SERVER_ERROR, e);
     }
   }
 
diff --git a/pinot-core/src/test/java/org/apache/pinot/core/query/aggregation/function/AvgAggregationFunctionTest.java b/pinot-core/src/test/java/org/apache/pinot/core/query/aggregation/function/AvgAggregationFunctionTest.java
index 3e3dbc4faf56..652c901dc050 100644
--- a/pinot-core/src/test/java/org/apache/pinot/core/query/aggregation/function/AvgAggregationFunctionTest.java
+++ b/pinot-core/src/test/java/org/apache/pinot/core/query/aggregation/function/AvgAggregationFunctionTest.java
@@ -18,7 +18,6 @@
  */
 package org.apache.pinot.core.query.aggregation.function;
 
-import java.util.List;
 import org.apache.pinot.queries.FluentQueryTest;
 import org.apache.pinot.spi.config.table.FieldConfig;
 import org.apache.pinot.spi.config.table.TableType;
@@ -197,7 +196,7 @@ void singleKeyAggregationWithSmallNumGroupsLimitDoesntThrowAIOOBE(FieldConfig.En
             new TableConfigBuilder(TableType.OFFLINE)
                 .setTableName("testTable")
                 .addFieldConfig(
-                    new FieldConfig("key", encoding, (List<FieldConfig.IndexType>) null, PASS_THROUGH, null))
+                    new FieldConfig("key", encoding, null, PASS_THROUGH, null))
                 .build())
         .onFirstInstance(new Object[]{7, 1}, new Object[]{6, 2}, new Object[]{5, 3}, new Object[]{4, 4})
         .andOnSecondInstance(new Object[]{7, 1}, new Object[]{6, 2}, new Object[]{5, 3}, new Object[]{4, 4})
@@ -229,9 +228,9 @@ void multiKeyAggregationWithSmallNumGroupsLimitDoesntThrowAIOOBE(FieldConfig.Enc
             new TableConfigBuilder(TableType.OFFLINE)
                 .setTableName("testTable")
                 .addFieldConfig(
-                    new FieldConfig("key1", encoding, (List<FieldConfig.IndexType>) null, PASS_THROUGH, null))
+                    new FieldConfig("key1", encoding, null, PASS_THROUGH, null))
                 .addFieldConfig(
-                    new FieldConfig("key2", encoding, (List<FieldConfig.IndexType>) null, PASS_THROUGH, null))
+                    new FieldConfig("key2", encoding, null, PASS_THROUGH, null))
                 .build())
         .onFirstInstance(new Object[]{7, 1}, new Object[]{6, 2}, new Object[]{5, 3}, new Object[]{4, 4})
         .andOnSecondInstance(new Object[]{7, 1}, new Object[]{6, 2}, new Object[]{5, 3}, new Object[]{4, 4})
diff --git a/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/main/java/org/apache/pinot/plugin/minion/tasks/materializedview/MaterializedViewTaskExecutorFactory.java b/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/main/java/org/apache/pinot/plugin/minion/tasks/materializedview/MaterializedViewTaskExecutorFactory.java
index bf9a5a1a1e0a..ecf123f4972c 100644
--- a/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/main/java/org/apache/pinot/plugin/minion/tasks/materializedview/MaterializedViewTaskExecutorFactory.java
+++ b/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/main/java/org/apache/pinot/plugin/minion/tasks/materializedview/MaterializedViewTaskExecutorFactory.java
@@ -18,6 +18,7 @@
  */
 package org.apache.pinot.plugin.minion.tasks.materializedview;
 
+import com.google.common.base.Preconditions;
 import org.apache.pinot.common.config.GrpcConfig;
 import org.apache.pinot.materializedview.executor.GrpcMaterializedViewQueryExecutor;
 import org.apache.pinot.materializedview.executor.MaterializedViewQueryExecutor;
@@ -65,12 +66,12 @@ public PinotTaskExecutor create() {
           // Build the gRPC client config from the minion's own configuration, scoped to the
           // MaterializedViewTask.MINION_BROKER_GRPC_CONFIG_PREFIX prefix.  This is how operators
           // enable TLS, raise the max inbound message size for large MV result sets, and tune
-          // keepalive.  Falling back to an empty configuration (no TLS, defaults) when no
-          // MinionConf was provided — fine for local tests but production deployments should
-          // initialize the factory with a MinionConf.
-          PinotConfiguration grpcClientConfig = _minionConf != null
-              ? _minionConf.subset(MaterializedViewTask.MINION_BROKER_GRPC_CONFIG_PREFIX)
-              : new PinotConfiguration();
+          // keepalive.  Defaulting silently would build a plaintext client with default limits,
+          // so fail loudly instead.
+          Preconditions.checkState(_minionConf != null,
+              "MinionConf is not set; init(zkMetadataManager, minionConf) must be called before create()");
+          PinotConfiguration grpcClientConfig =
+              _minionConf.subset(MaterializedViewTask.MINION_BROKER_GRPC_CONFIG_PREFIX);
           _queryExecutor = new GrpcMaterializedViewQueryExecutor(
               MinionContext.getInstance().getHelixManager(),
               new GrpcConfig(grpcClientConfig));
diff --git a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/utils/IndexCombinationValidationTest.java b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/utils/IndexCombinationValidationTest.java
index 50f6aa7b7842..e7550d24eadd 100644
--- a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/utils/IndexCombinationValidationTest.java
+++ b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/utils/IndexCombinationValidationTest.java
@@ -458,7 +458,7 @@ public void testForwardIndexDisabledWithDictAndInvertedPasses() {
 
   @Test
   public void testRawWithLz4CodecPasses() {
-    FieldConfig fc = new FieldConfig(STR_COL, EncodingType.RAW, (List<IndexType>) null, CompressionCodec.LZ4, null);
+    FieldConfig fc = new FieldConfig(STR_COL, EncodingType.RAW, null, CompressionCodec.LZ4, null);
     TableConfig tc = new TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
         .setNoDictionaryColumns(List.of(STR_COL))
         .setFieldConfigList(List.of(fc))
@@ -468,7 +468,7 @@ public void testRawWithLz4CodecPasses() {
 
   @Test
   public void testRawWithSnappyCodecPasses() {
-    FieldConfig fc = new FieldConfig(STR_COL, EncodingType.RAW, (List<IndexType>) null, CompressionCodec.SNAPPY, null);
+    FieldConfig fc = new FieldConfig(STR_COL, EncodingType.RAW, null, CompressionCodec.SNAPPY, null);
     TableConfig tc = new TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
         .setNoDictionaryColumns(List.of(STR_COL))
         .setFieldConfigList(List.of(fc))
@@ -479,7 +479,7 @@ public void testRawWithSnappyCodecPasses() {
   @Test
   public void testRawWithZstdCodecPasses() {
     FieldConfig fc =
-        new FieldConfig(STR_COL, EncodingType.RAW, (List<IndexType>) null, CompressionCodec.ZSTANDARD, null);
+        new FieldConfig(STR_COL, EncodingType.RAW, null, CompressionCodec.ZSTANDARD, null);
     TableConfig tc = new TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
         .setNoDictionaryColumns(List.of(STR_COL))
         .setFieldConfigList(List.of(fc))
@@ -490,7 +490,7 @@ public void testRawWithZstdCodecPasses() {
   @Test
   public void testRawWithClpCodecStringColumnPasses() {
     // CLP codecs are valid for raw STRING columns
-    FieldConfig fc = new FieldConfig(STR_COL, EncodingType.RAW, (List<IndexType>) null, CompressionCodec.CLP, null);
+    FieldConfig fc = new FieldConfig(STR_COL, EncodingType.RAW, null, CompressionCodec.CLP, null);
     TableConfig tc = new TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
         .setNoDictionaryColumns(List.of(STR_COL))
         .setFieldConfigList(List.of(fc))
@@ -501,7 +501,7 @@ public void testRawWithClpCodecStringColumnPasses() {
   @Test
   public void testRawWithClpCodecNonStringColumnFails() {
     // CLP is only valid on STRING stored type
-    FieldConfig fc = new FieldConfig(INT_COL, EncodingType.RAW, (List<IndexType>) null, CompressionCodec.CLP, null);
+    FieldConfig fc = new FieldConfig(INT_COL, EncodingType.RAW, null, CompressionCodec.CLP, null);
     TableConfig tc = new TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
         .setNoDictionaryColumns(List.of(INT_COL))
         .setFieldConfigList(List.of(fc))
@@ -513,7 +513,7 @@ public void testRawWithClpCodecNonStringColumnFails() {
   public void testDeltaDeltaCodecNonNumericColumnFails() {
     // DELTADELTA only valid on INT/LONG columns
     FieldConfig fc =
-        new FieldConfig(STR_COL, EncodingType.RAW, (List<IndexType>) null, CompressionCodec.DELTADELTA, null);
+        new FieldConfig(STR_COL, EncodingType.RAW, null, CompressionCodec.DELTADELTA, null);
     TableConfig tc = new TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
         .setNoDictionaryColumns(List.of(STR_COL))
         .setFieldConfigList(List.of(fc))
diff --git a/pinot-spi/src/test/java/org/apache/pinot/spi/config/table/OpenStructIndexConfigTest.java b/pinot-spi/src/test/java/org/apache/pinot/spi/config/table/OpenStructIndexConfigTest.java
index 43a71a4dc2b0..f1144955ebb7 100644
--- a/pinot-spi/src/test/java/org/apache/pinot/spi/config/table/OpenStructIndexConfigTest.java
+++ b/pinot-spi/src/test/java/org/apache/pinot/spi/config/table/OpenStructIndexConfigTest.java
@@ -55,7 +55,7 @@ public void testDisabledConfig() {
   @Test
   public void testNoDictionaryKeys() {
     FieldConfig rawKey =
-        new FieldConfig("raw_payload", FieldConfig.EncodingType.RAW, (List<FieldConfig.IndexType>) null, null, null);
+        new FieldConfig("raw_payload", FieldConfig.EncodingType.RAW, null, null, null);
     OpenStructIndexConfig config = new OpenStructIndexConfig(false, null, 1000, null, 0.5, List.of(rawKey));
     assertFalse(config.shouldUseDictionaryForKey("raw_payload"));
     // Unconfigured key falls back to built-in default (DICTIONARY).
@@ -126,9 +126,9 @@ public void testDefaultValueFieldConfigRawEncoding()
   @Test
   public void testShouldUseDictionaryForKeyHardOverride() {
     FieldConfig blob =
-        new FieldConfig("blob", FieldConfig.EncodingType.RAW, (List<FieldConfig.IndexType>) null, null, null);
+        new FieldConfig("blob", FieldConfig.EncodingType.RAW, null, null, null);
     FieldConfig rawPayload =
-        new FieldConfig("raw_payload", FieldConfig.EncodingType.RAW, (List<FieldConfig.IndexType>) null, null, null);
+        new FieldConfig("raw_payload", FieldConfig.EncodingType.RAW, null, null, null);
     OpenStructIndexConfig config = new OpenStructIndexConfig(false, null, 1000, null, 0.5, List.of(blob, rawPayload));
     assertFalse(config.shouldUseDictionaryForKey("blob"));
     assertFalse(config.shouldUseDictionaryForKey("raw_payload"));

From fa287ecdc287b7ac577a14a4fa91d75b827dc76d Mon Sep 17 00:00:00 2001
From: Xiang Fu <xiangfu@apache.org>
Date: Sun, 2 Aug 2026 15:39:00 -0700
Subject: [PATCH 2/3] Address review feedback: validate both init fields, use a
 stable 500 message

- MaterializedViewTaskExecutorFactory: also validate _zkMetadataManager,
  which create() passes straight into MaterializedViewTaskExecutor and which
  is null if the factory is used before init(). Both checks moved to the top
  of create() so they run on every call; inside the lazy-init block they were
  skipped once _queryExecutor had been built.

- PinotTableInstances: e.getMessage() is null for many exceptions, which would
  produce an empty message in both the log line and the 500 response body. Use
  a stable contextual message and let the attached cause carry the detail.
---
 .../api/resources/PinotTableInstances.java          |  6 ++++--
 .../MaterializedViewTaskExecutorFactory.java        | 13 ++++++++-----
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotTableInstances.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotTableInstances.java
index 0a7a34e2d15a..51b9dd2e61b7 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotTableInstances.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotTableInstances.java
@@ -173,8 +173,10 @@ public Map<String, List<InstanceInfo>> getLiveBrokers(@Context HttpHeaders heade
       return _pinotHelixResourceManager.getTableToLiveBrokersMapping(headers.getHeaderString(DATABASE), tables);
     } catch (Exception e) {
       // Unknown tables are filtered out rather than reported, so anything thrown here (e.g. a missing broker
-      // ExternalView) is a server-side failure, not a lookup miss.
-      throw new ControllerApplicationException(LOGGER, e.getMessage(), Response.Status.INTERNAL_SERVER_ERROR, e);
+      // ExternalView) is a server-side failure, not a lookup miss. Use a stable message since the cause may
+      // carry none, and let the attached cause supply the detail in the logs.
+      throw new ControllerApplicationException(LOGGER, "Failed to get table to live brokers mapping",
+          Response.Status.INTERNAL_SERVER_ERROR, e);
     }
   }
 
diff --git a/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/main/java/org/apache/pinot/plugin/minion/tasks/materializedview/MaterializedViewTaskExecutorFactory.java b/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/main/java/org/apache/pinot/plugin/minion/tasks/materializedview/MaterializedViewTaskExecutorFactory.java
index ecf123f4972c..483d4546d303 100644
--- a/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/main/java/org/apache/pinot/plugin/minion/tasks/materializedview/MaterializedViewTaskExecutorFactory.java
+++ b/pinot-plugins/pinot-minion-tasks/pinot-minion-builtin-tasks/src/main/java/org/apache/pinot/plugin/minion/tasks/materializedview/MaterializedViewTaskExecutorFactory.java
@@ -60,16 +60,19 @@ public String getTaskType() {
 
   @Override
   public PinotTaskExecutor create() {
+    // Validated on every call rather than only on the first: without a MinionConf we would silently build a
+    // plaintext gRPC client with default limits instead of the configured one, and without a metadata manager
+    // we would hand a null straight to the executor.
+    Preconditions.checkState(_zkMetadataManager != null,
+        "MinionTaskZkMetadataManager is not set; init(zkMetadataManager, minionConf) must be called before create()");
+    Preconditions.checkState(_minionConf != null,
+        "MinionConf is not set; init(zkMetadataManager, minionConf) must be called before create()");
     if (_queryExecutor == null) {
       synchronized (this) {
         if (_queryExecutor == null) {
           // Build the gRPC client config from the minion's own configuration, scoped to the
           // MaterializedViewTask.MINION_BROKER_GRPC_CONFIG_PREFIX prefix.  This is how operators
-          // enable TLS, raise the max inbound message size for large MV result sets, and tune
-          // keepalive.  Defaulting silently would build a plaintext client with default limits,
-          // so fail loudly instead.
-          Preconditions.checkState(_minionConf != null,
-              "MinionConf is not set; init(zkMetadataManager, minionConf) must be called before create()");
+          // enable TLS, raise the max inbound message size for large MV result sets, and tune keepalive.
           PinotConfiguration grpcClientConfig =
               _minionConf.subset(MaterializedViewTask.MINION_BROKER_GRPC_CONFIG_PREFIX);
           _queryExecutor = new GrpcMaterializedViewQueryExecutor(

From 5f3ca4c22c6bc8fe9373a3b674323d0eb0456d8a Mon Sep 17 00:00:00 2001
From: Xiang Fu <xiangfu@apache.org>
Date: Sun, 2 Aug 2026 17:09:48 -0700
Subject: [PATCH 3/3] Collapse FieldConfig call sites onto one line now that
 the casts are gone

Removing the (List<IndexType>) null casts shortened these statements enough
to fit within the 120-char limit, so the line wrapping they needed is now
just noise. Applies to IndexCombinationValidationTest, OpenStructIndexConfigTest
and AvgAggregationFunctionTest.
---
 .../aggregation/function/AvgAggregationFunctionTest.java | 9 +++------
 .../local/utils/IndexCombinationValidationTest.java      | 6 ++----
 .../spi/config/table/OpenStructIndexConfigTest.java      | 9 +++------
 3 files changed, 8 insertions(+), 16 deletions(-)

diff --git a/pinot-core/src/test/java/org/apache/pinot/core/query/aggregation/function/AvgAggregationFunctionTest.java b/pinot-core/src/test/java/org/apache/pinot/core/query/aggregation/function/AvgAggregationFunctionTest.java
index 652c901dc050..9302073597fc 100644
--- a/pinot-core/src/test/java/org/apache/pinot/core/query/aggregation/function/AvgAggregationFunctionTest.java
+++ b/pinot-core/src/test/java/org/apache/pinot/core/query/aggregation/function/AvgAggregationFunctionTest.java
@@ -195,8 +195,7 @@ void singleKeyAggregationWithSmallNumGroupsLimitDoesntThrowAIOOBE(FieldConfig.En
                 .build(),
             new TableConfigBuilder(TableType.OFFLINE)
                 .setTableName("testTable")
-                .addFieldConfig(
-                    new FieldConfig("key", encoding, null, PASS_THROUGH, null))
+                .addFieldConfig(new FieldConfig("key", encoding, null, PASS_THROUGH, null))
                 .build())
         .onFirstInstance(new Object[]{7, 1}, new Object[]{6, 2}, new Object[]{5, 3}, new Object[]{4, 4})
         .andOnSecondInstance(new Object[]{7, 1}, new Object[]{6, 2}, new Object[]{5, 3}, new Object[]{4, 4})
@@ -227,10 +226,8 @@ void multiKeyAggregationWithSmallNumGroupsLimitDoesntThrowAIOOBE(FieldConfig.Enc
                 .build(),
             new TableConfigBuilder(TableType.OFFLINE)
                 .setTableName("testTable")
-                .addFieldConfig(
-                    new FieldConfig("key1", encoding, null, PASS_THROUGH, null))
-                .addFieldConfig(
-                    new FieldConfig("key2", encoding, null, PASS_THROUGH, null))
+                .addFieldConfig(new FieldConfig("key1", encoding, null, PASS_THROUGH, null))
+                .addFieldConfig(new FieldConfig("key2", encoding, null, PASS_THROUGH, null))
                 .build())
         .onFirstInstance(new Object[]{7, 1}, new Object[]{6, 2}, new Object[]{5, 3}, new Object[]{4, 4})
         .andOnSecondInstance(new Object[]{7, 1}, new Object[]{6, 2}, new Object[]{5, 3}, new Object[]{4, 4})
diff --git a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/utils/IndexCombinationValidationTest.java b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/utils/IndexCombinationValidationTest.java
index e7550d24eadd..b2fb2c5b5cfc 100644
--- a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/utils/IndexCombinationValidationTest.java
+++ b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/utils/IndexCombinationValidationTest.java
@@ -478,8 +478,7 @@ public void testRawWithSnappyCodecPasses() {
 
   @Test
   public void testRawWithZstdCodecPasses() {
-    FieldConfig fc =
-        new FieldConfig(STR_COL, EncodingType.RAW, null, CompressionCodec.ZSTANDARD, null);
+    FieldConfig fc = new FieldConfig(STR_COL, EncodingType.RAW, null, CompressionCodec.ZSTANDARD, null);
     TableConfig tc = new TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
         .setNoDictionaryColumns(List.of(STR_COL))
         .setFieldConfigList(List.of(fc))
@@ -512,8 +511,7 @@ public void testRawWithClpCodecNonStringColumnFails() {
   @Test
   public void testDeltaDeltaCodecNonNumericColumnFails() {
     // DELTADELTA only valid on INT/LONG columns
-    FieldConfig fc =
-        new FieldConfig(STR_COL, EncodingType.RAW, null, CompressionCodec.DELTADELTA, null);
+    FieldConfig fc = new FieldConfig(STR_COL, EncodingType.RAW, null, CompressionCodec.DELTADELTA, null);
     TableConfig tc = new TableConfigBuilder(TableType.OFFLINE).setTableName(TABLE_NAME)
         .setNoDictionaryColumns(List.of(STR_COL))
         .setFieldConfigList(List.of(fc))
diff --git a/pinot-spi/src/test/java/org/apache/pinot/spi/config/table/OpenStructIndexConfigTest.java b/pinot-spi/src/test/java/org/apache/pinot/spi/config/table/OpenStructIndexConfigTest.java
index f1144955ebb7..908dc7257216 100644
--- a/pinot-spi/src/test/java/org/apache/pinot/spi/config/table/OpenStructIndexConfigTest.java
+++ b/pinot-spi/src/test/java/org/apache/pinot/spi/config/table/OpenStructIndexConfigTest.java
@@ -54,8 +54,7 @@ public void testDisabledConfig() {
 
   @Test
   public void testNoDictionaryKeys() {
-    FieldConfig rawKey =
-        new FieldConfig("raw_payload", FieldConfig.EncodingType.RAW, null, null, null);
+    FieldConfig rawKey = new FieldConfig("raw_payload", FieldConfig.EncodingType.RAW, null, null, null);
     OpenStructIndexConfig config = new OpenStructIndexConfig(false, null, 1000, null, 0.5, List.of(rawKey));
     assertFalse(config.shouldUseDictionaryForKey("raw_payload"));
     // Unconfigured key falls back to built-in default (DICTIONARY).
@@ -125,10 +124,8 @@ public void testDefaultValueFieldConfigRawEncoding()
 
   @Test
   public void testShouldUseDictionaryForKeyHardOverride() {
-    FieldConfig blob =
-        new FieldConfig("blob", FieldConfig.EncodingType.RAW, null, null, null);
-    FieldConfig rawPayload =
-        new FieldConfig("raw_payload", FieldConfig.EncodingType.RAW, null, null, null);
+    FieldConfig blob = new FieldConfig("blob", FieldConfig.EncodingType.RAW, null, null, null);
+    FieldConfig rawPayload = new FieldConfig("raw_payload", FieldConfig.EncodingType.RAW, null, null, null);
     OpenStructIndexConfig config = new OpenStructIndexConfig(false, null, 1000, null, 0.5, List.of(blob, rawPayload));
     assertFalse(config.shouldUseDictionaryForKey("blob"));
     assertFalse(config.shouldUseDictionaryForKey("raw_payload"));
