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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4713668ab8 [IOTDB-3068] Cache datatype/isConstant to reduce redundant 
function calls when calculating expressions (#5844)
4713668ab8 is described below

commit 4713668ab8ffbe4c35c726bf209011b23bd6e40b
Author: flashzxi <[email protected]>
AuthorDate: Wed May 11 19:21:13 2022 +0800

    [IOTDB-3068] Cache datatype/isConstant to reduce redundant function calls 
when calculating expressions (#5844)
    
    Co-authored-by: Steve Yurong Su <[email protected]>
---
 .../iotdb/db/integration/IoTDBArithmeticIT.java    |  4 +--
 ...InputColumnMultiReferenceIntermediateLayer.java | 32 ++++++++++--------
 .../binary/ArithmeticBinaryTransformer.java        | 19 ++++++++---
 .../core/transformer/binary/BinaryTransformer.java | 32 ++++++++++++++----
 .../binary/CompareBinaryTransformer.java           | 20 +++++++++---
 .../binary/CompareEqualToTransformer.java          | 27 +++++++--------
 .../binary/CompareNonEqualTransformer.java         | 30 ++++++++---------
 .../transformer/binary/LogicBinaryTransformer.java | 17 ++++++----
 .../transformer/multi/UDFQueryTransformer.java     | 38 ++++++++++++----------
 .../unary/ArithmeticNegationTransformer.java       |  4 +--
 .../udf/core/transformer/unary/InTransformer.java  |  9 ++---
 .../transformer/unary/LogicNotTransformer.java     | 11 ++++---
 .../core/transformer/unary/RegularTransformer.java | 11 ++++---
 .../transformer/unary/TransparentTransformer.java  |  4 +--
 .../core/transformer/unary/UnaryTransformer.java   |  9 +++--
 15 files changed, 159 insertions(+), 108 deletions(-)

diff --git 
a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBArithmeticIT.java
 
b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBArithmeticIT.java
index 60e9db6116..709494a978 100644
--- 
a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBArithmeticIT.java
+++ 
b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBArithmeticIT.java
@@ -268,8 +268,8 @@ public class IoTDBArithmeticIT {
                 Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
         Statement statement = connection.createStatement()) {
       statement.executeQuery("select s1 + s5 from root.sg.d1");
-    } catch (SQLException throwable) {
-      assertTrue(throwable.getMessage().contains("Unsupported data type: 
BOOLEAN"));
+    } catch (Exception throwable) {
+      assertTrue(throwable.getMessage().contains("Unsupported dataType: 
BOOLEAN"));
     }
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/SingleInputColumnMultiReferenceIntermediateLayer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/SingleInputColumnMultiReferenceIntermediateLayer.java
index c1359d5771..ba4f91a66f 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/SingleInputColumnMultiReferenceIntermediateLayer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/layer/SingleInputColumnMultiReferenceIntermediateLayer.java
@@ -46,7 +46,8 @@ public class SingleInputColumnMultiReferenceIntermediateLayer 
extends Intermedia
       
LoggerFactory.getLogger(SingleInputColumnMultiReferenceIntermediateLayer.class);
 
   private final LayerPointReader parentLayerPointReader;
-  private final TSDataType dataType;
+  private final TSDataType parentLayerPointReaderDataType;
+  private final boolean isParentLayerPointReaderConstant;
   private final ElasticSerializableTVList tvList;
   private final SafetyLine safetyLine;
 
@@ -59,10 +60,11 @@ public class 
SingleInputColumnMultiReferenceIntermediateLayer extends Intermedia
     super(expression, queryId, memoryBudgetInMB);
     this.parentLayerPointReader = parentLayerPointReader;
 
-    dataType = parentLayerPointReader.getDataType();
+    parentLayerPointReaderDataType = parentLayerPointReader.getDataType();
+    isParentLayerPointReaderConstant = 
parentLayerPointReader.isConstantPointReader();
     tvList =
         ElasticSerializableTVList.newElasticSerializableTVList(
-            dataType, queryId, memoryBudgetInMB, CACHE_BLOCK_SIZE);
+            parentLayerPointReaderDataType, queryId, memoryBudgetInMB, 
CACHE_BLOCK_SIZE);
     safetyLine = new SafetyLine();
   }
 
@@ -78,14 +80,15 @@ public class 
SingleInputColumnMultiReferenceIntermediateLayer extends Intermedia
 
       @Override
       public boolean isConstantPointReader() {
-        return parentLayerPointReader.isConstantPointReader();
+        return isParentLayerPointReaderConstant;
       }
 
       @Override
       public boolean next() throws QueryProcessException, IOException {
         if (!hasCached
             && (currentPointIndex < tvList.size() - 1
-                || LayerCacheUtils.cachePoint(dataType, 
parentLayerPointReader, tvList))) {
+                || LayerCacheUtils.cachePoint(
+                    parentLayerPointReaderDataType, parentLayerPointReader, 
tvList))) {
           ++currentPointIndex;
           hasCached = true;
         }
@@ -103,7 +106,7 @@ public class 
SingleInputColumnMultiReferenceIntermediateLayer extends Intermedia
 
       @Override
       public TSDataType getDataType() {
-        return dataType;
+        return parentLayerPointReaderDataType;
       }
 
       @Override
@@ -164,7 +167,8 @@ public class 
SingleInputColumnMultiReferenceIntermediateLayer extends Intermedia
       public boolean next() throws QueryProcessException, IOException {
         if (!hasCached
             && ((currentRowIndex < tvList.size() - 1)
-                || LayerCacheUtils.cachePoint(dataType, 
parentLayerPointReader, tvList))) {
+                || LayerCacheUtils.cachePoint(
+                    parentLayerPointReaderDataType, parentLayerPointReader, 
tvList))) {
           row.seek(++currentRowIndex);
           hasCached = true;
         }
@@ -182,7 +186,7 @@ public class 
SingleInputColumnMultiReferenceIntermediateLayer extends Intermedia
 
       @Override
       public TSDataType[] getDataTypes() {
-        return new TSDataType[] {dataType};
+        return new TSDataType[] {parentLayerPointReaderDataType};
       }
 
       @Override
@@ -238,7 +242,7 @@ public class 
SingleInputColumnMultiReferenceIntermediateLayer extends Intermedia
         int pointsToBeCollected = endIndex - tvList.size();
         if (0 < pointsToBeCollected) {
           LayerCacheUtils.cachePoints(
-              dataType, parentLayerPointReader, tvList, pointsToBeCollected);
+              parentLayerPointReaderDataType, parentLayerPointReader, tvList, 
pointsToBeCollected);
           if (tvList.size() <= beginIndex) {
             return false;
           }
@@ -267,7 +271,7 @@ public class 
SingleInputColumnMultiReferenceIntermediateLayer extends Intermedia
 
       @Override
       public TSDataType[] getDataTypes() {
-        return new TSDataType[] {dataType};
+        return new TSDataType[] {parentLayerPointReaderDataType};
       }
 
       @Override
@@ -292,7 +296,8 @@ public class 
SingleInputColumnMultiReferenceIntermediateLayer extends Intermedia
 
     long nextWindowTimeBeginGivenByStrategy = strategy.getDisplayWindowBegin();
     if (tvList.size() == 0
-        && LayerCacheUtils.cachePoint(dataType, parentLayerPointReader, tvList)
+        && LayerCacheUtils.cachePoint(
+            parentLayerPointReaderDataType, parentLayerPointReader, tvList)
         && nextWindowTimeBeginGivenByStrategy == Long.MIN_VALUE) {
       // display window begin should be set to the same as the min timestamp 
of the query result
       // set
@@ -319,7 +324,8 @@ public class 
SingleInputColumnMultiReferenceIntermediateLayer extends Intermedia
 
         long nextWindowTimeEnd = Math.min(nextWindowTimeBegin + timeInterval, 
displayWindowEnd);
         while (tvList.getTime(tvList.size() - 1) < nextWindowTimeEnd) {
-          if (!LayerCacheUtils.cachePoint(dataType, parentLayerPointReader, 
tvList)) {
+          if (!LayerCacheUtils.cachePoint(
+              parentLayerPointReaderDataType, parentLayerPointReader, tvList)) 
{
             break;
           }
         }
@@ -362,7 +368,7 @@ public class 
SingleInputColumnMultiReferenceIntermediateLayer extends Intermedia
 
       @Override
       public TSDataType[] getDataTypes() {
-        return new TSDataType[] {dataType};
+        return new TSDataType[] {parentLayerPointReaderDataType};
       }
 
       @Override
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticBinaryTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticBinaryTransformer.java
index 1c2c4eb41b..29a17a1ee1 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticBinaryTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/ArithmeticBinaryTransformer.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.IOException;
@@ -32,18 +33,28 @@ public abstract class ArithmeticBinaryTransformer extends 
BinaryTransformer {
     super(leftPointReader, rightPointReader);
   }
 
+  @Override
+  protected void checkType() {
+    if (leftPointReaderDataType == TSDataType.BOOLEAN) {
+      throw new 
UnSupportedDataTypeException(leftPointReader.getDataType().toString());
+    }
+    if (rightPointReaderDataType == TSDataType.BOOLEAN) {
+      throw new 
UnSupportedDataTypeException(rightPointReader.getDataType().toString());
+    }
+  }
+
   @Override
   protected void transformAndCache() throws QueryProcessException, IOException 
{
     cachedDouble =
         evaluate(
-            castCurrentValueToDoubleOperand(leftPointReader),
-            castCurrentValueToDoubleOperand(rightPointReader));
+            castCurrentValueToDoubleOperand(leftPointReader, 
leftPointReaderDataType),
+            castCurrentValueToDoubleOperand(rightPointReader, 
rightPointReaderDataType));
   }
 
+  protected abstract double evaluate(double leftOperand, double rightOperand);
+
   @Override
   public TSDataType getDataType() {
     return TSDataType.DOUBLE;
   }
-
-  protected abstract double evaluate(double leftOperand, double rightOperand);
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/BinaryTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/BinaryTransformer.java
index f2e7520fcf..c99a4e1b3c 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/BinaryTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/BinaryTransformer.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.db.query.udf.core.transformer.binary;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.IOException;
 
@@ -30,14 +31,28 @@ public abstract class BinaryTransformer extends Transformer 
{
   protected final LayerPointReader leftPointReader;
   protected final LayerPointReader rightPointReader;
 
+  protected final TSDataType leftPointReaderDataType;
+  protected final TSDataType rightPointReaderDataType;
+
+  protected final boolean isLeftPointReaderConstant;
+  protected final boolean isRightPointReaderConstant;
+
+  protected final boolean isCurrentConstant;
+
   protected BinaryTransformer(LayerPointReader leftPointReader, 
LayerPointReader rightPointReader) {
     this.leftPointReader = leftPointReader;
     this.rightPointReader = rightPointReader;
+    leftPointReaderDataType = leftPointReader.getDataType();
+    rightPointReaderDataType = rightPointReader.getDataType();
+    isLeftPointReaderConstant = leftPointReader.isConstantPointReader();
+    isRightPointReaderConstant = rightPointReader.isConstantPointReader();
+    isCurrentConstant = isLeftPointReaderConstant && 
isRightPointReaderConstant;
+    checkType();
   }
 
   @Override
   public boolean isConstantPointReader() {
-    return leftPointReader.isConstantPointReader() && 
rightPointReader.isConstantPointReader();
+    return isCurrentConstant;
   }
 
   @Override
@@ -63,6 +78,8 @@ public abstract class BinaryTransformer extends Transformer {
 
   protected abstract void transformAndCache() throws QueryProcessException, 
IOException;
 
+  protected abstract void checkType();
+
   /**
    * finds the smallest, unconsumed timestamp that exists in both {@code 
leftPointReader} and {@code
    * rightPointReader} and then caches the timestamp in {@code cachedTime}.
@@ -70,14 +87,14 @@ public abstract class BinaryTransformer extends Transformer 
{
    * @return true if there has a timestamp that meets the requirements
    */
   private boolean cacheTime() throws IOException, QueryProcessException {
-    if (leftPointReader.isConstantPointReader() && 
rightPointReader.isConstantPointReader()) {
+    if (isCurrentConstant) {
       return true;
     }
-    if (leftPointReader.isConstantPointReader()) {
+    if (isLeftPointReaderConstant) {
       cachedTime = rightPointReader.currentTime();
       return true;
     }
-    if (rightPointReader.isConstantPointReader()) {
+    if (isRightPointReaderConstant) {
       cachedTime = leftPointReader.currentTime();
       return true;
     }
@@ -106,9 +123,10 @@ public abstract class BinaryTransformer extends 
Transformer {
     return true;
   }
 
-  protected static double castCurrentValueToDoubleOperand(LayerPointReader 
layerPointReader)
+  protected static double castCurrentValueToDoubleOperand(
+      LayerPointReader layerPointReader, TSDataType layerPointReaderDataType)
       throws IOException, QueryProcessException {
-    switch (layerPointReader.getDataType()) {
+    switch (layerPointReaderDataType) {
       case INT32:
         return layerPointReader.currentInt();
       case INT64:
@@ -117,6 +135,8 @@ public abstract class BinaryTransformer extends Transformer 
{
         return layerPointReader.currentFloat();
       case DOUBLE:
         return layerPointReader.currentDouble();
+      case BOOLEAN:
+        return layerPointReader.currentBoolean() ? 1.0d : 0.0d;
       default:
         throw new QueryProcessException(
             "Unsupported data type: " + 
layerPointReader.getDataType().toString());
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareBinaryTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareBinaryTransformer.java
index d3b662c397..90f506ddd7 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareBinaryTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareBinaryTransformer.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.IOException;
@@ -28,16 +29,27 @@ import java.io.IOException;
 public abstract class CompareBinaryTransformer extends BinaryTransformer {
 
   protected CompareBinaryTransformer(
-      LayerPointReader leftPointReader, LayerPointReader rightPointReader) {
+      LayerPointReader leftPointReader, LayerPointReader rightPointReader)
+      throws UnSupportedDataTypeException {
     super(leftPointReader, rightPointReader);
   }
 
   @Override
-  protected void transformAndCache() throws QueryProcessException, IOException 
{
+  protected void checkType() {
+    if (leftPointReaderDataType == TSDataType.BOOLEAN) {
+      throw new 
UnSupportedDataTypeException(leftPointReader.getDataType().toString());
+    }
+    if (rightPointReaderDataType == TSDataType.BOOLEAN) {
+      throw new 
UnSupportedDataTypeException(rightPointReader.getDataType().toString());
+    }
+  }
+
+  @Override
+  protected final void transformAndCache() throws QueryProcessException, 
IOException {
     cachedBoolean =
         evaluate(
-            castCurrentValueToDoubleOperand(leftPointReader),
-            castCurrentValueToDoubleOperand(rightPointReader));
+            castCurrentValueToDoubleOperand(leftPointReader, 
leftPointReaderDataType),
+            castCurrentValueToDoubleOperand(rightPointReader, 
rightPointReaderDataType));
   }
 
   abstract boolean evaluate(double leftOperand, double rightOperand);
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareEqualToTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareEqualToTransformer.java
index b68dbf85cf..8484df276c 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareEqualToTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareEqualToTransformer.java
@@ -19,12 +19,10 @@
 
 package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
-import java.io.IOException;
-
 public class CompareEqualToTransformer extends CompareBinaryTransformer {
 
   public CompareEqualToTransformer(
@@ -33,15 +31,16 @@ public class CompareEqualToTransformer extends 
CompareBinaryTransformer {
   }
 
   @Override
-  protected void transformAndCache() throws QueryProcessException, IOException 
{
-    if (leftPointReader.getDataType() == TSDataType.BOOLEAN
-        && rightPointReader.getDataType() == TSDataType.BOOLEAN) {
-      cachedBoolean = evaluate(leftPointReader.currentBoolean(), 
rightPointReader.currentBoolean());
-    } else {
-      cachedBoolean =
-          evaluate(
-              castCurrentValueToDoubleOperand(leftPointReader),
-              castCurrentValueToDoubleOperand(rightPointReader));
+  protected void checkType() {
+    if ((leftPointReaderDataType == TSDataType.BOOLEAN
+            && rightPointReaderDataType != TSDataType.BOOLEAN)
+        || (leftPointReaderDataType != TSDataType.BOOLEAN
+            && rightPointReaderDataType == TSDataType.BOOLEAN)) {
+      throw new UnSupportedDataTypeException(
+          "left: "
+              + leftPointReaderDataType.toString()
+              + ", right: "
+              + rightPointReaderDataType.toString());
     }
   }
 
@@ -49,8 +48,4 @@ public class CompareEqualToTransformer extends 
CompareBinaryTransformer {
   protected boolean evaluate(double leftOperand, double rightOperand) {
     return Double.compare(leftOperand, rightOperand) == 0;
   }
-
-  protected boolean evaluate(boolean leftOperand, boolean rightOperand) {
-    return leftOperand == rightOperand;
-  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareNonEqualTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareNonEqualTransformer.java
index feb6a0fd88..795b011bdc 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareNonEqualTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareNonEqualTransformer.java
@@ -19,36 +19,32 @@
 
 package org.apache.iotdb.db.query.udf.core.transformer.binary;
 
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
-import java.io.IOException;
-
 public class CompareNonEqualTransformer extends CompareBinaryTransformer {
 
   public CompareNonEqualTransformer(
-      LayerPointReader leftPointReader, LayerPointReader rightPointReader) {
+      LayerPointReader leftPointReader, LayerPointReader rightPointReader)
+      throws UnSupportedDataTypeException {
     super(leftPointReader, rightPointReader);
   }
 
   @Override
-  protected void transformAndCache() throws QueryProcessException, IOException 
{
-    if (leftPointReader.getDataType() == TSDataType.BOOLEAN
-        && rightPointReader.getDataType() == TSDataType.BOOLEAN) {
-      cachedBoolean = evaluate(leftPointReader.currentBoolean(), 
rightPointReader.currentBoolean());
-    } else {
-      cachedBoolean =
-          evaluate(
-              castCurrentValueToDoubleOperand(leftPointReader),
-              castCurrentValueToDoubleOperand(rightPointReader));
+  protected void checkType() {
+    if ((leftPointReaderDataType == TSDataType.BOOLEAN
+            && rightPointReaderDataType != TSDataType.BOOLEAN)
+        || (leftPointReaderDataType != TSDataType.BOOLEAN
+            && rightPointReaderDataType == TSDataType.BOOLEAN)) {
+      throw new UnSupportedDataTypeException(
+          "left: "
+              + leftPointReaderDataType.toString()
+              + ", right: "
+              + rightPointReaderDataType.toString());
     }
   }
 
-  protected boolean evaluate(boolean leftOperand, boolean rightOperand) {
-    return leftOperand != rightOperand;
-  }
-
   @Override
   protected boolean evaluate(double leftOperand, double rightOperand) {
     return Double.compare(leftOperand, rightOperand) != 0;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicBinaryTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicBinaryTransformer.java
index 213efe657b..d8e1a36012 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicBinaryTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/LogicBinaryTransformer.java
@@ -21,27 +21,32 @@ package 
org.apache.iotdb.db.query.udf.core.transformer.binary;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.IOException;
 
 public abstract class LogicBinaryTransformer extends BinaryTransformer {
+
   protected LogicBinaryTransformer(
       LayerPointReader leftPointReader, LayerPointReader rightPointReader) {
     super(leftPointReader, rightPointReader);
   }
 
   @Override
-  protected void transformAndCache() throws QueryProcessException, IOException 
{
-    // Check TSDataType
-    if (leftPointReader.getDataType() != TSDataType.BOOLEAN) {
-      throw new QueryProcessException(
+  protected void checkType() {
+    if (leftPointReaderDataType != TSDataType.BOOLEAN) {
+      throw new UnSupportedDataTypeException(
           "Unsupported data type: " + 
leftPointReader.getDataType().toString());
     }
-    if (rightPointReader.getDataType() != TSDataType.BOOLEAN) {
-      throw new QueryProcessException(
+    if (rightPointReaderDataType != TSDataType.BOOLEAN) {
+      throw new UnSupportedDataTypeException(
           "Unsupported data type: " + 
rightPointReader.getDataType().toString());
     }
+  }
+
+  @Override
+  protected void transformAndCache() throws QueryProcessException, IOException 
{
     cachedBoolean = evaluate(leftPointReader.currentBoolean(), 
rightPointReader.currentBoolean());
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryTransformer.java
index c48ec13cee..28b18f6cfc 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/multi/UDFQueryTransformer.java
@@ -32,21 +32,23 @@ public abstract class UDFQueryTransformer extends 
Transformer {
 
   protected final UDTFExecutor executor;
 
-  protected final TSDataType udfOutputDataType;
-  protected final LayerPointReader udfOutput;
+  protected final LayerPointReader layerPointReader;
+  protected final TSDataType layerPointReaderDataType;
+  protected final boolean isLayerPointReaderConstant;
 
   protected boolean terminated;
 
   protected UDFQueryTransformer(UDTFExecutor executor) {
     this.executor = executor;
-    udfOutputDataType = executor.getConfigurations().getOutputDataType();
-    udfOutput = 
executor.getCollector().constructPointReaderUsingTrivialEvictionStrategy();
+    layerPointReader = 
executor.getCollector().constructPointReaderUsingTrivialEvictionStrategy();
+    layerPointReaderDataType = 
executor.getConfigurations().getOutputDataType();
+    isLayerPointReaderConstant = layerPointReader.isConstantPointReader();
     terminated = false;
   }
 
   @Override
   public boolean isConstantPointReader() {
-    return udfOutput.isConstantPointReader();
+    return isLayerPointReaderConstant;
   }
 
   @Override
@@ -60,37 +62,37 @@ public abstract class UDFQueryTransformer extends 
Transformer {
   }
 
   protected final boolean cacheValueFromUDFOutput() throws 
QueryProcessException, IOException {
-    if (!udfOutput.next()) {
+    if (!layerPointReader.next()) {
       return false;
     }
-    cachedTime = udfOutput.currentTime();
-    if (udfOutput.isCurrentNull()) {
+    cachedTime = layerPointReader.currentTime();
+    if (layerPointReader.isCurrentNull()) {
       currentNull = true;
     } else {
-      switch (udfOutputDataType) {
+      switch (layerPointReaderDataType) {
         case INT32:
-          cachedInt = udfOutput.currentInt();
+          cachedInt = layerPointReader.currentInt();
           break;
         case INT64:
-          cachedLong = udfOutput.currentLong();
+          cachedLong = layerPointReader.currentLong();
           break;
         case FLOAT:
-          cachedFloat = udfOutput.currentFloat();
+          cachedFloat = layerPointReader.currentFloat();
           break;
         case DOUBLE:
-          cachedDouble = udfOutput.currentDouble();
+          cachedDouble = layerPointReader.currentDouble();
           break;
         case BOOLEAN:
-          cachedBoolean = udfOutput.currentBoolean();
+          cachedBoolean = layerPointReader.currentBoolean();
           break;
         case TEXT:
-          cachedBinary = udfOutput.currentBinary();
+          cachedBinary = layerPointReader.currentBinary();
           break;
         default:
-          throw new UnSupportedDataTypeException(udfOutputDataType.toString());
+          throw new 
UnSupportedDataTypeException(layerPointReaderDataType.toString());
       }
     }
-    udfOutput.readyForNext();
+    layerPointReader.readyForNext();
     return true;
   }
 
@@ -107,6 +109,6 @@ public abstract class UDFQueryTransformer extends 
Transformer {
 
   @Override
   public final TSDataType getDataType() {
-    return udfOutputDataType;
+    return layerPointReaderDataType;
   }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/ArithmeticNegationTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/ArithmeticNegationTransformer.java
index 983c8ab238..1dbd1ba046 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/ArithmeticNegationTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/ArithmeticNegationTransformer.java
@@ -33,12 +33,12 @@ public class ArithmeticNegationTransformer extends 
UnaryTransformer {
 
   @Override
   public TSDataType getDataType() {
-    return layerPointReader.getDataType();
+    return layerPointReaderDataType;
   }
 
   @Override
   protected void transformAndCache() throws QueryProcessException, IOException 
{
-    switch (layerPointReader.getDataType()) {
+    switch (layerPointReaderDataType) {
       case INT32:
         cachedInt = -layerPointReader.currentInt();
         break;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/InTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/InTransformer.java
index 74dab92467..5d219f50cf 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/InTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/InTransformer.java
@@ -30,8 +30,6 @@ import java.util.Set;
 
 public class InTransformer extends UnaryTransformer {
 
-  private final TSDataType dataType;
-
   private final Satisfy satisfy;
 
   private Set<Integer> intSet;
@@ -43,13 +41,12 @@ public class InTransformer extends UnaryTransformer {
 
   public InTransformer(LayerPointReader layerPointReader, boolean isNotIn, 
Set<String> values) {
     super(layerPointReader);
-    dataType = layerPointReader.getDataType();
     satisfy = isNotIn ? new NotInSatisfy() : new InSatisfy();
     initTypedSet(values);
   }
 
   private void initTypedSet(Set<String> values) {
-    switch (dataType) {
+    switch (layerPointReaderDataType) {
       case INT32:
         intSet = new HashSet<>();
         for (String value : values) {
@@ -91,12 +88,12 @@ public class InTransformer extends UnaryTransformer {
 
   @Override
   public TSDataType getDataType() {
-    return dataType;
+    return layerPointReaderDataType;
   }
 
   @Override
   protected void transformAndCache() throws QueryProcessException, IOException 
{
-    switch (dataType) {
+    switch (layerPointReaderDataType) {
       case INT32:
         int intValue = layerPointReader.currentInt();
         if (satisfy.of(intValue)) {
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/LogicNotTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/LogicNotTransformer.java
index 1bf9499c29..558bd6caea 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/LogicNotTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/LogicNotTransformer.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.query.udf.core.transformer.unary;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.IOException;
@@ -29,6 +30,11 @@ public class LogicNotTransformer extends UnaryTransformer {
 
   public LogicNotTransformer(LayerPointReader layerPointReader) {
     super(layerPointReader);
+
+    if (layerPointReaderDataType != TSDataType.BOOLEAN) {
+      throw new UnSupportedDataTypeException(
+          "Unsupported data type: " + 
layerPointReader.getDataType().toString());
+    }
   }
 
   @Override
@@ -38,11 +44,6 @@ public class LogicNotTransformer extends UnaryTransformer {
 
   @Override
   protected void transformAndCache() throws QueryProcessException, IOException 
{
-    if (layerPointReader.getDataType() != TSDataType.BOOLEAN) {
-      throw new QueryProcessException(
-          "Unsupported data type: " + 
layerPointReader.getDataType().toString());
-    }
-
     cachedBoolean = !layerPointReader.currentBoolean();
   }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/RegularTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/RegularTransformer.java
index cceb55b9cd..e7095eb010 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/RegularTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/RegularTransformer.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.query.udf.core.transformer.unary;
 
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
+import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.Binary;
 
@@ -34,6 +35,11 @@ public class RegularTransformer extends UnaryTransformer {
   public RegularTransformer(LayerPointReader layerPointReader, Pattern 
pattern) {
     super(layerPointReader);
     this.pattern = pattern;
+
+    if (layerPointReaderDataType != TSDataType.TEXT) {
+      throw new UnSupportedDataTypeException(
+          "Unsupported data type: " + 
layerPointReader.getDataType().toString());
+    }
   }
 
   @Override
@@ -43,11 +49,6 @@ public class RegularTransformer extends UnaryTransformer {
 
   @Override
   protected void transformAndCache() throws QueryProcessException, IOException 
{
-    if (layerPointReader.getDataType() != TSDataType.TEXT) {
-      throw new QueryProcessException(
-          "Unsupported data type: " + 
layerPointReader.getDataType().toString());
-    }
-
     Binary binary = layerPointReader.currentBinary();
     if (pattern.matcher(binary.getStringValue()).find()) {
       cachedBinary = binary;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/TransparentTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/TransparentTransformer.java
index 24cae21f52..5cec6149bc 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/TransparentTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/TransparentTransformer.java
@@ -39,12 +39,12 @@ public class TransparentTransformer extends 
UnaryTransformer {
 
   @Override
   public TSDataType getDataType() {
-    return layerPointReader.getDataType();
+    return layerPointReaderDataType;
   }
 
   @Override
   protected void transformAndCache() throws QueryProcessException, IOException 
{
-    switch (layerPointReader.getDataType()) {
+    switch (layerPointReaderDataType) {
       case BOOLEAN:
         cachedBoolean = layerPointReader.currentBoolean();
         break;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/UnaryTransformer.java
 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/UnaryTransformer.java
index 5d3abf6931..c291d131be 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/UnaryTransformer.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/unary/UnaryTransformer.java
@@ -22,20 +22,25 @@ package 
org.apache.iotdb.db.query.udf.core.transformer.unary;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.db.query.udf.core.transformer.Transformer;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.io.IOException;
 
 public abstract class UnaryTransformer extends Transformer {
 
   protected final LayerPointReader layerPointReader;
+  protected final TSDataType layerPointReaderDataType;
+  protected final boolean isLayerPointReaderConstant;
 
   public UnaryTransformer(LayerPointReader layerPointReader) {
     this.layerPointReader = layerPointReader;
+    layerPointReaderDataType = layerPointReader.getDataType();
+    isLayerPointReaderConstant = layerPointReader.isConstantPointReader();
   }
 
   @Override
   public final boolean isConstantPointReader() {
-    return layerPointReader.isConstantPointReader();
+    return isLayerPointReaderConstant;
   }
 
   @Override
@@ -44,7 +49,7 @@ public abstract class UnaryTransformer extends Transformer {
       return false;
     }
 
-    if (!isConstantPointReader()) {
+    if (!isLayerPointReaderConstant) {
       cachedTime = layerPointReader.currentTime();
     }
 

Reply via email to