This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch ty/TableModelGrammar in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 02f7b8b6e7da136b8600687496999df733901c7a Author: Haonan <[email protected]> AuthorDate: Wed Jul 24 11:18:40 2024 +0800 Deprecate template APIs in Python SDK (#13009) (cherry picked from commit 8df0c79df6a927e16380b0b2bda456ad54de0c42) --- iotdb-client/client-py/README.md | 89 +---------------- iotdb-client/client-py/SessionExample.py | 28 ------ iotdb-client/client-py/iotdb/Session.py | 67 +++++++++++++ .../client-py/iotdb/template/InternalNode.py | 41 -------- .../client-py/iotdb/template/MeasurementNode.py | 9 ++ iotdb-client/client-py/iotdb/template/Template.py | 8 ++ .../client-py/iotdb/template/TemplateNode.py | 8 ++ iotdb-client/client-py/tests/test_template.py | 110 --------------------- 8 files changed, 94 insertions(+), 266 deletions(-) diff --git a/iotdb-client/client-py/README.md b/iotdb-client/client-py/README.md index cc23ebff2a3..8c6192834cc 100644 --- a/iotdb-client/client-py/README.md +++ b/iotdb-client/client-py/README.md @@ -312,91 +312,6 @@ session.execute_non_query_statement(sql) session.execute_statement(sql) ``` -### Device Template -#### Create Device Template -The step for creating a metadata template is as follows -1. Create the template class -2. Adding child Nodeļ¼InternalNode and MeasurementNode can be chose -3. Execute create device template function - -```python -template = Template(name=template_name, share_time=True) - -i_node_gps = InternalNode(name="GPS", share_time=False) -i_node_v = InternalNode(name="vehicle", share_time=True) -m_node_x = MeasurementNode("x", TSDataType.FLOAT, TSEncoding.RLE, Compressor.SNAPPY) - -i_node_gps.add_child(m_node_x) -i_node_v.add_child(m_node_x) - -template.add_template(i_node_gps) -template.add_template(i_node_v) -template.add_template(m_node_x) - -session.create_schema_template(template) -``` -#### Modify Device Template nodes -Modify nodes in a template, the template must be already created. These are functions that add or delete some measurement nodes. -* add node in template -```python -session.add_measurements_in_template(template_name, measurements_path, data_types, encodings, compressors, is_aligned) -``` - -* delete node in template -```python -session.delete_node_in_template(template_name, path) -``` - -#### Set Device Template -```python -session.set_schema_template(template_name, prefix_path) -``` - -#### Uset Device Template -```python -session.unset_schema_template(template_name, prefix_path) -``` - -#### Show Device Template -* Show all device templates -```python -session.show_all_templates() -``` -* Count all nodes in templates -```python -session.count_measurements_in_template(template_name) -``` - -* Judge whether the path is measurement or not in templates, This measurement must be in the template -```python -session.count_measurements_in_template(template_name, path) -``` - -* Judge whether the path is exist or not in templates, This path may not belong to the template -```python -session.is_path_exist_in_template(template_name, path) -``` - -* Show nodes under in device template -```python -session.show_measurements_in_template(template_name) -``` - -* Show the path prefix where a device template is set -```python -session.show_paths_template_set_on(template_name) -``` - -* Show the path prefix where a device template is used (i.e. the time series has been created) -```python -session.show_paths_template_using_on(template_name) -``` - -#### Drop Device Template -Delete an existing metadata templateļ¼dropping an already set template is not supported -```python -session.drop_schema_template("template_python") -``` ### Pandas Support @@ -601,9 +516,9 @@ This is an example of how to connect to IoTDB with python, using the thrift rpc ### Prerequisites -Python3.7 or later is preferred. +Python3.6 or later is preferred. -You have to install Thrift (0.11.0 or later) to compile our thrift file into python code. Below is the official tutorial of installation, eventually, you should have a thrift executable. +You have to install Thrift (0.14.1 or later) to compile our thrift file into python code. Below is the official tutorial of installation, eventually, you should have a thrift executable. ``` http://thrift.apache.org/docs/install/ diff --git a/iotdb-client/client-py/SessionExample.py b/iotdb-client/client-py/SessionExample.py index d7223b16146..c489fe7d03d 100644 --- a/iotdb-client/client-py/SessionExample.py +++ b/iotdb-client/client-py/SessionExample.py @@ -20,8 +20,6 @@ import numpy as np from iotdb.Session import Session -from iotdb.template.MeasurementNode import MeasurementNode -from iotdb.template.Template import Template from iotdb.utils.BitMap import BitMap from iotdb.utils.IoTDBConstants import TSDataType, TSEncoding, Compressor from iotdb.utils.Tablet import Tablet @@ -365,32 +363,6 @@ with session.execute_last_data_query( # delete database session.delete_storage_group("root.sg_test_01") -# create template -template = Template(name="template_python", share_time=False) -m_node_1 = MeasurementNode( - name="s1", - data_type=TSDataType.INT64, - encoding=TSEncoding.RLE, - compression_type=Compressor.SNAPPY, -) -m_node_2 = MeasurementNode( - name="s2", - data_type=TSDataType.INT64, - encoding=TSEncoding.RLE, - compression_type=Compressor.SNAPPY, -) -m_node_3 = MeasurementNode( - name="s3", - data_type=TSDataType.INT64, - encoding=TSEncoding.RLE, - compression_type=Compressor.SNAPPY, -) -template.add_template(m_node_1) -template.add_template(m_node_2) -template.add_template(m_node_3) -session.create_schema_template(template) -print("create template success template_python") - # close session connection. session.close() diff --git a/iotdb-client/client-py/iotdb/Session.py b/iotdb-client/client-py/iotdb/Session.py index 0a3bf41b224..5aca06c2781 100644 --- a/iotdb-client/client-py/iotdb/Session.py +++ b/iotdb-client/client-py/iotdb/Session.py @@ -20,6 +20,7 @@ import logging import random import struct import time +import warnings from thrift.protocol import TBinaryProtocol, TCompactProtocol from thrift.transport import TSocket, TTransport @@ -60,6 +61,7 @@ from .thrift.rpc.ttypes import ( from .utils.IoTDBConnectionException import IoTDBConnectionException logger = logging.getLogger("IoTDB") +warnings.simplefilter("always", DeprecationWarning) class Session(object): @@ -1810,6 +1812,11 @@ class Session(object): return request def create_schema_template(self, template: Template): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ create device template, users using this method should use the template class as an argument :param template: The template contains multiple child node(see Template.py) @@ -1833,6 +1840,11 @@ class Session(object): raise IoTDBConnectionException(self.connection_error_msg()) from None def drop_schema_template(self, template_name: str): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ drop device template, this method should be used to the template unset anything :param template_name: template name @@ -1861,6 +1873,11 @@ class Session(object): compressors: list, is_aligned: bool = False, ): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ add measurements in the template, the template must already create. This function adds some measurements' node. :param template_name: template name, string list, like ["name_x", "name_y", "name_z"] @@ -1895,6 +1912,11 @@ class Session(object): raise IoTDBConnectionException(self.connection_error_msg()) from None def delete_node_in_template(self, template_name: str, path: str): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ delete a node in the template, this node must be already in the template :param template_name: template name @@ -1916,6 +1938,11 @@ class Session(object): raise IoTDBConnectionException(self.connection_error_msg()) from None def set_schema_template(self, template_name, prefix_path): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ set template in prefix path, template already exit, prefix path is not measurements :param template_name: template name @@ -1937,6 +1964,11 @@ class Session(object): raise IoTDBConnectionException(self.connection_error_msg()) from None def unset_schema_template(self, template_name, prefix_path): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ unset device template from prefix path, this method unsetting the template from entities, which have already inserted records using the template, is not supported. @@ -1961,6 +1993,11 @@ class Session(object): raise IoTDBConnectionException(self.connection_error_msg()) from None def count_measurements_in_template(self, template_name: str): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ drop device template, this method should be used to the template unset anything :param template_name: template name @@ -1986,6 +2023,11 @@ class Session(object): raise IoTDBConnectionException(self.connection_error_msg()) from None def is_measurement_in_template(self, template_name: str, path: str): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ judge the node in the template is measurement or not, this node must in the template :param template_name: template name @@ -2014,6 +2056,11 @@ class Session(object): raise IoTDBConnectionException(self.connection_error_msg()) from None def is_path_exist_in_template(self, template_name: str, path: str): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ judge whether the node is a measurement or not in the template, this node must be in the template :param template_name: template name @@ -2039,6 +2086,11 @@ class Session(object): raise IoTDBConnectionException(self.connection_error_msg()) from None def show_measurements_in_template(self, template_name: str, pattern: str = ""): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ show all measurements under the pattern in template :param template_name: template name @@ -2067,6 +2119,11 @@ class Session(object): raise IoTDBConnectionException(self.connection_error_msg()) from None def show_all_templates(self): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ show all device templates """ @@ -2092,6 +2149,11 @@ class Session(object): raise IoTDBConnectionException(self.connection_error_msg()) from None def show_paths_template_set_on(self, template_name): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ show the path prefix where a device template is set :param template_name: @@ -2116,6 +2178,11 @@ class Session(object): raise IoTDBConnectionException(self.connection_error_msg()) from None def show_paths_template_using_on(self, template_name): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) """ show the path prefix where a device template is used :param template_name: diff --git a/iotdb-client/client-py/iotdb/template/InternalNode.py b/iotdb-client/client-py/iotdb/template/InternalNode.py deleted file mode 100644 index bac17ca90ab..00000000000 --- a/iotdb-client/client-py/iotdb/template/InternalNode.py +++ /dev/null @@ -1,41 +0,0 @@ -# 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. -# - -from .TemplateNode import TemplateNode - - -class InternalNode(TemplateNode): - def __init__(self, name, share_time): - super().__init__(name) - self.children = {} - self.share_time = share_time - - def add_child(self, node: TemplateNode): - if node.get_name() in self.children.keys(): - assert "Duplicated child of node in template." - - self.children.update({node.get_name(): node}) - - def delete_child(self, node): - self.children.pop(node.get_name(), None) - - def get_children(self): - return self.children - - def is_share_time(self): - return self.share_time diff --git a/iotdb-client/client-py/iotdb/template/MeasurementNode.py b/iotdb-client/client-py/iotdb/template/MeasurementNode.py index 7d96d4bc0d3..9c2de7a45b8 100644 --- a/iotdb-client/client-py/iotdb/template/MeasurementNode.py +++ b/iotdb-client/client-py/iotdb/template/MeasurementNode.py @@ -15,13 +15,17 @@ # specific language governing permissions and limitations # under the License. # +import warnings from iotdb.utils.IoTDBConstants import TSDataType, TSEncoding, Compressor from .TemplateNode import TemplateNode from ..tsfile.utils.ReadWriteIOUtils import ReadWriteUtils +warnings.simplefilter("always", DeprecationWarning) + class MeasurementNode(TemplateNode): + def __init__( self, name: str, @@ -29,6 +33,11 @@ class MeasurementNode(TemplateNode): encoding: TSEncoding, compression_type: Compressor, ): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) self.name = name self.data_type = data_type self.encoding = encoding diff --git a/iotdb-client/client-py/iotdb/template/Template.py b/iotdb-client/client-py/iotdb/template/Template.py index 38f883d03fb..0c226c7cb6d 100644 --- a/iotdb-client/client-py/iotdb/template/Template.py +++ b/iotdb-client/client-py/iotdb/template/Template.py @@ -17,15 +17,23 @@ # import struct +import warnings from .TemplateNode import TemplateNode from ..tsfile.common.constant.TsFileConstant import TsFileConstant from ..tsfile.utils.Pair import Pair from ..tsfile.utils.ReadWriteIOUtils import ReadWriteUtils +warnings.simplefilter("always", DeprecationWarning) + class Template: def __init__(self, name, share_time: bool = False): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) self.name = name self.children = dict() self.share_time = share_time diff --git a/iotdb-client/client-py/iotdb/template/TemplateNode.py b/iotdb-client/client-py/iotdb/template/TemplateNode.py index fb2372842e0..27552e005b8 100644 --- a/iotdb-client/client-py/iotdb/template/TemplateNode.py +++ b/iotdb-client/client-py/iotdb/template/TemplateNode.py @@ -15,6 +15,9 @@ # specific language governing permissions and limitations # under the License. # +import warnings + +warnings.simplefilter("always", DeprecationWarning) class TemplateNode(object): @@ -23,6 +26,11 @@ class TemplateNode(object): """ def __init__(self, name): + warnings.warn( + "The APIs about template are deprecated and will be removed in future versions. Use sql instead.", + DeprecationWarning, + stacklevel=2, + ) self.name = name def get_name(self): diff --git a/iotdb-client/client-py/tests/test_template.py b/iotdb-client/client-py/tests/test_template.py deleted file mode 100644 index 1b58bcdee1b..00000000000 --- a/iotdb-client/client-py/tests/test_template.py +++ /dev/null @@ -1,110 +0,0 @@ -# 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. -# -from iotdb.IoTDBContainer import IoTDBContainer -from iotdb.Session import Session -from iotdb.template.InternalNode import InternalNode -from iotdb.template.MeasurementNode import MeasurementNode -from iotdb.template.Template import Template -from iotdb.utils.IoTDBConstants import TSDataType, Compressor, TSEncoding - - -def test_template_create(): - with IoTDBContainer("iotdb:dev") as db: - db: IoTDBContainer - session = Session(db.get_container_host_ip(), db.get_exposed_port(6667)) - session.open(False) - - measurement_template_name = "template_python" - template = Template(name=measurement_template_name, share_time=False) - m_node_1 = MeasurementNode( - name="s1", - data_type=TSDataType.INT64, - encoding=TSEncoding.RLE, - compression_type=Compressor.SNAPPY, - ) - m_node_2 = MeasurementNode( - name="s2", - data_type=TSDataType.INT64, - encoding=TSEncoding.RLE, - compression_type=Compressor.SNAPPY, - ) - m_node_3 = MeasurementNode( - name="s3", - data_type=TSDataType.INT64, - encoding=TSEncoding.RLE, - compression_type=Compressor.SNAPPY, - ) - template.add_template(m_node_1) - template.add_template(m_node_2) - template.add_template(m_node_3) - session.create_schema_template(template) - - assert session.show_measurements_in_template(measurement_template_name) == [ - "s3", - "s1", - "s2", - ] - - session.drop_schema_template(measurement_template_name) - - session.close() - - -def test_set_template(): - with IoTDBContainer("iotdb:dev") as db: - db: IoTDBContainer - session = Session(db.get_container_host_ip(), db.get_exposed_port(6667)) - session.open(False) - - template_name = "set_template_python" - template = Template(name=template_name, share_time=False) - m_node_x = MeasurementNode( - name="x", - data_type=TSDataType.INT64, - encoding=TSEncoding.RLE, - compression_type=Compressor.SNAPPY, - ) - m_node_y = MeasurementNode( - name="y", - data_type=TSDataType.INT64, - encoding=TSEncoding.RLE, - compression_type=Compressor.SNAPPY, - ) - template.add_template(m_node_x) - template.add_template(m_node_y) - session.create_schema_template(template) - - session.execute_non_query_statement("CREATE DATABASE root.python") - - session.set_schema_template(template_name, "root.python.GPS") - session.execute_non_query_statement( - "create timeseries of device template on root.python.GPS" - ) - - assert session.show_paths_template_set_on(template_name) == ["root.python.GPS"] - assert session.show_paths_template_using_on(template_name) == [ - "root.python.GPS" - ] - - session.execute_non_query_statement( - "delete timeseries of device template from root.python.GPS" - ) - - session.unset_schema_template(template_name, "root.python.GPS") - session.drop_schema_template(template_name) - session.close()
