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

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

commit 145655744de1a5090c994d903adc309048bb0ba5
Author: JackieTien97 <jackietie...@gmail.com>
AuthorDate: Mon Nov 18 14:28:43 2024 +0800

    Support using long to compare timestamp type in  expression
---
 .../it/query/old/query/IoTDBInTableIT.java         | 89 ++++++++++++++++++----
 .../relational/ColumnTransformerBuilder.java       | 12 ++-
 .../predicate/ConvertPredicateToFilterVisitor.java |  9 ++-
 3 files changed, 95 insertions(+), 15 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/query/IoTDBInTableIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/query/IoTDBInTableIT.java
index 018405bcc92..b6c2297abd8 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/query/IoTDBInTableIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/query/IoTDBInTableIT.java
@@ -47,6 +47,7 @@ import java.util.Map;
 import static org.apache.iotdb.db.it.utils.TestUtils.defaultFormatDataTime;
 import static org.apache.iotdb.db.it.utils.TestUtils.prepareTableData;
 import static org.apache.iotdb.db.it.utils.TestUtils.tableAssertTestFail;
+import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
 import static org.junit.Assert.fail;
 
 @RunWith(IoTDBTestRunner.class)
@@ -57,19 +58,19 @@ public class IoTDBInTableIT {
       new String[] {
         "CREATE DATABASE " + DATABASE_NAME,
         "USE " + DATABASE_NAME,
-        "CREATE TABLE sg(device1 STRING ID, device2 STRING ID, qrcode TEXT 
MEASUREMENT, date_v DATE MEASUREMENT, blob_v BLOB MEASUREMENT)",
-        "insert into sg(time,device1,device2,qrcode,date_v,blob_v) 
values(1509465600000,'d1','s1','qrcode001', '2024-08-01', X'abc0')",
-        "insert into sg(time,device1,device2,qrcode,date_v,blob_v) 
values(1509465660000,'d1','s1','qrcode002', '2024-08-02', X'abc1')",
-        "insert into sg(time,device1,device2,qrcode,date_v,blob_v) 
values(1509465720000,'d1','s1','qrcode003', '2024-08-03', X'abc2')",
-        "insert into sg(time,device1,device2,qrcode,date_v,blob_v) 
values(1509465780000,'d1','s1','qrcode004', '2024-08-04', X'abc3')",
-        "insert into sg(time,device1,device2,qrcode,date_v,blob_v) 
values(1509465720000,'d1','s2','qrcode002', '2024-08-05', X'abc4')",
-        "insert into sg(time,device1,device2,qrcode,date_v,blob_v) 
values(1509465780000,'d1','s2','qrcode003', '2024-08-06', X'abc5')",
-        "insert into sg(time,device1,device2,qrcode,date_v,blob_v) 
values(1509465840000,'d1','s2','qrcode004', '2024-08-07', X'abc6')",
-        "insert into sg(time,device1,device2,qrcode,date_v,blob_v) 
values(1509465900000,'d1','s2','qrcode005', '2024-08-08', X'abc7')",
-        "insert into sg(time,device1,device2,qrcode,date_v,blob_v) 
values(1509465780000,'d2','s1','qrcode002', '2024-08-09', X'abc8')",
-        "insert into sg(time,device1,device2,qrcode,date_v,blob_v) 
values(1509465840000,'d2','s1','qrcode003', '2024-08-10', X'abc9')",
-        "insert into sg(time,device1,device2,qrcode,date_v,blob_v) 
values(1509465900000,'d2','s1','qrcode004', '2024-08-11', X'abca')",
-        "insert into sg(time,device1,device2,qrcode,date_v,blob_v) 
values(1509465960000,'d2','s1','qrcode005', '2024-08-12', X'abcb')",
+        "CREATE TABLE sg(device1 STRING ID, device2 STRING ID, qrcode TEXT 
MEASUREMENT, date_v DATE MEASUREMENT, blob_v BLOB MEASUREMENT, timestamp_v 
TIMESTAMP MEASUREMENT)",
+        "insert into sg(time,device1,device2,qrcode,date_v,blob_v,timestamp_v) 
values(1509465600000,'d1','s1','qrcode001', '2024-08-01', 
X'abc0',1509465600000)",
+        "insert into sg(time,device1,device2,qrcode,date_v,blob_v,timestamp_v) 
values(1509465660000,'d1','s1','qrcode002', '2024-08-02', 
X'abc1',1509465660000)",
+        "insert into sg(time,device1,device2,qrcode,date_v,blob_v,timestamp_v) 
values(1509465720000,'d1','s1','qrcode003', '2024-08-03', 
X'abc2',1509465720000)",
+        "insert into sg(time,device1,device2,qrcode,date_v,blob_v,timestamp_v) 
values(1509465780000,'d1','s1','qrcode004', '2024-08-04', 
X'abc3',1509465780000)",
+        "insert into sg(time,device1,device2,qrcode,date_v,blob_v,timestamp_v) 
values(1509465720000,'d1','s2','qrcode002', '2024-08-05', 
X'abc4',1509465720000)",
+        "insert into sg(time,device1,device2,qrcode,date_v,blob_v,timestamp_v) 
values(1509465780000,'d1','s2','qrcode003', '2024-08-06', 
X'abc5',1509465780000)",
+        "insert into sg(time,device1,device2,qrcode,date_v,blob_v,timestamp_v) 
values(1509465840000,'d1','s2','qrcode004', '2024-08-07', 
X'abc6',1509465840000)",
+        "insert into sg(time,device1,device2,qrcode,date_v,blob_v,timestamp_v) 
values(1509465900000,'d1','s2','qrcode005', '2024-08-08', 
X'abc7',1509465900000)",
+        "insert into sg(time,device1,device2,qrcode,date_v,blob_v,timestamp_v) 
values(1509465780000,'d2','s1','qrcode002', '2024-08-09', 
X'abc8',1509465780000)",
+        "insert into sg(time,device1,device2,qrcode,date_v,blob_v,timestamp_v) 
values(1509465840000,'d2','s1','qrcode003', '2024-08-10', 
X'abc9',1509465840000)",
+        "insert into sg(time,device1,device2,qrcode,date_v,blob_v,timestamp_v) 
values(1509465900000,'d2','s1','qrcode004', '2024-08-11', 
X'abca',1509465900000)",
+        "insert into sg(time,device1,device2,qrcode,date_v,blob_v,timestamp_v) 
values(1509465960000,'d2','s1','qrcode005', '2024-08-12', 
X'abcb',1509465960000)",
         "CREATE TABLE table1(device STRING ID, s1 INT32 MEASUREMENT, s2 INT64 
MEASUREMENT, s3 FLOAT MEASUREMENT, s4 DOUBLE MEASUREMENT, s5 BOOLEAN 
MEASUREMENT)",
       };
 
@@ -215,6 +216,68 @@ public class IoTDBInTableIT {
     }
   }
 
+  @Test
+  public void testTimestampIn() {
+    // select time,device1,device2,timestamp_v from sg where timestamp_v in 
(1509465600000)
+    // 1509465600000,'d1','s1',
+    String[] expectedHeader = new String[] {"time", "device1", "device2", 
"timestamp_v"};
+    String[] retArray =
+        new String[] {
+          "2017-10-31T16:00:00.000Z,d1,s1,2017-10-31T16:00:00.000Z,",
+        };
+    tableResultSetEqualTest(
+        "select time,device1,device2,timestamp_v from sg where timestamp_v in 
(1509465600000)",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select time,device1,device2,timestamp_v from sg where 
timestamp_v=1509465600000",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select time,device1,device2,timestamp_v from sg where 
timestamp_v=2017-11-01T00:00:00.000+08:00",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+    tableResultSetEqualTest(
+        "select time,device1,device2,timestamp_v from sg where 
timestamp_v=CAST('2017-11-01T00:00:00.000+08:00' AS TIMESTAMP)",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select time,device1,device2,timestamp_v from sg where timestamp_v in 
(1509465600000.0)",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    tableResultSetEqualTest(
+        "select time,device1,device2,timestamp_v from sg where 
timestamp_v=1509465600000.0",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+
+    retArray =
+        new String[] {
+          "2017-10-31T16:03:00.000Z,d1,s1,2017-10-31T16:03:00.000Z,",
+          "2017-10-31T16:03:00.000Z,d1,s2,2017-10-31T16:03:00.000Z,",
+          "2017-10-31T16:04:00.000Z,d1,s2,2017-10-31T16:04:00.000Z,",
+          "2017-10-31T16:05:00.000Z,d1,s2,2017-10-31T16:05:00.000Z,",
+          "2017-10-31T16:03:00.000Z,d2,s1,2017-10-31T16:03:00.000Z,",
+          "2017-10-31T16:04:00.000Z,d2,s1,2017-10-31T16:04:00.000Z,",
+          "2017-10-31T16:05:00.000Z,d2,s1,2017-10-31T16:05:00.000Z,",
+          "2017-10-31T16:06:00.000Z,d2,s1,2017-10-31T16:06:00.000Z,",
+        };
+    tableResultSetEqualTest(
+        "select time,device1,device2,timestamp_v from sg where timestamp_v not 
in 
(2017-11-01T00:00:00.000+08:00,1509465660000.0,CAST('2017-11-01T00:02:00.000+08:00'
 AS TIMESTAMP)) order by device1,device2,time",
+        expectedHeader,
+        retArray,
+        DATABASE_NAME);
+  }
+
   private List<Integer> checkHeader(
       ResultSetMetaData resultSetMetaData, String expectedHeaderStrings, int[] 
expectedTypes)
       throws SQLException {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
index f2df4aab0ff..9f9658c9b05 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java
@@ -1073,7 +1073,17 @@ public class ColumnTransformerBuilder
         Set<Long> timestampSet = new HashSet<>();
         for (Literal value : values) {
           try {
-            timestampSet.add(Long.parseLong(((GenericLiteral) 
value).getValue()));
+            if (value instanceof LongLiteral) {
+              timestampSet.add(((LongLiteral) value).getParsedValue());
+            } else if (value instanceof DoubleLiteral) {
+              timestampSet.add((long) ((DoubleLiteral) value).getValue());
+            } else if (value instanceof GenericLiteral) {
+              timestampSet.add(Long.parseLong(((GenericLiteral) 
value).getValue()));
+            } else {
+              throw new SemanticException(
+                  "InList Literal for TIMESTAMP can only be LongLiteral, 
DoubleLiteral and GenericLiteral, current is "
+                      + value.getClass().getSimpleName());
+            }
           } catch (IllegalArgumentException e) {
             throw new SemanticException(String.format(errorMsg, value, 
childType));
           }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertPredicateToFilterVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertPredicateToFilterVisitor.java
index f1384a1997a..c9f65d26427 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertPredicateToFilterVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertPredicateToFilterVisitor.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate;
 
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
+import org.apache.iotdb.db.exception.sql.SemanticException;
 import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnSchema;
 import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol;
 import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BetweenPredicate;
@@ -374,8 +375,14 @@ public class ConvertPredicateToFilterVisitor
   public static Long getTimestampValue(Expression expression) {
     if (expression instanceof LongLiteral) {
       return ((LongLiteral) expression).getParsedValue();
-    } else {
+    } else if (expression instanceof DoubleLiteral) {
+      return (long) ((DoubleLiteral) expression).getValue();
+    } else if (expression instanceof GenericLiteral) {
       return Long.valueOf(((GenericLiteral) expression).getValue());
+    } else {
+      throw new SemanticException(
+          "InList Literal for TIMESTAMP can only be LongLiteral, DoubleLiteral 
and GenericLiteral, current is "
+              + expression.getClass().getSimpleName());
     }
   }
 

Reply via email to