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

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

commit cdd4aae408898c6dd8dbec40a776e5726be43fd6
Author: JackieTien97 <[email protected]>
AuthorDate: Mon Aug 26 16:01:53 2024 +0800

    Support boolean in not between and
---
 .../it/query/recent/IoTDBNullIdQueryIT.java        | 26 ++++++++++++++++++++++
 .../relational/metadata/TableMetadataImpl.java     |  4 ++++
 .../binary/CompareBinaryColumnTransformer.java     |  3 ++-
 .../column/ternary/BetweenColumnTransformer.java   | 17 +++++++++++++-
 .../ternary/CompareTernaryColumnTransformer.java   | 14 +-----------
 5 files changed, 49 insertions(+), 15 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBNullIdQueryIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBNullIdQueryIT.java
index b741f8f7b68..36c02ebec8e 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBNullIdQueryIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBNullIdQueryIT.java
@@ -156,6 +156,32 @@ public class IoTDBNullIdQueryIT {
 
       assertEquals(result, ans);
       assertFalse(resultSet.next());
+
+      // Test boolean between
+      resultSet =
+          statement.executeQuery("select * from testNullId where s2 between 
false and true");
+      result = defaultFormatDataTime(1) + ",null,null,0,false,11.1";
+      assertTrue(resultSet.next());
+      ans =
+          resultSet.getString("time")
+              + ","
+              + resultSet.getString("id1")
+              + ","
+              + resultSet.getString("id2")
+              + ","
+              + resultSet.getString("s1")
+              + ","
+              + resultSet.getString("s2")
+              + ","
+              + resultSet.getString("s3");
+
+      assertEquals(result, ans);
+      assertFalse(resultSet.next());
+
+      // Test boolean not between
+      resultSet =
+          statement.executeQuery("select * from testNullId where s2 not 
between false and true");
+      assertFalse(resultSet.next());
     }
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
index 6669dcc8a4a..1fe3773aee5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java
@@ -681,6 +681,10 @@ public class TableMetadataImpl implements Metadata {
     return BlobType.BLOB.equals(type);
   }
 
+  public static boolean isBool(Type type) {
+    return BOOLEAN.equals(type);
+  }
+
   public static boolean isSupportedMathNumericType(Type type) {
     return DOUBLE.equals(type) || FLOAT.equals(type) || INT32.equals(type) || 
INT64.equals(type);
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java
index 04f6f87436f..a3bce0765e6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java
@@ -29,6 +29,7 @@ import org.apache.tsfile.read.common.type.Type;
 import org.apache.tsfile.read.common.type.TypeEnum;
 
 import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isBlobType;
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isBool;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType;
 
 public abstract class CompareBinaryColumnTransformer extends 
BinaryColumnTransformer {
@@ -58,7 +59,7 @@ public abstract class CompareBinaryColumnTransformer extends 
BinaryColumnTransfo
                   TransformUtils.compare(
                       leftTransformer.getType().getBinary(leftColumn, i),
                       rightTransformer.getType().getBinary(rightColumn, i)));
-        } else if 
(TypeEnum.BOOLEAN.equals(leftTransformer.getType().getTypeEnum())) {
+        } else if (isBool(leftTransformer.getType())) {
           flag =
               transform(
                   Boolean.compare(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
index 889c742b895..68ff246a907 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
@@ -26,6 +26,8 @@ import org.apache.tsfile.block.column.Column;
 import org.apache.tsfile.block.column.ColumnBuilder;
 import org.apache.tsfile.read.common.type.Type;
 
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isBlobType;
+import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isBool;
 import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType;
 
 public class BetweenColumnTransformer extends CompareTernaryColumnTransformer {
@@ -51,7 +53,8 @@ public class BetweenColumnTransformer extends 
CompareTernaryColumnTransformer {
     for (int i = 0; i < positionCount; i++) {
       if (!firstColumn.isNull(i) && !secondColumn.isNull(i) && 
!thirdColumn.isNull(i)) {
         boolean flag;
-        if (isCharType(firstColumnTransformer.getType())) {
+        if (isCharType(firstColumnTransformer.getType())
+            || isBlobType(firstColumnTransformer.getType())) {
           flag =
               ((TransformUtils.compare(
                               
firstColumnTransformer.getType().getBinary(firstColumn, i),
@@ -62,6 +65,18 @@ public class BetweenColumnTransformer extends 
CompareTernaryColumnTransformer {
                               
thirdColumnTransformer.getType().getBinary(thirdColumn, i))
                           <= 0))
                   ^ isNotBetween;
+        } else if (isBool(firstColumnTransformer.getType())) {
+
+          flag =
+              ((Boolean.compare(
+                              
firstColumnTransformer.getType().getBoolean(firstColumn, i),
+                              
secondColumnTransformer.getType().getBoolean(secondColumn, i))
+                          >= 0)
+                      && (Boolean.compare(
+                              
firstColumnTransformer.getType().getBoolean(firstColumn, i),
+                              
thirdColumnTransformer.getType().getBoolean(thirdColumn, i))
+                          <= 0))
+                  ^ isNotBetween;
         } else {
           flag =
               ((Double.compare(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/CompareTernaryColumnTransformer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/CompareTernaryColumnTransformer.java
index 86ab67d5cd1..26dabe9a7c5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/CompareTernaryColumnTransformer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/CompareTernaryColumnTransformer.java
@@ -23,8 +23,6 @@ import 
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransform
 
 import org.apache.tsfile.read.common.type.Type;
 
-import static 
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType;
-
 public abstract class CompareTernaryColumnTransformer extends 
TernaryColumnTransformer {
   protected CompareTernaryColumnTransformer(
       Type returnType,
@@ -36,16 +34,6 @@ public abstract class CompareTernaryColumnTransformer 
extends TernaryColumnTrans
 
   @Override
   protected final void checkType() {
-    if (firstColumnTransformer.isReturnTypeNumeric()
-            && secondColumnTransformer.isReturnTypeNumeric()
-            && thirdColumnTransformer.isReturnTypeNumeric()
-        || isCharType(firstColumnTransformer.getType())
-            && isCharType(secondColumnTransformer.getType())
-            && isCharType(thirdColumnTransformer.getType())) {
-      return;
-    }
-
-    throw new UnsupportedOperationException(
-        "The Type of three subExpression should be all Numeric or Text");
+    // do nothing, type should be checked in plan stage
   }
 }

Reply via email to