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