This is an automated email from the ASF dual-hosted git repository. rong pushed a commit to branch iotdb-3145 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 2f0128e29f75f33f560337a1f003cdaaf0ffb1ce Author: Steve Yurong Su <[email protected]> AuthorDate: Fri May 13 17:47:10 2022 +0800 support comparing BOOLEAN and TEXT --- .../binary/ArithmeticBinaryTransformer.java | 9 ++-- .../binary/CompareBinaryTransformer.java | 60 ++++++++++++++++++---- .../binary/CompareEqualToTransformer.java | 27 +++++----- .../binary/CompareGreaterEqualTransformer.java | 17 +++++- .../binary/CompareGreaterThanTransformer.java | 17 +++++- .../binary/CompareLessEqualTransformer.java | 17 +++++- .../binary/CompareLessThanTransformer.java | 17 +++++- .../binary/CompareNonEqualTransformer.java | 26 +++++----- .../transformer/binary/LogicBinaryTransformer.java | 10 ++-- 9 files changed, 141 insertions(+), 59 deletions(-) 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 29a17a1ee1..751fc534d6 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 @@ -35,11 +35,12 @@ public abstract class ArithmeticBinaryTransformer extends BinaryTransformer { @Override protected void checkType() { - if (leftPointReaderDataType == TSDataType.BOOLEAN) { - throw new UnSupportedDataTypeException(leftPointReader.getDataType().toString()); + if (leftPointReaderDataType == TSDataType.BOOLEAN + || rightPointReaderDataType == TSDataType.BOOLEAN) { + throw new UnSupportedDataTypeException(TSDataType.BOOLEAN.name()); } - if (rightPointReaderDataType == TSDataType.BOOLEAN) { - throw new UnSupportedDataTypeException(rightPointReader.getDataType().toString()); + if (leftPointReaderDataType == TSDataType.TEXT || rightPointReaderDataType == TSDataType.TEXT) { + throw new UnSupportedDataTypeException(TSDataType.TEXT.name()); } } 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 90f506ddd7..42b42e1058 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 @@ -25,35 +25,73 @@ import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException; import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType; import java.io.IOException; +import java.util.Objects; public abstract class CompareBinaryTransformer extends BinaryTransformer { + @FunctionalInterface + protected interface Evaluator { + + boolean evaluate() throws QueryProcessException, IOException; + } + + protected final Evaluator evaluator; + protected CompareBinaryTransformer( LayerPointReader leftPointReader, LayerPointReader rightPointReader) throws UnSupportedDataTypeException { super(leftPointReader, rightPointReader); + evaluator = + TSDataType.TEXT.equals(leftPointReaderDataType) + ? constructTextEvaluator() + : constructNumberEvaluator(); + } + + protected abstract Evaluator constructNumberEvaluator(); + + protected abstract Evaluator constructTextEvaluator(); + + protected static int compare(CharSequence cs1, CharSequence cs2) { + if (Objects.requireNonNull(cs1) == Objects.requireNonNull(cs2)) { + return 0; + } + + if (cs1.getClass() == cs2.getClass() && cs1 instanceof Comparable) { + return ((Comparable<Object>) cs1).compareTo(cs2); + } + + for (int i = 0, len = Math.min(cs1.length(), cs2.length()); i < len; i++) { + char a = cs1.charAt(i); + char b = cs2.charAt(i); + if (a != b) { + return a - b; + } + } + + return cs1.length() - cs2.length(); } @Override - protected void checkType() { - if (leftPointReaderDataType == TSDataType.BOOLEAN) { - throw new UnSupportedDataTypeException(leftPointReader.getDataType().toString()); + protected final void checkType() { + if (leftPointReaderDataType.equals(rightPointReaderDataType)) { + return; + } + + if (leftPointReaderDataType.equals(TSDataType.BOOLEAN) + || rightPointReaderDataType.equals(TSDataType.BOOLEAN)) { + throw new UnSupportedDataTypeException(TSDataType.BOOLEAN.toString()); } - if (rightPointReaderDataType == TSDataType.BOOLEAN) { - throw new UnSupportedDataTypeException(rightPointReader.getDataType().toString()); + if (leftPointReaderDataType.equals(TSDataType.TEXT) + || rightPointReaderDataType.equals(TSDataType.TEXT)) { + throw new UnSupportedDataTypeException(TSDataType.TEXT.toString()); } } @Override protected final void transformAndCache() throws QueryProcessException, IOException { - cachedBoolean = - evaluate( - castCurrentValueToDoubleOperand(leftPointReader, leftPointReaderDataType), - castCurrentValueToDoubleOperand(rightPointReader, rightPointReaderDataType)); + cachedBoolean = evaluator.evaluate(); } - abstract boolean evaluate(double leftOperand, double rightOperand); - @Override public TSDataType getDataType() { return TSDataType.BOOLEAN; 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 8484df276c..af6b2c8d65 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 @@ -20,8 +20,6 @@ package org.apache.iotdb.db.query.udf.core.transformer.binary; 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; public class CompareEqualToTransformer extends CompareBinaryTransformer { @@ -31,21 +29,20 @@ public class CompareEqualToTransformer extends CompareBinaryTransformer { } @Override - 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 Evaluator constructNumberEvaluator() { + return () -> + Double.compare( + castCurrentValueToDoubleOperand(leftPointReader, leftPointReaderDataType), + castCurrentValueToDoubleOperand(rightPointReader, rightPointReaderDataType)) + == 0; } @Override - protected boolean evaluate(double leftOperand, double rightOperand) { - return Double.compare(leftOperand, rightOperand) == 0; + protected Evaluator constructTextEvaluator() { + return () -> + compare( + leftPointReader.currentBinary().getStringValue(), + rightPointReader.currentBinary().getStringValue()) + == 0; } } diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterEqualTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterEqualTransformer.java index 7854143cff..1e98bfe423 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterEqualTransformer.java +++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterEqualTransformer.java @@ -29,7 +29,20 @@ public class CompareGreaterEqualTransformer extends CompareBinaryTransformer { } @Override - protected boolean evaluate(double leftOperand, double rightOperand) { - return Double.compare(leftOperand, rightOperand) >= 0; + protected Evaluator constructNumberEvaluator() { + return () -> + Double.compare( + castCurrentValueToDoubleOperand(leftPointReader, leftPointReaderDataType), + castCurrentValueToDoubleOperand(rightPointReader, rightPointReaderDataType)) + >= 0; + } + + @Override + protected Evaluator constructTextEvaluator() { + return () -> + compare( + leftPointReader.currentBinary().getStringValue(), + rightPointReader.currentBinary().getStringValue()) + >= 0; } } diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterThanTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterThanTransformer.java index 627c4b17bf..9e7a5ea3ba 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterThanTransformer.java +++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareGreaterThanTransformer.java @@ -29,7 +29,20 @@ public class CompareGreaterThanTransformer extends CompareBinaryTransformer { } @Override - protected boolean evaluate(double leftOperand, double rightOperand) { - return Double.compare(leftOperand, rightOperand) > 0; + protected Evaluator constructNumberEvaluator() { + return () -> + Double.compare( + castCurrentValueToDoubleOperand(leftPointReader, leftPointReaderDataType), + castCurrentValueToDoubleOperand(rightPointReader, rightPointReaderDataType)) + > 0; + } + + @Override + protected Evaluator constructTextEvaluator() { + return () -> + compare( + leftPointReader.currentBinary().getStringValue(), + rightPointReader.currentBinary().getStringValue()) + > 0; } } diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessEqualTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessEqualTransformer.java index 2b00dca3fb..0c53e86949 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessEqualTransformer.java +++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessEqualTransformer.java @@ -29,7 +29,20 @@ public class CompareLessEqualTransformer extends CompareBinaryTransformer { } @Override - protected boolean evaluate(double leftOperand, double rightOperand) { - return Double.compare(leftOperand, rightOperand) <= 0; + protected Evaluator constructNumberEvaluator() { + return () -> + Double.compare( + castCurrentValueToDoubleOperand(leftPointReader, leftPointReaderDataType), + castCurrentValueToDoubleOperand(rightPointReader, rightPointReaderDataType)) + <= 0; + } + + @Override + protected Evaluator constructTextEvaluator() { + return () -> + compare( + leftPointReader.currentBinary().getStringValue(), + rightPointReader.currentBinary().getStringValue()) + <= 0; } } diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessThanTransformer.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessThanTransformer.java index ea2ebeded5..9e77e2aa21 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessThanTransformer.java +++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/transformer/binary/CompareLessThanTransformer.java @@ -29,7 +29,20 @@ public class CompareLessThanTransformer extends CompareBinaryTransformer { } @Override - protected boolean evaluate(double leftOperand, double rightOperand) { - return Double.compare(leftOperand, rightOperand) < 0; + protected Evaluator constructNumberEvaluator() { + return () -> + Double.compare( + castCurrentValueToDoubleOperand(leftPointReader, leftPointReaderDataType), + castCurrentValueToDoubleOperand(rightPointReader, rightPointReaderDataType)) + < 0; + } + + @Override + protected Evaluator constructTextEvaluator() { + return () -> + compare( + leftPointReader.currentBinary().getStringValue(), + rightPointReader.currentBinary().getStringValue()) + < 0; } } 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 795b011bdc..024c54deb5 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 @@ -21,7 +21,6 @@ package org.apache.iotdb.db.query.udf.core.transformer.binary; 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; public class CompareNonEqualTransformer extends CompareBinaryTransformer { @@ -32,21 +31,20 @@ public class CompareNonEqualTransformer extends CompareBinaryTransformer { } @Override - 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 Evaluator constructNumberEvaluator() { + return () -> + Double.compare( + castCurrentValueToDoubleOperand(leftPointReader, leftPointReaderDataType), + castCurrentValueToDoubleOperand(rightPointReader, rightPointReaderDataType)) + != 0; } @Override - protected boolean evaluate(double leftOperand, double rightOperand) { - return Double.compare(leftOperand, rightOperand) != 0; + protected Evaluator constructTextEvaluator() { + return () -> + compare( + leftPointReader.currentBinary().getStringValue(), + rightPointReader.currentBinary().getStringValue()) + != 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 d8e1a36012..7eee752775 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 @@ -35,13 +35,9 @@ public abstract class LogicBinaryTransformer extends BinaryTransformer { @Override protected void checkType() { - if (leftPointReaderDataType != TSDataType.BOOLEAN) { - throw new UnSupportedDataTypeException( - "Unsupported data type: " + leftPointReader.getDataType().toString()); - } - if (rightPointReaderDataType != TSDataType.BOOLEAN) { - throw new UnSupportedDataTypeException( - "Unsupported data type: " + rightPointReader.getDataType().toString()); + if (leftPointReaderDataType != TSDataType.BOOLEAN + || rightPointReaderDataType != TSDataType.BOOLEAN) { + throw new UnSupportedDataTypeException("Unsupported data type: " + TSDataType.BOOLEAN); } }
