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