You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2022/05/13 09:47:33 UTC
[iotdb] 02/02: support comparing BOOLEAN and TEXT
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 <ro...@apache.org>
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);
}
}