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() {
