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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 660dc18f Identify original date type in the 
IntColumn、ColumnBuilder、TsInt (#680)
660dc18f is described below

commit 660dc18fae438d1b2c3a4583ac7921c42332c72e
Author: libo <[email protected]>
AuthorDate: Tue Dec 30 10:13:11 2025 +0800

    Identify original date type in the IntColumn、ColumnBuilder、TsInt (#680)
---
 .../org/apache/tsfile/utils/TsPrimitiveType.java   |  19 +-
 .../codegen/templates/FilterOperatorsTemplate.ftl  | 214 ++++++++++++++++-----
 .../tsfile/read/common/block/TsBlockBuilder.java   |  20 +-
 .../read/common/block/column/ColumnFactory.java    |   3 +-
 .../tsfile/read/common/block/column/IntColumn.java |  38 +++-
 .../read/common/block/column/IntColumnBuilder.java |  16 +-
 .../tsfile/read/reader/page/ValuePageReader.java   |  10 +-
 7 files changed, 257 insertions(+), 63 deletions(-)

diff --git 
a/java/common/src/main/java/org/apache/tsfile/utils/TsPrimitiveType.java 
b/java/common/src/main/java/org/apache/tsfile/utils/TsPrimitiveType.java
index 0538f1b3..11437f5d 100644
--- a/java/common/src/main/java/org/apache/tsfile/utils/TsPrimitiveType.java
+++ b/java/common/src/main/java/org/apache/tsfile/utils/TsPrimitiveType.java
@@ -37,8 +37,9 @@ public abstract class TsPrimitiveType implements Serializable 
{
       case BOOLEAN:
         return new TsPrimitiveType.TsBoolean();
       case INT32:
-      case DATE:
         return new TsPrimitiveType.TsInt();
+      case DATE:
+        return new TsPrimitiveType.TsInt(TSDataType.DATE);
       case INT64:
       case TIMESTAMP:
         return new TsPrimitiveType.TsLong();
@@ -69,8 +70,9 @@ public abstract class TsPrimitiveType implements Serializable 
{
       case BOOLEAN:
         return new TsPrimitiveType.TsBoolean((boolean) v);
       case INT32:
-      case DATE:
         return new TsPrimitiveType.TsInt((int) v);
+      case DATE:
+        return new TsPrimitiveType.TsInt((int) v, TSDataType.DATE);
       case INT64:
       case TIMESTAMP:
         return new TsPrimitiveType.TsLong((long) v);
@@ -260,12 +262,23 @@ public abstract class TsPrimitiveType implements 
Serializable {
 
     private int value;
 
+    private TSDataType dataType = TSDataType.INT32;
+
     public TsInt() {}
 
     public TsInt(int value) {
       this.value = value;
     }
 
+    public TsInt(TSDataType dataType) {
+      this.dataType = dataType;
+    }
+
+    public TsInt(int value, TSDataType dataType) {
+      this.value = value;
+      this.dataType = dataType;
+    }
+
     @Override
     public int getInt() {
       return value;
@@ -327,7 +340,7 @@ public abstract class TsPrimitiveType implements 
Serializable {
 
     @Override
     public TSDataType getDataType() {
-      return TSDataType.INT32;
+      return dataType;
     }
 
     @Override
diff --git a/java/tsfile/src/main/codegen/templates/FilterOperatorsTemplate.ftl 
b/java/tsfile/src/main/codegen/templates/FilterOperatorsTemplate.ftl
index 83538cf1..fcd3bb01 100644
--- a/java/tsfile/src/main/codegen/templates/FilterOperatorsTemplate.ftl
+++ b/java/tsfile/src/main/codegen/templates/FilterOperatorsTemplate.ftl
@@ -146,9 +146,9 @@ public final class ${className} {
 
     @Override
     public boolean valueSatisfy(Object value){
-      <#if filter.dataType == "boolean" || filter.javaBoxName == "String" || 
filter.javaBoxName == "Tag">
+      <#if filter.dataType == "boolean" || filter.javaBoxName == "Tag">
       return valueSatisfy((${filter.dataType}) value);
-      <#elseif filter.dataType == "Binary">
+      <#elseif filter.dataType == "Binary" || filter.javaBoxName == "String">
       if(value instanceof Binary){
         return valueSatisfy((${filter.dataType}) value);
       }
@@ -173,7 +173,19 @@ public final class ${className} {
     @SuppressWarnings("unchecked")
     public boolean canSkip(Statistics<? extends Serializable> statistics) {
       <#if filter.dataType == "boolean" || filter.dataType == "Binary" || 
filter.dataType == "String">
-        <#if filter.javaBoxName == "String" || filter.javaBoxName == "Tag">
+        <#if filter.javaBoxName == "String">
+      if(statistics.isEmpty()){
+        return false;
+      }
+      if((statistics.getMinValue() instanceof Binary) && 
(statistics.getMaxValue() instanceof Binary)){
+        return constant.compareTo((${filter.dataType}) 
statistics.getMinValue()) < 0
+            || constant.compareTo((${filter.dataType}) 
statistics.getMaxValue()) > 0;
+      }
+      else{
+        return constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMinValue()), 
StandardCharsets.UTF_8)) < 0
+            || constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMaxValue()), 
StandardCharsets.UTF_8)) > 0;
+      }
+        <#elseif filter.javaBoxName == "Tag">
       if(statistics.isEmpty()){
         return false;
       }
@@ -216,8 +228,14 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return constant.compareTo((${filter.dataType}) statistics.getMinValue()) 
== 0
-          && constant.compareTo((${filter.dataType}) statistics.getMaxValue()) 
== 0;
+      if((statistics.getMinValue() instanceof Binary) && 
(statistics.getMaxValue() instanceof Binary)){
+        return constant.compareTo((${filter.dataType}) 
statistics.getMinValue()) == 0
+            && constant.compareTo((${filter.dataType}) 
statistics.getMaxValue()) == 0;
+      }
+      else{
+        return constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMinValue()), 
StandardCharsets.UTF_8)) == 0
+            && constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMaxValue()), 
StandardCharsets.UTF_8)) == 0;
+      }
         <#else>
       return false;
         </#if>
@@ -270,9 +288,9 @@ public final class ${className} {
 
     @Override
     public boolean valueSatisfy(Object value){
-      <#if filter.dataType == "boolean" || filter.javaBoxName == "String" || 
filter.javaBoxName == "Tag">
+      <#if filter.dataType == "boolean" || filter.javaBoxName == "Tag">
       return valueSatisfy((${filter.dataType}) value);
-      <#elseif filter.dataType == "Binary">
+      <#elseif filter.dataType == "Binary" || filter.javaBoxName == "String">
       if(value instanceof Binary){
         return valueSatisfy((${filter.dataType}) value);
       } else {
@@ -300,8 +318,14 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return constant.compareTo((${filter.dataType}) statistics.getMinValue()) 
== 0
-          && constant.compareTo((${filter.dataType}) statistics.getMaxValue()) 
== 0;
+      if((statistics.getMinValue() instanceof Binary) && 
(statistics.getMaxValue() instanceof Binary)){
+        return constant.compareTo((${filter.dataType}) 
statistics.getMinValue()) == 0
+            && constant.compareTo((${filter.dataType}) 
statistics.getMaxValue()) == 0;
+      }
+      else{
+        return constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMinValue()), 
StandardCharsets.UTF_8)) == 0
+            && constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMaxValue()), 
StandardCharsets.UTF_8)) == 0;
+      }
         <#else>
       return false;
         </#if>
@@ -340,8 +364,14 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return constant.compareTo((${filter.dataType}) statistics.getMinValue()) 
< 0
-          || constant.compareTo((${filter.dataType}) statistics.getMaxValue()) 
> 0;
+      if((statistics.getMinValue() instanceof Binary) && 
(statistics.getMaxValue() instanceof Binary)){
+        return constant.compareTo((${filter.dataType}) 
statistics.getMinValue()) < 0
+            || constant.compareTo((${filter.dataType}) 
statistics.getMaxValue()) > 0;
+      }
+      else{
+        return constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMinValue()), 
StandardCharsets.UTF_8)) < 0
+            || constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMaxValue()), 
StandardCharsets.UTF_8)) > 0;
+      }
         <#else>
       return false;
         </#if>
@@ -394,9 +424,9 @@ public final class ${className} {
     @Override
     @SuppressWarnings("unchecked")
     public boolean valueSatisfy(Object value){
-      <#if filter.dataType == "boolean" || filter.javaBoxName == "String" || 
filter.javaBoxName == "Tag">
+      <#if filter.dataType == "boolean" || filter.javaBoxName == "Tag">
       return valueSatisfy((${filter.dataType}) value);
-      <#elseif filter.dataType == "Binary">
+      <#elseif filter.dataType == "Binary" || filter.javaBoxName == "String">
       if(value instanceof Binary){
         return valueSatisfy((${filter.dataType}) value);
       } else {
@@ -426,7 +456,12 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return constant.compareTo((${filter.dataType}) statistics.getMinValue()) 
<= 0;
+      if(statistics.getMinValue() instanceof Binary){
+        return constant.compareTo((${filter.dataType}) 
statistics.getMinValue()) <= 0;
+      }
+      else{
+        return constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMinValue()), 
StandardCharsets.UTF_8)) <= 0;
+      }
         <#else>
       return false;
         </#if>
@@ -462,7 +497,12 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return constant.compareTo((${filter.dataType}) statistics.getMaxValue()) 
> 0;
+      if(statistics.getMaxValue() instanceof Binary){
+        return constant.compareTo((${filter.dataType}) 
statistics.getMaxValue()) > 0;
+      }
+      else{
+        return constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMaxValue()), 
StandardCharsets.UTF_8)) > 0;
+      }
         <#else>
       return false;
         </#if>
@@ -512,9 +552,9 @@ public final class ${className} {
     @Override
     @SuppressWarnings("unchecked")
     public boolean valueSatisfy(Object value){
-      <#if filter.dataType == "boolean" || filter.javaBoxName == "String" || 
filter.javaBoxName == "Tag">
+      <#if filter.dataType == "boolean" || filter.javaBoxName == "Tag">
       return valueSatisfy((${filter.dataType}) value);
-      <#elseif filter.dataType == "Binary">
+      <#elseif filter.dataType == "Binary" || filter.javaBoxName == "String">
       if(value instanceof Binary){
         return valueSatisfy((${filter.dataType}) value);
       } else {
@@ -544,7 +584,12 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return constant.compareTo((${filter.dataType}) statistics.getMinValue()) 
< 0;
+      if(statistics.getMinValue() instanceof Binary){
+        return constant.compareTo((${filter.dataType}) 
statistics.getMinValue()) < 0;
+      }
+      else{
+        return constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMinValue()), 
StandardCharsets.UTF_8)) < 0;
+      }
         <#else>
       return false;
         </#if>
@@ -580,7 +625,12 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return constant.compareTo((${filter.dataType}) statistics.getMaxValue()) 
>= 0;
+      if(statistics.getMaxValue() instanceof Binary){
+        return constant.compareTo((${filter.dataType}) 
statistics.getMaxValue()) >= 0;
+      }
+      else{
+        return constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMaxValue()), 
StandardCharsets.UTF_8)) >= 0;
+      }
         <#else>
       return false;
         </#if>
@@ -630,9 +680,9 @@ public final class ${className} {
     @Override
     @SuppressWarnings("unchecked")
     public boolean valueSatisfy(Object value){
-      <#if filter.dataType == "boolean" || filter.javaBoxName == "String" || 
filter.javaBoxName == "Tag">
+      <#if filter.dataType == "boolean" || filter.javaBoxName == "Tag">
       return valueSatisfy((${filter.dataType}) value);
-      <#elseif filter.dataType == "Binary">
+      <#elseif filter.dataType == "Binary" || filter.javaBoxName == "String">
       if(value instanceof Binary){
         return valueSatisfy((${filter.dataType}) value);
       } else {
@@ -662,7 +712,12 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return constant.compareTo((${filter.dataType}) statistics.getMaxValue()) 
>= 0;
+      if(statistics.getMaxValue() instanceof Binary){
+        return constant.compareTo((${filter.dataType}) 
statistics.getMaxValue()) >= 0;
+      }
+      else{
+        return constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMaxValue()), 
StandardCharsets.UTF_8)) >= 0;
+      }
         <#else>
       return false;
         </#if>
@@ -698,7 +753,12 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return constant.compareTo((${filter.dataType}) statistics.getMinValue()) 
< 0;
+      if(statistics.getMinValue() instanceof Binary){
+        return constant.compareTo((${filter.dataType}) 
statistics.getMinValue()) < 0;
+      }
+      else{
+        return constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMinValue()), 
StandardCharsets.UTF_8)) < 0;
+      }
         <#else>
       return false;
         </#if>
@@ -748,9 +808,9 @@ public final class ${className} {
     @Override
     @SuppressWarnings("unchecked")
     public boolean valueSatisfy(Object value){
-      <#if filter.dataType == "boolean" || filter.javaBoxName == "String" || 
filter.javaBoxName == "Tag">
+      <#if filter.dataType == "boolean" || filter.javaBoxName == "Tag">
       return valueSatisfy((${filter.dataType}) value);
-      <#elseif filter.dataType == "Binary">
+      <#elseif filter.dataType == "Binary" || filter.javaBoxName == "String">
       if(value instanceof Binary){
         return valueSatisfy((${filter.dataType}) value);
       } else {
@@ -780,7 +840,12 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return constant.compareTo((${filter.dataType}) statistics.getMaxValue()) 
> 0;
+      if(statistics.getMaxValue() instanceof Binary){
+        return constant.compareTo((${filter.dataType}) 
statistics.getMaxValue()) > 0;
+      }
+      else{
+        return constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMaxValue()), 
StandardCharsets.UTF_8)) > 0;
+      }
         <#else>
       return false;
         </#if>
@@ -816,7 +881,12 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return constant.compareTo((${filter.dataType}) statistics.getMinValue()) 
<= 0;
+      if(statistics.getMinValue() instanceof Binary){
+        return constant.compareTo((${filter.dataType}) 
statistics.getMinValue()) <= 0;
+      }
+      else{
+        return constant.compareTo(new 
${filter.dataType}(String.valueOf(statistics.getMinValue()), 
StandardCharsets.UTF_8)) <= 0;
+      }
         <#else>
       return false;
         </#if>
@@ -934,9 +1004,9 @@ public final class ${className} {
     @Override
     @SuppressWarnings("unchecked")
     public boolean valueSatisfy(Object value){
-      <#if filter.dataType == "boolean" || filter.javaBoxName == "String" || 
filter.javaBoxName == "Tag">
+      <#if filter.dataType == "boolean" || filter.javaBoxName == "Tag">
       return valueSatisfy((${filter.dataType}) value);
-      <#elseif filter.dataType == "Binary">
+      <#elseif filter.dataType == "Binary" || filter.javaBoxName == "String">
       if(value instanceof Binary){
         return valueSatisfy((${filter.dataType}) value);
       } else {
@@ -968,8 +1038,14 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return ((${filter.dataType}) statistics.getMaxValue()).compareTo(min) < 0
-          || ((${filter.dataType}) statistics.getMinValue()).compareTo(max) > 
0;
+      if((statistics.getMinValue() instanceof Binary) && 
(statistics.getMaxValue() instanceof Binary)){
+        return ((${filter.dataType}) statistics.getMaxValue()).compareTo(min) 
< 0
+            || ((${filter.dataType}) statistics.getMinValue()).compareTo(max) 
> 0;
+      }
+      else{
+        return (new 
${filter.dataType}(String.valueOf(statistics.getMaxValue()), 
StandardCharsets.UTF_8)).compareTo(min) < 0
+            || (new 
${filter.dataType}(String.valueOf(statistics.getMinValue()), 
StandardCharsets.UTF_8)).compareTo(max) > 0;
+      }
         <#else>
       return false;
         </#if>
@@ -1007,8 +1083,14 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return ((${filter.dataType}) statistics.getMinValue()).compareTo(min) >= 0
-          && ((${filter.dataType}) statistics.getMaxValue()).compareTo(max) <= 
0;
+      if((statistics.getMinValue() instanceof Binary) && 
(statistics.getMaxValue() instanceof Binary)){
+        return ((${filter.dataType}) statistics.getMinValue()).compareTo(min) 
>= 0
+            && ((${filter.dataType}) statistics.getMaxValue()).compareTo(max) 
<= 0;
+      }
+      else{
+        return (new 
${filter.dataType}(String.valueOf(statistics.getMinValue()), 
StandardCharsets.UTF_8)).compareTo(min) >= 0
+            && (new 
${filter.dataType}(String.valueOf(statistics.getMaxValue()), 
StandardCharsets.UTF_8)).compareTo(max) <= 0;
+      }
         <#else>
       return false;
         </#if>
@@ -1061,9 +1143,9 @@ public final class ${className} {
     @Override
     @SuppressWarnings("unchecked")
     public boolean valueSatisfy(Object value){
-      <#if filter.dataType == "boolean" || filter.javaBoxName == "String" || 
filter.javaBoxName == "Tag">
+      <#if filter.dataType == "boolean" || filter.javaBoxName == "Tag">
       return valueSatisfy((${filter.dataType}) value);
-      <#elseif filter.dataType == "Binary">
+      <#elseif filter.dataType == "Binary" || filter.javaBoxName == "String">
       if(value instanceof Binary){
         return valueSatisfy((${filter.dataType}) value);
       } else {
@@ -1094,8 +1176,14 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return ((${filter.dataType}) statistics.getMinValue()).compareTo(min) >= 0
-          && ((${filter.dataType}) statistics.getMaxValue()).compareTo(max) <= 
0;
+      if((statistics.getMinValue() instanceof Binary) && 
(statistics.getMaxValue() instanceof Binary)){
+        return ((${filter.dataType}) statistics.getMinValue()).compareTo(min) 
>= 0
+            && ((${filter.dataType}) statistics.getMaxValue()).compareTo(max) 
<= 0;
+      }
+      else{
+        return (new 
${filter.dataType}(String.valueOf(statistics.getMinValue()), 
StandardCharsets.UTF_8)).compareTo(min) >= 0
+            && (new 
${filter.dataType}(String.valueOf(statistics.getMaxValue()), 
StandardCharsets.UTF_8)).compareTo(max) <= 0;
+      }
         <#else>
       return false;
         </#if>
@@ -1133,8 +1221,14 @@ public final class ${className} {
       if(statistics.isEmpty()){
         return false;
       }
-      return ((${filter.dataType}) statistics.getMinValue()).compareTo(max) > 0
-          || ((${filter.dataType}) statistics.getMaxValue()).compareTo(min) < 
0;
+      if((statistics.getMinValue() instanceof Binary) && 
(statistics.getMaxValue() instanceof Binary)){
+        return ((${filter.dataType}) statistics.getMinValue()).compareTo(max) 
> 0
+            || ((${filter.dataType}) statistics.getMaxValue()).compareTo(min) 
< 0;
+      }
+      else{
+        return (new 
${filter.dataType}(String.valueOf(statistics.getMinValue()), 
StandardCharsets.UTF_8)).compareTo(max) > 0
+            || (new 
${filter.dataType}(String.valueOf(statistics.getMaxValue()), 
StandardCharsets.UTF_8)).compareTo(min) < 0;
+      }
         <#else>
       return false;
         </#if>
@@ -1292,9 +1386,9 @@ public final class ${className} {
 
     @Override
     public boolean valueSatisfy(Object value){
-      <#if filter.dataType == "boolean" || filter.javaBoxName == "String" || 
filter.javaBoxName == "Tag">
+      <#if filter.dataType == "boolean" || filter.javaBoxName == "Tag">
       return candidates.contains((${filter.dataType}) value);
-      <#elseif filter.dataType == "Binary">
+      <#elseif filter.dataType == "Binary" || filter.javaBoxName == "String">
       if(value instanceof Binary){
         return candidates.contains((${filter.dataType}) value);
       } else {
@@ -1330,7 +1424,22 @@ public final class ${className} {
 
       if (statistics.isPresent()) {
         Statistics<? extends Serializable> stat = statistics.get();
-        <#if (filter.dataType == "Binary" && filter.javaBoxName == "String") 
|| (filter.dataType == "String" && filter.javaBoxName == "Tag")>
+        <#if filter.dataType == "Binary" && filter.javaBoxName == "String">
+        ${filter.dataType} valuesMin;
+        ${filter.dataType} valuesMax;
+        if(stat.getMinValue() instanceof Binary){
+          valuesMin = (${filter.dataType}) stat.getMinValue();
+        }
+        else{
+          valuesMin = new 
${filter.dataType}(String.valueOf(stat.getMinValue()), StandardCharsets.UTF_8);
+        }
+        if(stat.getMaxValue() instanceof Binary){
+          valuesMax = (${filter.dataType}) stat.getMaxValue();
+        }
+        else{
+          valuesMax = new 
${filter.dataType}(String.valueOf(stat.getMaxValue()), StandardCharsets.UTF_8);
+        }
+        <#elseif filter.dataType == "String" && filter.javaBoxName == "Tag">
         ${filter.dataType} valuesMin = (${filter.dataType}) stat.getMinValue();
         ${filter.dataType} valuesMax = (${filter.dataType}) stat.getMaxValue();
         <#else>
@@ -1384,7 +1493,22 @@ public final class ${className} {
       // All values are same
       if (statistics.isPresent()) {
         Statistics<? extends Serializable> stat = statistics.get();
-        <#if (filter.dataType == "Binary" && filter.javaBoxName == "String") 
|| (filter.dataType == "String" && filter.javaBoxName == "Tag")>
+        <#if filter.dataType == "Binary" && filter.javaBoxName == "String">
+        ${filter.dataType} valuesMin;
+        ${filter.dataType} valuesMax;
+        if(stat.getMinValue() instanceof Binary){
+          valuesMin = (${filter.dataType}) stat.getMinValue();
+        }
+        else{
+          valuesMin = new 
${filter.dataType}(String.valueOf(stat.getMinValue()), StandardCharsets.UTF_8);
+        }
+        if(stat.getMaxValue() instanceof Binary){
+          valuesMax = (${filter.dataType}) stat.getMaxValue();
+        }
+        else{
+          valuesMax = new 
${filter.dataType}(String.valueOf(stat.getMaxValue()), StandardCharsets.UTF_8);
+        }
+        <#elseif filter.dataType == "String" && filter.javaBoxName == "Tag">
         ${filter.dataType} valuesMin = (${filter.dataType}) stat.getMinValue();
         ${filter.dataType} valuesMax = (${filter.dataType}) stat.getMaxValue();
         <#else>
@@ -1446,9 +1570,9 @@ public final class ${className} {
 
     @Override
     public boolean valueSatisfy(Object value){
-      <#if filter.dataType == "boolean" || filter.javaBoxName == "String" || 
filter.javaBoxName == "Tag">
+      <#if filter.dataType == "boolean" || filter.javaBoxName == "Tag">
       return !candidates.contains((${filter.dataType}) value);
-      <#elseif filter.dataType == "Binary">
+      <#elseif filter.dataType == "Binary" || filter.javaBoxName == "String">
       if(value instanceof Binary){
         return !candidates.contains((${filter.dataType}) value);
       } else {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/TsBlockBuilder.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/TsBlockBuilder.java
index e06f8c37..edd35e72 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/TsBlockBuilder.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/TsBlockBuilder.java
@@ -111,10 +111,18 @@ public class TsBlockBuilder {
                   tsBlockBuilderStatus.createColumnBuilderStatus(), 
initialExpectedEntries);
           break;
         case INT32:
+          valueColumnBuilders[i] =
+              new IntColumnBuilder(
+                  tsBlockBuilderStatus.createColumnBuilderStatus(),
+                  initialExpectedEntries,
+                  TSDataType.INT32);
+          break;
         case DATE:
           valueColumnBuilders[i] =
               new IntColumnBuilder(
-                  tsBlockBuilderStatus.createColumnBuilderStatus(), 
initialExpectedEntries);
+                  tsBlockBuilderStatus.createColumnBuilderStatus(),
+                  initialExpectedEntries,
+                  TSDataType.DATE);
           break;
         case INT64:
         case TIMESTAMP:
@@ -182,10 +190,18 @@ public class TsBlockBuilder {
                   tsBlockBuilderStatus.createColumnBuilderStatus(), 
initialExpectedEntries);
           break;
         case INT32:
+          valueColumnBuilders[i] =
+              new IntColumnBuilder(
+                  tsBlockBuilderStatus.createColumnBuilderStatus(),
+                  initialExpectedEntries,
+                  TSDataType.INT32);
+          break;
         case DATE:
           valueColumnBuilders[i] =
               new IntColumnBuilder(
-                  tsBlockBuilderStatus.createColumnBuilderStatus(), 
initialExpectedEntries);
+                  tsBlockBuilderStatus.createColumnBuilderStatus(),
+                  initialExpectedEntries,
+                  TSDataType.DATE);
           break;
         case INT64:
         case TIMESTAMP:
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/ColumnFactory.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/ColumnFactory.java
index fc9774a1..4b5c468a 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/ColumnFactory.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/ColumnFactory.java
@@ -38,8 +38,9 @@ public class ColumnFactory {
       case OBJECT:
         return new BinaryColumn(initialCapacity);
       case INT32:
+        return new IntColumn(initialCapacity, TSDataType.INT32);
       case DATE:
-        return new IntColumn(initialCapacity);
+        return new IntColumn(initialCapacity, TSDataType.DATE);
       case BOOLEAN:
         return new BooleanColumn(initialCapacity);
       default:
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/IntColumn.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/IntColumn.java
index a5ea6851..fdaa4e7e 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/IntColumn.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/IntColumn.java
@@ -50,14 +50,27 @@ public class IntColumn implements Column {
 
   private final long retainedSizeInBytes;
 
+  private TSDataType dataType = TSDataType.INT32;
+
   public IntColumn(int initialCapacity) {
     this(0, 0, null, new int[initialCapacity]);
   }
 
+  public IntColumn(int initialCapacity, TSDataType dataType) {
+    this(initialCapacity);
+    this.dataType = dataType;
+  }
+
   public IntColumn(int positionCount, Optional<boolean[]> valueIsNull, int[] 
values) {
     this(0, positionCount, valueIsNull.orElse(null), values);
   }
 
+  public IntColumn(
+      int positionCount, Optional<boolean[]> valueIsNull, int[] values, 
TSDataType dataType) {
+    this(positionCount, valueIsNull, values);
+    this.dataType = dataType;
+  }
+
   IntColumn(int arrayOffset, int positionCount, boolean[] valueIsNull, int[] 
values) {
     if (arrayOffset < 0) {
       throw new IllegalArgumentException("arrayOffset is negative");
@@ -82,9 +95,19 @@ public class IntColumn implements Column {
         INSTANCE_SIZE + sizeOfIntArray(positionCount) + 
sizeOfBooleanArray(positionCount);
   }
 
+  IntColumn(
+      int arrayOffset,
+      int positionCount,
+      boolean[] valueIsNull,
+      int[] values,
+      TSDataType dataType) {
+    this(arrayOffset, positionCount, valueIsNull, values);
+    this.dataType = dataType;
+  }
+
   @Override
   public TSDataType getDataType() {
-    return TSDataType.INT32;
+    return dataType;
   }
 
   @Override
@@ -165,7 +188,7 @@ public class IntColumn implements Column {
 
   @Override
   public TsPrimitiveType getTsPrimitiveType(int position) {
-    return new TsPrimitiveType.TsInt(getInt(position));
+    return new TsPrimitiveType.TsInt(getInt(position), dataType);
   }
 
   @Override
@@ -206,7 +229,7 @@ public class IntColumn implements Column {
   @Override
   public Column getRegion(int positionOffset, int length) {
     checkValidRegion(getPositionCount(), positionOffset, length);
-    return new IntColumn(positionOffset + arrayOffset, length, valueIsNull, 
values);
+    return new IntColumn(positionOffset + arrayOffset, length, valueIsNull, 
values, dataType);
   }
 
   @Override
@@ -219,7 +242,7 @@ public class IntColumn implements Column {
         valueIsNull != null ? Arrays.copyOfRange(valueIsNull, from, to) : null;
     int[] valuesCopy = Arrays.copyOfRange(values, from, to);
 
-    return new IntColumn(0, length, valueIsNullCopy, valuesCopy);
+    return new IntColumn(0, length, valueIsNullCopy, valuesCopy, dataType);
   }
 
   @Override
@@ -227,7 +250,8 @@ public class IntColumn implements Column {
     if (fromIndex > positionCount) {
       throw new IllegalArgumentException("fromIndex is not valid");
     }
-    return new IntColumn(arrayOffset + fromIndex, positionCount - fromIndex, 
valueIsNull, values);
+    return new IntColumn(
+        arrayOffset + fromIndex, positionCount - fromIndex, valueIsNull, 
values, dataType);
   }
 
   @Override
@@ -242,7 +266,7 @@ public class IntColumn implements Column {
     int[] valuesCopy = Arrays.copyOfRange(values, from, positionCount);
 
     int length = positionCount - fromIndex;
-    return new IntColumn(0, length, valueIsNullCopy, valuesCopy);
+    return new IntColumn(0, length, valueIsNullCopy, valuesCopy, dataType);
   }
 
   @Override
@@ -286,7 +310,7 @@ public class IntColumn implements Column {
       }
       newValues[i] = values[position + arrayOffset];
     }
-    return new IntColumn(0, length, newValueIsNull, newValues);
+    return new IntColumn(0, length, newValueIsNull, newValues, dataType);
   }
 
   @Override
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/IntColumnBuilder.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/IntColumnBuilder.java
index a0fc7a5b..742e1776 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/IntColumnBuilder.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/common/block/column/IntColumnBuilder.java
@@ -56,6 +56,8 @@ public class IntColumnBuilder implements ColumnBuilder {
 
   private long retainedSizeInBytes;
 
+  private TSDataType dataType = TSDataType.INT32;
+
   public IntColumnBuilder(ColumnBuilderStatus columnBuilderStatus, int 
expectedEntries) {
     this.columnBuilderStatus = columnBuilderStatus;
     this.initialEntryCount = max(expectedEntries, 1);
@@ -63,6 +65,12 @@ public class IntColumnBuilder implements ColumnBuilder {
     updateDataSize();
   }
 
+  public IntColumnBuilder(
+      ColumnBuilderStatus columnBuilderStatus, int expectedEntries, TSDataType 
dataType) {
+    this(columnBuilderStatus, expectedEntries);
+    this.dataType = dataType;
+  }
+
   @Override
   public int getPositionCount() {
     return positionCount;
@@ -128,12 +136,13 @@ public class IntColumnBuilder implements ColumnBuilder {
     if (!hasNonNullValue) {
       return new RunLengthEncodedColumn(NULL_VALUE_BLOCK, positionCount);
     }
-    return new IntColumn(0, positionCount, hasNullValue ? valueIsNull : null, 
values);
+    return new IntColumn(
+        0, positionCount, hasNullValue ? valueIsNull : null, values, 
getDataType());
   }
 
   @Override
   public TSDataType getDataType() {
-    return TSDataType.INT32;
+    return dataType;
   }
 
   @Override
@@ -143,7 +152,8 @@ public class IntColumnBuilder implements ColumnBuilder {
 
   @Override
   public ColumnBuilder newColumnBuilderLike(ColumnBuilderStatus 
columnBuilderStatus) {
-    return new IntColumnBuilder(columnBuilderStatus, 
calculateBlockResetSize(positionCount));
+    return new IntColumnBuilder(
+        columnBuilderStatus, calculateBlockResetSize(positionCount), dataType);
   }
 
   private void growCapacity() {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/ValuePageReader.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/ValuePageReader.java
index ff34c98b..50835f5f 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/ValuePageReader.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/ValuePageReader.java
@@ -190,7 +190,10 @@ public class ValuePageReader {
       case DATE:
         int anInt = valueDecoder.readInt(valueBuffer);
         if (!isDeleted(timestamp)) {
-          resultValue = new TsPrimitiveType.TsInt(anInt);
+          resultValue =
+              dataType.equals(TSDataType.INT32)
+                  ? new TsPrimitiveType.TsInt(anInt)
+                  : new TsPrimitiveType.TsInt(anInt, TSDataType.DATE);
         }
         break;
       case INT64:
@@ -253,7 +256,10 @@ public class ValuePageReader {
         case DATE:
           int anInt = valueDecoder.readInt(valueBuffer);
           if (!isDeleted(timeBatch[i])) {
-            valueBatch[i] = new TsPrimitiveType.TsInt(anInt);
+            valueBatch[i] =
+                dataType.equals(TSDataType.INT32)
+                    ? new TsPrimitiveType.TsInt(anInt)
+                    : new TsPrimitiveType.TsInt(anInt, TSDataType.DATE);
           }
           break;
         case INT64:

Reply via email to