You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tsfile.apache.org by co...@apache.org on 2025/05/11 13:57:41 UTC

(tsfile) branch colin_fix_schema_check created (now 1de81787)

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

colinlee pushed a change to branch colin_fix_schema_check
in repository https://gitbox.apache.org/repos/asf/tsfile.git


      at 1de81787 add table/column schema check.

This branch includes the following new commits:

     new 1de81787 add table/column schema check.

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.



(tsfile) 01/01: add table/column schema check.

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

colinlee pushed a commit to branch colin_fix_schema_check
in repository https://gitbox.apache.org/repos/asf/tsfile.git

commit 1de81787e59e5144c8b49738f906db9b8217f5d7
Author: ColinLee <sh...@163.com>
AuthorDate: Sun May 11 21:57:10 2025 +0800

    add table/column schema check.
---
 python/tests/test_basic.py | 34 ++++++++++++++++++++++++++++++----
 python/tsfile/schema.py    |  8 ++++++++
 python/tsfile/tablet.py    |  3 ++-
 3 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py
index e92836fc..842a8fb4 100644
--- a/python/tests/test_basic.py
+++ b/python/tests/test_basic.py
@@ -20,16 +20,17 @@ import pytest
 from tsfile import schema, Field
 from tsfile import Tablet
 from tsfile.constants import *
+from tsfile.schema import *
 
 
 def test_tablet():
-    column_names = ["temp1", "temp2", "value1", "value2"]
-    data_types = [TSDataType.INT32, TSDataType.INT64, TSDataType.FLOAT, TSDataType.DOUBLE]
+    column_names = ["temp1", "temp2", "value1", "value2", "string1"]
+    data_types = [TSDataType.INT32, TSDataType.INT64, TSDataType.FLOAT, TSDataType.DOUBLE, TSDataType.STRING]
     tablet = Tablet(column_names, data_types)
     tablet.set_table_name("test")
 
     assert "test" == tablet.get_target_name()
-    assert 4 == len(tablet.get_column_name_list())
+    assert 5 == len(tablet.get_column_name_list())
     assert TSDataType.INT32 == tablet.get_data_type_list()[0]
 
     tablet.add_timestamp(0, 10)
@@ -37,12 +38,14 @@ def test_tablet():
     tablet.add_value_by_name("temp2", 0, 100)
     tablet.add_value_by_index(2, 0, 0.1)
     tablet.add_value_by_index(3, 0, 0.1)
+    tablet.add_value_by_index(4, 0, "test")
+    tablet.add_value_by_name("string1", 0, "test")
     # Illegal column name
     with pytest.raises(ValueError):
         tablet.add_value_by_name("temp3", 0, 10)
     # Illegal exists column index
     with pytest.raises(IndexError):
-        tablet.add_value_by_index(4, 0, 10)
+        tablet.add_value_by_index(5, 0, 10)
     # Illegal row index
     with pytest.raises(IndexError):
         tablet.add_value_by_name("temp1", 2048, 10)
@@ -87,6 +90,29 @@ def test_field():
     with pytest.raises(OverflowError):
         field_int64.get_int_value()
 
+def test_schema():
+    column1 = ColumnSchema("device", TSDataType.STRING, ColumnCategory.TAG)
+    column2 = ColumnSchema("sensor", TSDataType.STRING, ColumnCategory.TAG)
+    # Default by FIELD.
+    column3 = ColumnSchema("value1", TSDataType.DOUBLE)
+    column4 = ColumnSchema("value2", TSDataType.INT32, ColumnCategory.FIELD)
+    table = TableSchema("test_table", [column1, column2, column3, column4])
+
+    assert column3.get_category() == ColumnCategory.FIELD
+    assert column4.__str__() == "ColumnSchema(value2, INT32, FIELD)"
+
+    with pytest.raises(ValueError):
+        tablet = TableSchema("", [column1, column2, column3, column4])
+
+    with pytest.raises(ValueError):
+        tablet = TableSchema("test_table", [])
+
+    with pytest.raises(ValueError):
+        column = ColumnSchema("test_column",None, ColumnCategory.TAG)
+
+    with pytest.raises(ValueError):
+        tablet = TableSchema("test_table", [ColumnSchema("", TSDataType.DOUBLE)])
+
 
 
 
diff --git a/python/tsfile/schema.py b/python/tsfile/schema.py
index 62d5d754..90484a28 100644
--- a/python/tsfile/schema.py
+++ b/python/tsfile/schema.py
@@ -74,7 +74,11 @@ class ColumnSchema:
     data_type = None
 
     def __init__(self, column_name: str, data_type: TSDataType, category: ColumnCategory = ColumnCategory.FIELD):
+        if column_name is None or len(column_name) == 0:
+            raise ValueError("Column name cannot be None")
         self.column_name = column_name.lower()
+        if data_type is None:
+            raise ValueError("Data type cannot be None")
         self.data_type = data_type
         self.category = category
 
@@ -97,7 +101,11 @@ class TableSchema:
     columns = None
 
     def __init__(self, table_name: str, columns: List[ColumnSchema]):
+        if table_name is None or len(table_name) == 0:
+            raise ValueError("Table name cannot be None")
         self.table_name = table_name.lower()
+        if len(columns) == 0 or len(columns) == 0:
+            raise ValueError("Columns cannot be empty")
         self.columns = columns
 
     def get_table_name(self):
diff --git a/python/tsfile/tablet.py b/python/tsfile/tablet.py
index 2935db09..52e7389c 100644
--- a/python/tsfile/tablet.py
+++ b/python/tsfile/tablet.py
@@ -137,7 +137,8 @@ class Tablet(object):
         if not isinstance(value, expected_type.to_py_type()):
             raise TypeError(f"Expected {expected_type.to_py_type()} got {type(value)}")
 
-        self._check_numeric_range(value, expected_type)
+        if expected_type in (TSDataType.INT32, TSDataType.INT64, TSDataType.FLOAT, TSDataType.DOUBLE):
+            self._check_numeric_range(value, expected_type)
 
         self.data_list[col_index][row_index] = value