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();
}