You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2022/12/19 07:32:15 UTC

[iotdb] branch IOTDB-5236 created (now 70cac1f7f8)

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

haonan pushed a change to branch IOTDB-5236
in repository https://gitbox.apache.org/repos/asf/iotdb.git


      at 70cac1f7f8 [IOTDB-5236] Fix DeleteData Python API cannot work

This branch includes the following new commits:

     new 70cac1f7f8 [IOTDB-5236] Fix DeleteData Python API cannot work

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[iotdb] 01/01: [IOTDB-5236] Fix DeleteData Python API cannot work

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

haonan pushed a commit to branch IOTDB-5236
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 70cac1f7f88f1dcd14dc1fa4af8259b183e8af95
Author: HTHou <hh...@outlook.com>
AuthorDate: Mon Dec 19 15:32:01 2022 +0800

    [IOTDB-5236] Fix DeleteData Python API cannot work
---
 client-py/iotdb/Session.py          |  26 ++++--
 client-py/tests/test_delete_data.py | 162 ++++++++++++++++++++++++++++++++++++
 2 files changed, 183 insertions(+), 5 deletions(-)

diff --git a/client-py/iotdb/Session.py b/client-py/iotdb/Session.py
index a1254e227c..c1de63a8a5 100644
--- a/client-py/iotdb/Session.py
+++ b/client-py/iotdb/Session.py
@@ -99,7 +99,7 @@ class Session(object):
         self.__statement_id = None
         self.__zone_id = zone_id
 
-    def open(self, enable_rpc_compression):
+    def open(self, enable_rpc_compression=False):
         if not self.__is_close:
             return
         self.__transport = TTransport.TFramedTransport(
@@ -351,13 +351,29 @@ class Session(object):
         data_set.close_operation_handle()
         return result
 
-    def delete_data(self, paths_list, timestamp):
+    def delete_data(self, paths_list, end_time):
         """
-        delete all data <= time in multiple time series
+        delete all data <= end_time in multiple time series
         :param paths_list: time series list that the data in.
-        :param timestamp: data with time stamp less than or equal to time will be deleted.
+        :param end_time: data with time stamp less than or equal to time will be deleted.
         """
-        request = TSDeleteDataReq(self.__session_id, paths_list, timestamp)
+        request = TSDeleteDataReq(self.__session_id, paths_list, 0x8000000000000000, end_time)
+        try:
+            status = self.__client.deleteData(request)
+            logger.debug(
+                "delete data from {}, message: {}".format(paths_list, status.message)
+            )
+        except TTransport.TException as e:
+            logger.exception("data deletion fails because: ", e)
+
+    def delete_data(self, paths_list, start_time, end_time):
+        """
+        delete data >= start_time and data <= end_time in multiple timeseries
+        :param paths_list: time series list that the data in.
+        :param start_time: delete range start time.
+        :param end_time: delete range end time.
+        """
+        request = TSDeleteDataReq(self.__session_id, paths_list, start_time, end_time)
         try:
             status = self.__client.deleteData(request)
             logger.debug(
diff --git a/client-py/tests/test_delete_data.py b/client-py/tests/test_delete_data.py
new file mode 100644
index 0000000000..38ccebe4ed
--- /dev/null
+++ b/client-py/tests/test_delete_data.py
@@ -0,0 +1,162 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# Uncomment the following line to use apache-iotdb module installed by pip3
+
+from iotdb.Session import Session
+from iotdb.IoTDBContainer import IoTDBContainer
+
+# whether the test has passed
+final_flag = True
+failed_count = 0
+
+
+def test_fail():
+    global failed_count
+    global final_flag
+    final_flag = False
+    failed_count += 1
+
+
+def print_message(message):
+    print("*********")
+    print(message)
+    print("*********")
+
+
+def test_delete_date():
+    with IoTDBContainer("iotdb:dev") as db:
+        db: IoTDBContainer
+        session = Session(db.get_container_host_ip(), db.get_exposed_port(6667))
+        session.open()
+        session.execute_non_query_statement("CREATE DATABASE root.str_test_01")
+
+        if not session.is_open():
+            print("can't open session")
+            exit(1)
+
+        # insert string records of one device
+        time_list = [1, 2, 3]
+        measurements_list = [
+            ["s_01", "s_02", "s_03"],
+            ["s_01", "s_02", "s_03"],
+            ["s_01", "s_02", "s_03"],
+        ]
+        values_list = [
+            ["False", "22", "33"],
+            ["True", "1", "23"],
+            ["False", "15", "26"],
+        ]
+
+        if (
+            session.insert_string_records_of_one_device(
+                "root.str_test_01.d_01",
+                time_list,
+                measurements_list,
+                values_list,
+            )
+            < 0
+        ):
+            test_fail()
+            print_message("insert string records of one device failed")
+
+        # insert aligned string record into the database.
+        time_list = [1, 2, 3]
+        measurements_list = [
+            ["s_01", "s_02", "s_03"],
+            ["s_01", "s_02", "s_03"],
+            ["s_01", "s_02", "s_03"],
+        ]
+        values_list = [
+            ["False", "22", "33"],
+            ["True", "1", "23"],
+            ["False", "15", "26"],
+        ]
+
+        if (
+            session.insert_aligned_string_records_of_one_device(
+                "root.str_test_01.d_02",
+                time_list,
+                measurements_list,
+                values_list,
+            )
+            < 0
+        ):
+            test_fail()
+            print_message("insert aligned record of one device failed")
+
+        # execute delete data
+        session.delete_data(["root.str_test_01.d_02.s_01", "root.str_test_01.d_02.s_02"], 1)
+
+        # execute raw data query sql statement
+        session_data_set = session.execute_raw_data_query(
+            ["root.str_test_01.d_02.s_01", "root.str_test_01.d_02.s_02"], 1, 4
+        )
+        session_data_set.set_fetch_size(1024)
+        expect_count = 2
+        actual_count = 0
+        while session_data_set.has_next():
+            print(session_data_set.next())
+            actual_count += 1
+        session_data_set.close_operation_handle()
+
+        if actual_count != expect_count:
+            test_fail()
+            print_message(
+                "query count mismatch: expect count: "
+                + str(expect_count)
+                + " actual count: "
+                + str(actual_count)
+            )
+        assert actual_count == expect_count
+
+        # execute delete data
+        session.delete_data(["root.str_test_01.d_02.s_01", "root.str_test_01.d_02.s_02"], 2, 3)
+
+        # execute raw data query sql statement
+        session_data_set = session.execute_raw_data_query(
+            ["root.str_test_01.d_02.s_01", "root.str_test_01.d_02.s_02"], 1, 4
+        )
+        session_data_set.set_fetch_size(1024)
+        expect_count = 0
+        actual_count = 0
+        while session_data_set.has_next():
+            print(session_data_set.next())
+            actual_count += 1
+        session_data_set.close_operation_handle()
+
+        if actual_count != expect_count:
+            test_fail()
+            print_message(
+                "query count mismatch: expect count: "
+                + str(expect_count)
+                + " actual count: "
+                + str(actual_count)
+            )
+        assert actual_count == expect_count
+
+        # close session connection.
+        session.close()
+
+
+if final_flag:
+    print("All executions done!!")
+else:
+    print("Some test failed, please have a check")
+    print("failed count: ", failed_count)
+    exit(1)