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

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

commit ff4843f21b4e864c19a0a81561ae053bbaec6c4b
Author: Tian Jiang <[email protected]>
AuthorDate: Mon Jul 20 12:05:36 2026 +0800

    refactor castFromSingleValue
---
 .../java/org/apache/tsfile/enums/TSDataType.java   | 229 +++++++++------------
 1 file changed, 102 insertions(+), 127 deletions(-)

diff --git a/java/common/src/main/java/org/apache/tsfile/enums/TSDataType.java 
b/java/common/src/main/java/org/apache/tsfile/enums/TSDataType.java
index f97291046..3e39ad6b7 100644
--- a/java/common/src/main/java/org/apache/tsfile/enums/TSDataType.java
+++ b/java/common/src/main/java/org/apache/tsfile/enums/TSDataType.java
@@ -39,45 +39,47 @@ import java.util.Set;
 
 public enum TSDataType {
   /** BOOLEAN. */
-  BOOLEAN((byte) 0),
+  BOOLEAN((byte) 0, TSDataType::castIdenticalSingleValue),
 
   /** INT32. */
-  INT32((byte) 1),
+  INT32((byte) 1, TSDataType::castIdenticalSingleValue),
 
   /** INT64. */
-  INT64((byte) 2),
+  INT64((byte) 2, TSDataType::castToLongSingleValue),
 
   /** FLOAT. */
-  FLOAT((byte) 3),
+  FLOAT((byte) 3, TSDataType::castToFloatSingleValue),
 
   /** DOUBLE. */
-  DOUBLE((byte) 4),
+  DOUBLE((byte) 4, TSDataType::castToDoubleSingleValue),
 
   /** TEXT. */
-  TEXT((byte) 5),
+  TEXT((byte) 5, TSDataType::castToTextSingleValue),
 
   /** VECTOR. */
-  VECTOR((byte) 6),
+  VECTOR((byte) 6, TSDataType::unsupportedSingleValueCast),
 
   /** UNKNOWN. */
-  UNKNOWN((byte) 7),
+  UNKNOWN((byte) 7, TSDataType::unsupportedSingleValueCast),
 
   /** TIMESTAMP. */
-  TIMESTAMP((byte) 8),
+  TIMESTAMP((byte) 8, TSDataType::castToTimestampSingleValue),
 
   /** DATE. */
-  DATE((byte) 9),
+  DATE((byte) 9, TSDataType::castIdenticalSingleValue),
 
   /** BLOB. */
-  BLOB((byte) 10),
+  BLOB((byte) 10, TSDataType::castToBlobSingleValue),
 
   /** STRING */
-  STRING((byte) 11),
+  STRING((byte) 11, TSDataType::castToTextSingleValue),
 
   /** OBJECT */
-  OBJECT((byte) 12);
+  OBJECT((byte) 12, TSDataType::castIdenticalSingleValue);
 
+  private static final Object UNSUPPORTED_CAST = new Object();
   private final byte type;
+  private final SingleValueCaster singleValueCaster;
   private static final Map<TSDataType, Set<TSDataType>> compatibleTypes;
 
   static {
@@ -147,8 +149,9 @@ public enum TSDataType {
     compatibleTypes.put(OBJECT, Collections.emptySet());
   }
 
-  TSDataType(byte type) {
+  TSDataType(byte type, SingleValueCaster singleValueCaster) {
     this.type = type;
+    this.singleValueCaster = singleValueCaster;
   }
 
   /**
@@ -211,124 +214,90 @@ public enum TSDataType {
     if (Objects.isNull(value)) {
       return null;
     }
-    switch (this) {
-      case BOOLEAN:
-        if (sourceType == TSDataType.BOOLEAN) {
-          return value;
-        } else {
-          break;
-        }
-      case INT32:
-        if (sourceType == TSDataType.INT32) {
-          return value;
-        } else {
-          break;
-        }
-      case INT64:
-        if (sourceType == TSDataType.INT64) {
-          return value;
-        } else if (sourceType == INT32) {
-          return (long) ((int) value);
-        } else if (sourceType == TIMESTAMP) {
-          return value;
-        } else {
-          break;
-        }
-      case FLOAT:
-        if (sourceType == TSDataType.FLOAT) {
-          return value;
-        } else if (sourceType == INT32) {
-          return (float) ((int) value);
-        } else {
-          break;
-        }
-      case DOUBLE:
-        if (sourceType == TSDataType.DOUBLE) {
-          return value;
-        } else if (sourceType == INT32) {
-          return (double) ((int) value);
-        } else if (sourceType == INT64) {
-          return (double) ((long) value);
-        } else if (sourceType == FLOAT) {
-          return (double) ((float) value);
-        } else if (sourceType == TIMESTAMP) {
-          return (double) ((long) value);
-        } else {
-          break;
-        }
-      case TEXT:
-        if (sourceType == TSDataType.TEXT || sourceType == TSDataType.STRING) {
-          return value;
-        } else if (sourceType == TSDataType.INT32
-            || sourceType == TSDataType.INT64
-            || sourceType == TSDataType.FLOAT
-            || sourceType == TSDataType.DOUBLE
-            || sourceType == TSDataType.BOOLEAN
-            || sourceType == TSDataType.TIMESTAMP) {
-          return new Binary(String.valueOf(value), StandardCharsets.UTF_8);
-        } else if (sourceType == TSDataType.DATE) {
-          return new Binary(getDateStringValue((int) value), 
StandardCharsets.UTF_8);
-        } else if (sourceType == TSDataType.BLOB) {
-          return new Binary(value.toString(), StandardCharsets.UTF_8);
-        } else {
-          break;
-        }
-      case TIMESTAMP:
-        if (sourceType == TSDataType.TIMESTAMP) {
-          return value;
-        } else if (sourceType == INT32) {
-          return (long) ((int) value);
-        } else if (sourceType == INT64) {
-          return value;
-        } else {
-          break;
-        }
-      case DATE:
-        if (sourceType == TSDataType.DATE) {
-          return value;
-        } else {
-          break;
-        }
-      case BLOB:
-        if (sourceType == TSDataType.BLOB
-            || sourceType == TSDataType.STRING
-            || sourceType == TSDataType.TEXT) {
-          return value;
-        } else {
-          break;
-        }
-      case STRING:
-        if (sourceType == TSDataType.STRING || sourceType == TSDataType.TEXT) {
-          return value;
-        } else if (sourceType == TSDataType.INT32
-            || sourceType == TSDataType.INT64
-            || sourceType == TSDataType.FLOAT
-            || sourceType == TSDataType.DOUBLE
-            || sourceType == TSDataType.BOOLEAN
-            || sourceType == TSDataType.TIMESTAMP) {
-          return new Binary(String.valueOf(value), StandardCharsets.UTF_8);
-        } else if (sourceType == TSDataType.DATE) {
-          return new Binary(getDateStringValue((int) value), 
StandardCharsets.UTF_8);
-        } else if (sourceType == TSDataType.BLOB) {
-          return new Binary(value.toString(), StandardCharsets.UTF_8);
-        } else {
-          break;
-        }
-      case OBJECT:
-        if (sourceType == TSDataType.OBJECT) {
-          return value;
-        } else {
-          break;
-        }
-      case VECTOR:
-      case UNKNOWN:
-      default:
-        break;
+    Object result = singleValueCaster.cast(this, sourceType, value);
+    if (result != UNSUPPORTED_CAST) {
+      return result;
     }
     throw new ClassCastException(
         Messages.format("error.common.unsupported_cast", sourceType, this));
   }
 
+  private static Object castIdenticalSingleValue(
+      TSDataType targetType, TSDataType sourceType, Object value) {
+    return sourceType == targetType ? value : UNSUPPORTED_CAST;
+  }
+
+  private static Object castToLongSingleValue(
+      TSDataType targetType, TSDataType sourceType, Object value) {
+    if (sourceType == INT64 || sourceType == TIMESTAMP) {
+      return value;
+    }
+    return sourceType == INT32 ? (long) ((int) value) : UNSUPPORTED_CAST;
+  }
+
+  private static Object castToFloatSingleValue(
+      TSDataType targetType, TSDataType sourceType, Object value) {
+    if (sourceType == FLOAT) {
+      return value;
+    }
+    return sourceType == INT32 ? (float) ((int) value) : UNSUPPORTED_CAST;
+  }
+
+  private static Object castToDoubleSingleValue(
+      TSDataType targetType, TSDataType sourceType, Object value) {
+    if (sourceType == DOUBLE) {
+      return value;
+    }
+    if (sourceType == INT32) {
+      return (double) ((int) value);
+    }
+    if (sourceType == INT64 || sourceType == TIMESTAMP) {
+      return (double) ((long) value);
+    }
+    return sourceType == FLOAT ? (double) ((float) value) : UNSUPPORTED_CAST;
+  }
+
+  private static Object castToTextSingleValue(
+      TSDataType targetType, TSDataType sourceType, Object value) {
+    if (sourceType == TEXT || sourceType == STRING) {
+      return value;
+    }
+    if (sourceType == INT32
+        || sourceType == INT64
+        || sourceType == FLOAT
+        || sourceType == DOUBLE
+        || sourceType == BOOLEAN
+        || sourceType == TIMESTAMP) {
+      return new Binary(String.valueOf(value), StandardCharsets.UTF_8);
+    }
+    if (sourceType == DATE) {
+      return new Binary(getDateStringValue((int) value), 
StandardCharsets.UTF_8);
+    }
+    return sourceType == BLOB
+        ? new Binary(value.toString(), StandardCharsets.UTF_8)
+        : UNSUPPORTED_CAST;
+  }
+
+  private static Object castToTimestampSingleValue(
+      TSDataType targetType, TSDataType sourceType, Object value) {
+    if (sourceType == TIMESTAMP || sourceType == INT64) {
+      return value;
+    }
+    return sourceType == INT32 ? (long) ((int) value) : UNSUPPORTED_CAST;
+  }
+
+  private static Object castToBlobSingleValue(
+      TSDataType targetType, TSDataType sourceType, Object value) {
+    return sourceType == BLOB || sourceType == STRING || sourceType == TEXT
+        ? value
+        : UNSUPPORTED_CAST;
+  }
+
+  private static Object unsupportedSingleValueCast(
+      TSDataType targetType, TSDataType sourceType, Object value) {
+    return UNSUPPORTED_CAST;
+  }
+
   @SuppressWarnings({"java:S3012", "java:S3776", "java:S6541"})
   public Object castFromArray(TSDataType sourceType, Object array) {
     switch (this) {
@@ -603,4 +572,10 @@ public enum TSDataType {
   public static String getDateStringValue(int value) {
     return String.format("%04d-%02d-%02d", value / 10000, (value % 10000) / 
100, value % 100);
   }
+
+  @FunctionalInterface
+  private interface SingleValueCaster {
+
+    Object cast(TSDataType targetType, TSDataType sourceType, Object value);
+  }
 }

Reply via email to