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

jt2594838 pushed a commit to branch remove_swtich_type
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 85010f7ea887821dada25e1d5cc14038893e56e5
Author: Tian Jiang <[email protected]>
AuthorDate: Wed Aug 26 11:09:20 2026 +0800

    multiple refactors
---
 .../merge/comparator/JoinKeyComparatorFactory.java |  36 +-----
 .../calc/plan/planner/CommonOperatorUtils.java     | 129 ++-------------------
 .../org/apache/iotdb/calc/utils/TypeServices.java  |  40 +++++++
 .../apache/iotdb/calc/utils/TypeServicesTest.java  |  35 ++++++
 4 files changed, 89 insertions(+), 151 deletions(-)

diff --git 
a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/join/merge/comparator/JoinKeyComparatorFactory.java
 
b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/join/merge/comparator/JoinKeyComparatorFactory.java
index 841fe965c19..3b55c866911 100644
--- 
a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/join/merge/comparator/JoinKeyComparatorFactory.java
+++ 
b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/join/merge/comparator/JoinKeyComparatorFactory.java
@@ -19,7 +19,7 @@
 
 package org.apache.iotdb.calc.execution.operator.process.join.merge.comparator;
 
-import org.apache.iotdb.calc.i18n.CalcMessages;
+import org.apache.iotdb.calc.utils.TypeServices;
 
 import org.apache.tsfile.read.common.type.Type;
 
@@ -59,38 +59,6 @@ public class JoinKeyComparatorFactory {
   }
 
   public static JoinKeyComparator getComparator(Type type, boolean 
isAscending) {
-    switch (type.getTypeEnum()) {
-      case INT32:
-      case DATE:
-        return isAscending
-            ? AscIntTypeJoinKeyComparator.getInstance()
-            : DescIntTypeJoinKeyComparator.getInstance();
-      case INT64:
-      case TIMESTAMP:
-        return isAscending
-            ? AscLongTypeJoinKeyComparator.getInstance()
-            : DescLongTypeJoinKeyComparator.getInstance();
-      case FLOAT:
-        return isAscending
-            ? AscFloatTypeJoinKeyComparator.getInstance()
-            : DescFloatTypeJoinKeyComparator.getInstance();
-      case DOUBLE:
-        return isAscending
-            ? AscDoubleTypeJoinKeyComparator.getInstance()
-            : DescDoubleTypeJoinKeyComparator.getInstance();
-      case BOOLEAN:
-        return isAscending
-            ? AscBooleanTypeJoinKeyComparator.getInstance()
-            : DescBooleanTypeJoinKeyComparator.getInstance();
-      case STRING:
-      case BLOB:
-      case TEXT:
-        return isAscending
-            ? AscBinaryTypeJoinKeyComparator.getInstance()
-            : DescBinaryTypeJoinKeyComparator.getInstance();
-      default:
-        // other types are not supported.
-        throw new 
UnsupportedOperationException(CalcMessages.UNSUPPORTED_DATA_TYPE + type);
-    }
+    return 
TypeServices.JOIN_KEY_COMPARATOR_SERVICE.call(type).apply(isAscending);
   }
 }
diff --git 
a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/plan/planner/CommonOperatorUtils.java
 
b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/plan/planner/CommonOperatorUtils.java
index a332122b257..463c22969ce 100644
--- 
a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/plan/planner/CommonOperatorUtils.java
+++ 
b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/plan/planner/CommonOperatorUtils.java
@@ -28,33 +28,13 @@ import 
org.apache.iotdb.calc.execution.operator.process.fill.filter.MonthInterva
 import 
org.apache.iotdb.calc.execution.operator.process.fill.filter.MonthIntervalUSFillFilter;
 import 
org.apache.iotdb.calc.execution.operator.process.fill.identity.IdentityFill;
 import 
org.apache.iotdb.calc.execution.operator.process.fill.identity.IdentityLinearFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.linear.DoubleLinearFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.linear.FloatLinearFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.linear.IntLinearFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.linear.LongLinearFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.next.BinaryNextFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.next.BooleanNextFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.next.DoubleNextFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.next.FloatNextFill;
-import org.apache.iotdb.calc.execution.operator.process.fill.next.IntNextFill;
-import org.apache.iotdb.calc.execution.operator.process.fill.next.LongNextFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.BinaryPreviousFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.BinaryPreviousFillWithTimeDuration;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.BooleanPreviousFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.BooleanPreviousFillWithTimeDuration;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.DoublePreviousFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.DoublePreviousFillWithTimeDuration;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.FloatPreviousFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.FloatPreviousFillWithTimeDuration;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.IntPreviousFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.IntPreviousFillWithTimeDuration;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.LongPreviousFill;
-import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.LongPreviousFillWithTimeDuration;
 import org.apache.iotdb.calc.i18n.CalcMessages;
+import org.apache.iotdb.calc.utils.TypeServices;
 import org.apache.iotdb.commons.i18n.QueryMessages;
 
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.read.common.block.column.LongColumn;
+import org.apache.tsfile.read.common.type.Type;
 import org.apache.tsfile.utils.TimeDuration;
 
 import java.time.ZoneId;
@@ -77,31 +57,8 @@ public class CommonOperatorUtils {
   public static ILinearFill[] getLinearFill(int inputColumns, List<TSDataType> 
inputDataTypes) {
     ILinearFill[] linearFill = new ILinearFill[inputColumns];
     for (int i = 0; i < inputColumns; i++) {
-      switch (inputDataTypes.get(i)) {
-        case INT32:
-        case DATE:
-          linearFill[i] = new IntLinearFill();
-          break;
-        case INT64:
-        case TIMESTAMP:
-          linearFill[i] = new LongLinearFill();
-          break;
-        case FLOAT:
-          linearFill[i] = new FloatLinearFill();
-          break;
-        case DOUBLE:
-          linearFill[i] = new DoubleLinearFill();
-          break;
-        case BOOLEAN:
-        case TEXT:
-        case STRING:
-        case BLOB:
-        case OBJECT:
-          linearFill[i] = IDENTITY_LINEAR_FILL;
-          break;
-        default:
-          throw new IllegalArgumentException(UNKNOWN_DATATYPE + 
inputDataTypes.get(i));
-      }
+      linearFill[i] =
+          
TypeServices.LINEAR_FILL_SERVICE.call(Type.fromTsDataType(inputDataTypes.get(i))).get();
     }
     return linearFill;
   }
@@ -115,49 +72,10 @@ public class CommonOperatorUtils {
 
     IFill[] previousFill = new IFill[inputColumns];
     for (int i = 0; i < inputColumns; i++) {
-      switch (inputDataTypes.get(i)) {
-        case BOOLEAN:
-          previousFill[i] =
-              filter == null
-                  ? new BooleanPreviousFill()
-                  : new BooleanPreviousFillWithTimeDuration(filter);
-          break;
-        case TEXT:
-        case STRING:
-        case BLOB:
-        case OBJECT:
-          previousFill[i] =
-              filter == null
-                  ? new BinaryPreviousFill()
-                  : new BinaryPreviousFillWithTimeDuration(filter);
-          break;
-        case INT32:
-        case DATE:
-          previousFill[i] =
-              filter == null ? new IntPreviousFill() : new 
IntPreviousFillWithTimeDuration(filter);
-          break;
-        case INT64:
-        case TIMESTAMP:
-          previousFill[i] =
-              filter == null
-                  ? new LongPreviousFill()
-                  : new LongPreviousFillWithTimeDuration(filter);
-          break;
-        case FLOAT:
-          previousFill[i] =
-              filter == null
-                  ? new FloatPreviousFill()
-                  : new FloatPreviousFillWithTimeDuration(filter);
-          break;
-        case DOUBLE:
-          previousFill[i] =
-              filter == null
-                  ? new DoublePreviousFill()
-                  : new DoublePreviousFillWithTimeDuration(filter);
-          break;
-        default:
-          throw new IllegalArgumentException(UNKNOWN_DATATYPE + 
inputDataTypes.get(i));
-      }
+      previousFill[i] =
+          TypeServices.PREVIOUS_FILL_SERVICE
+              .call(Type.fromTsDataType(inputDataTypes.get(i)))
+              .apply(filter);
     }
     return previousFill;
   }
@@ -171,33 +89,10 @@ public class CommonOperatorUtils {
 
     ILinearFill[] nextFill = new ILinearFill[inputColumns];
     for (int i = 0; i < inputColumns; i++) {
-      switch (inputDataTypes.get(i)) {
-        case BOOLEAN:
-          nextFill[i] = new BooleanNextFill(filter);
-          break;
-        case TEXT:
-        case STRING:
-        case BLOB:
-        case OBJECT:
-          nextFill[i] = new BinaryNextFill(filter);
-          break;
-        case INT32:
-        case DATE:
-          nextFill[i] = new IntNextFill(filter);
-          break;
-        case INT64:
-        case TIMESTAMP:
-          nextFill[i] = new LongNextFill(filter);
-          break;
-        case FLOAT:
-          nextFill[i] = new FloatNextFill(filter);
-          break;
-        case DOUBLE:
-          nextFill[i] = new DoubleNextFill(filter);
-          break;
-        default:
-          throw new IllegalArgumentException(UNKNOWN_DATATYPE + 
inputDataTypes.get(i));
-      }
+      nextFill[i] =
+          TypeServices.NEXT_FILL_SERVICE
+              .call(Type.fromTsDataType(inputDataTypes.get(i)))
+              .apply(filter);
     }
     return nextFill;
   }
diff --git 
a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/utils/TypeServices.java
 
b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/utils/TypeServices.java
index 23ab14974df..705c1b02aa4 100644
--- 
a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/utils/TypeServices.java
+++ 
b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/utils/TypeServices.java
@@ -19,6 +19,45 @@
 
 package org.apache.iotdb.calc.utils;
 
+import org.apache.iotdb.calc.execution.operator.process.fill.IFill;
+import org.apache.iotdb.calc.execution.operator.process.fill.IFillFilter;
+import org.apache.iotdb.calc.execution.operator.process.fill.ILinearFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.identity.IdentityLinearFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.linear.DoubleLinearFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.linear.FloatLinearFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.linear.IntLinearFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.linear.LongLinearFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.next.BinaryNextFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.next.BooleanNextFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.next.DoubleNextFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.next.FloatNextFill;
+import org.apache.iotdb.calc.execution.operator.process.fill.next.IntNextFill;
+import org.apache.iotdb.calc.execution.operator.process.fill.next.LongNextFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.BinaryPreviousFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.BinaryPreviousFillWithTimeDuration;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.BooleanPreviousFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.BooleanPreviousFillWithTimeDuration;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.DoublePreviousFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.DoublePreviousFillWithTimeDuration;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.FloatPreviousFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.FloatPreviousFillWithTimeDuration;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.IntPreviousFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.IntPreviousFillWithTimeDuration;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.LongPreviousFill;
+import 
org.apache.iotdb.calc.execution.operator.process.fill.previous.LongPreviousFillWithTimeDuration;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.AscBinaryTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.AscBooleanTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.AscDoubleTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.AscFloatTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.AscIntTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.AscLongTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.DescBinaryTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.DescBooleanTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.DescDoubleTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.DescFloatTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.DescIntTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.DescLongTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.JoinKeyComparator;
 import 
org.apache.iotdb.calc.execution.operator.process.window.partition.Partition;
 import 
org.apache.iotdb.calc.execution.operator.process.window.utils.ColumnList;
 import 
org.apache.iotdb.calc.execution.operator.source.relational.aggregation.grouped.GroupedMaxMinByBaseAccumulator;
@@ -34,6 +73,7 @@ import org.apache.iotdb.calc.utils.datastructure.SortKey;
 import org.apache.tsfile.block.column.Column;
 import org.apache.tsfile.block.column.ColumnBuilder;
 import org.apache.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.tsfile.read.common.type.Type;
 import org.apache.tsfile.read.common.type.service.TypeService;
 import org.apache.tsfile.utils.Binary;
 import org.apache.tsfile.utils.DateUtils;
diff --git 
a/iotdb-core/calc-commons/src/test/java/org/apache/iotdb/calc/utils/TypeServicesTest.java
 
b/iotdb-core/calc-commons/src/test/java/org/apache/iotdb/calc/utils/TypeServicesTest.java
index f11222c26fe..6f5ac8a9b01 100644
--- 
a/iotdb-core/calc-commons/src/test/java/org/apache/iotdb/calc/utils/TypeServicesTest.java
+++ 
b/iotdb-core/calc-commons/src/test/java/org/apache/iotdb/calc/utils/TypeServicesTest.java
@@ -18,6 +18,9 @@
 
 package org.apache.iotdb.calc.utils;
 
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.AscIntTypeJoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.JoinKeyComparator;
+import 
org.apache.iotdb.calc.execution.operator.process.join.merge.comparator.JoinKeyComparatorFactory;
 import 
org.apache.iotdb.calc.execution.operator.process.window.partition.Partition;
 import 
org.apache.iotdb.calc.execution.operator.process.window.utils.ColumnList;
 
@@ -38,6 +41,7 @@ import java.util.Optional;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
@@ -94,6 +98,37 @@ public class TypeServicesTest {
                 .apply(0));
   }
 
+  @Test
+  public void testFillServicesUseTypeStrategies() {
+    assertNotNull(
+        
TypeServices.LINEAR_FILL_SERVICE.call(Type.fromTsDataType(TSDataType.INT32)).get());
+    assertNotNull(
+        
TypeServices.PREVIOUS_FILL_SERVICE.call(Type.fromTsDataType(TSDataType.TEXT)).apply(null));
+    assertNotNull(
+        
TypeServices.NEXT_FILL_SERVICE.call(Type.fromTsDataType(TSDataType.DOUBLE)).apply(null));
+
+    Assert.assertThrows(
+        IllegalArgumentException.class,
+        () -> 
TypeServices.LINEAR_FILL_SERVICE.call(Type.fromTsDataType(TSDataType.UNKNOWN)).get());
+    Assert.assertThrows(
+        IllegalArgumentException.class,
+        () ->
+            TypeServices.PREVIOUS_FILL_SERVICE
+                .call(Type.fromTsDataType(TSDataType.VECTOR))
+                .apply(null));
+  }
+
+  @Test
+  public void testJoinKeyComparatorServiceUsesTypeStrategies() {
+    JoinKeyComparator comparator =
+        
JoinKeyComparatorFactory.getComparator(Type.fromTsDataType(TSDataType.INT32), 
true);
+    assertSame(AscIntTypeJoinKeyComparator.getInstance(), comparator);
+
+    Assert.assertThrows(
+        UnsupportedOperationException.class,
+        () -> 
JoinKeyComparatorFactory.getComparator(Type.fromTsDataType(TSDataType.VECTOR), 
true));
+  }
+
   // Covers every supported RANGE-frame type and guards native integer 
overflow and long precision.
   @Test
   public void testRangeFrameComparatorPreservesNativeArithmetic() {

Reply via email to