matrixone-python-sdk 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- matrixone/__init__.py +155 -0
- matrixone/account.py +723 -0
- matrixone/async_client.py +3913 -0
- matrixone/async_metadata_manager.py +311 -0
- matrixone/async_orm.py +123 -0
- matrixone/async_vector_index_manager.py +633 -0
- matrixone/base_client.py +208 -0
- matrixone/client.py +4672 -0
- matrixone/config.py +452 -0
- matrixone/connection_hooks.py +286 -0
- matrixone/exceptions.py +89 -0
- matrixone/logger.py +782 -0
- matrixone/metadata.py +820 -0
- matrixone/moctl.py +219 -0
- matrixone/orm.py +2277 -0
- matrixone/pitr.py +646 -0
- matrixone/pubsub.py +771 -0
- matrixone/restore.py +411 -0
- matrixone/search_vector_index.py +1176 -0
- matrixone/snapshot.py +550 -0
- matrixone/sql_builder.py +844 -0
- matrixone/sqlalchemy_ext/__init__.py +161 -0
- matrixone/sqlalchemy_ext/adapters.py +163 -0
- matrixone/sqlalchemy_ext/dialect.py +534 -0
- matrixone/sqlalchemy_ext/fulltext_index.py +895 -0
- matrixone/sqlalchemy_ext/fulltext_search.py +1686 -0
- matrixone/sqlalchemy_ext/hnsw_config.py +194 -0
- matrixone/sqlalchemy_ext/ivf_config.py +252 -0
- matrixone/sqlalchemy_ext/table_builder.py +351 -0
- matrixone/sqlalchemy_ext/vector_index.py +1721 -0
- matrixone/sqlalchemy_ext/vector_type.py +948 -0
- matrixone/version.py +580 -0
- matrixone_python_sdk-0.1.0.dist-info/METADATA +706 -0
- matrixone_python_sdk-0.1.0.dist-info/RECORD +122 -0
- matrixone_python_sdk-0.1.0.dist-info/WHEEL +5 -0
- matrixone_python_sdk-0.1.0.dist-info/entry_points.txt +5 -0
- matrixone_python_sdk-0.1.0.dist-info/licenses/LICENSE +200 -0
- matrixone_python_sdk-0.1.0.dist-info/top_level.txt +2 -0
- tests/__init__.py +19 -0
- tests/offline/__init__.py +20 -0
- tests/offline/conftest.py +77 -0
- tests/offline/test_account.py +703 -0
- tests/offline/test_async_client_query_comprehensive.py +1218 -0
- tests/offline/test_basic.py +54 -0
- tests/offline/test_case_sensitivity.py +227 -0
- tests/offline/test_connection_hooks_offline.py +287 -0
- tests/offline/test_dialect_schema_handling.py +609 -0
- tests/offline/test_explain_methods.py +346 -0
- tests/offline/test_filter_logical_in.py +237 -0
- tests/offline/test_fulltext_search_comprehensive.py +795 -0
- tests/offline/test_ivf_config.py +249 -0
- tests/offline/test_join_methods.py +281 -0
- tests/offline/test_join_sqlalchemy_compatibility.py +276 -0
- tests/offline/test_logical_in_method.py +237 -0
- tests/offline/test_matrixone_version_parsing.py +264 -0
- tests/offline/test_metadata_offline.py +557 -0
- tests/offline/test_moctl.py +300 -0
- tests/offline/test_moctl_simple.py +251 -0
- tests/offline/test_model_support_offline.py +359 -0
- tests/offline/test_model_support_simple.py +225 -0
- tests/offline/test_pinecone_filter_offline.py +377 -0
- tests/offline/test_pitr.py +585 -0
- tests/offline/test_pubsub.py +712 -0
- tests/offline/test_query_update.py +283 -0
- tests/offline/test_restore.py +445 -0
- tests/offline/test_snapshot_comprehensive.py +384 -0
- tests/offline/test_sql_escaping_edge_cases.py +551 -0
- tests/offline/test_sqlalchemy_integration.py +382 -0
- tests/offline/test_sqlalchemy_vector_integration.py +434 -0
- tests/offline/test_table_builder.py +198 -0
- tests/offline/test_unified_filter.py +398 -0
- tests/offline/test_unified_transaction.py +495 -0
- tests/offline/test_vector_index.py +238 -0
- tests/offline/test_vector_operations.py +688 -0
- tests/offline/test_vector_type.py +174 -0
- tests/offline/test_version_core.py +328 -0
- tests/offline/test_version_management.py +372 -0
- tests/offline/test_version_standalone.py +652 -0
- tests/online/__init__.py +20 -0
- tests/online/conftest.py +216 -0
- tests/online/test_account_management.py +194 -0
- tests/online/test_advanced_features.py +344 -0
- tests/online/test_async_client_interfaces.py +330 -0
- tests/online/test_async_client_online.py +285 -0
- tests/online/test_async_model_insert_online.py +293 -0
- tests/online/test_async_orm_online.py +300 -0
- tests/online/test_async_simple_query_online.py +802 -0
- tests/online/test_async_transaction_simple_query.py +300 -0
- tests/online/test_basic_connection.py +130 -0
- tests/online/test_client_online.py +238 -0
- tests/online/test_config.py +90 -0
- tests/online/test_config_validation.py +123 -0
- tests/online/test_connection_hooks_new_online.py +217 -0
- tests/online/test_dialect_schema_handling_online.py +331 -0
- tests/online/test_filter_logical_in_online.py +374 -0
- tests/online/test_fulltext_comprehensive.py +1773 -0
- tests/online/test_fulltext_label_online.py +433 -0
- tests/online/test_fulltext_search_online.py +842 -0
- tests/online/test_ivf_stats_online.py +506 -0
- tests/online/test_logger_integration.py +311 -0
- tests/online/test_matrixone_query_orm.py +540 -0
- tests/online/test_metadata_online.py +579 -0
- tests/online/test_model_insert_online.py +255 -0
- tests/online/test_mysql_driver_validation.py +213 -0
- tests/online/test_orm_advanced_features.py +2022 -0
- tests/online/test_orm_cte_integration.py +269 -0
- tests/online/test_orm_online.py +270 -0
- tests/online/test_pinecone_filter.py +708 -0
- tests/online/test_pubsub_operations.py +352 -0
- tests/online/test_query_methods.py +225 -0
- tests/online/test_query_update_online.py +433 -0
- tests/online/test_search_vector_index.py +557 -0
- tests/online/test_simple_fulltext_online.py +915 -0
- tests/online/test_snapshot_comprehensive.py +998 -0
- tests/online/test_sqlalchemy_engine_integration.py +336 -0
- tests/online/test_sqlalchemy_integration.py +425 -0
- tests/online/test_transaction_contexts.py +1219 -0
- tests/online/test_transaction_insert_methods.py +356 -0
- tests/online/test_transaction_query_methods.py +288 -0
- tests/online/test_unified_filter_online.py +529 -0
- tests/online/test_vector_comprehensive.py +706 -0
- tests/online/test_version_management.py +291 -0
matrixone/moctl.py
ADDED
@@ -0,0 +1,219 @@
|
|
1
|
+
# Copyright 2021 - 2022 Matrix Origin
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
"""
|
16
|
+
MatrixOne Control Operations (mo_ctl) Manager
|
17
|
+
|
18
|
+
Provides access to MatrixOne control operations that require sys tenant privileges.
|
19
|
+
|
20
|
+
IMPORTANT: All mo_ctl operations require 'sys' account privileges.
|
21
|
+
These operations cannot be executed with regular user accounts.
|
22
|
+
|
23
|
+
To use mo_ctl operations:
|
24
|
+
1. Connect with 'sys' account (e.g., 'sys#root' or account='sys')
|
25
|
+
2. Ensure proper administrative privileges
|
26
|
+
3. Operations may require specific tenant permissions
|
27
|
+
|
28
|
+
Example connection with sys account:
|
29
|
+
client.connect(host, port, 'sys#root', password, database)
|
30
|
+
# or
|
31
|
+
client.connect(host, port, 'root', password, database, account='sys')
|
32
|
+
"""
|
33
|
+
|
34
|
+
import json
|
35
|
+
from typing import Any, Dict
|
36
|
+
|
37
|
+
from .exceptions import MatrixOneError
|
38
|
+
|
39
|
+
|
40
|
+
class MoCtlError(MatrixOneError):
|
41
|
+
"""Raised when mo_ctl operations fail"""
|
42
|
+
|
43
|
+
pass
|
44
|
+
|
45
|
+
|
46
|
+
class MoCtlManager:
|
47
|
+
"""
|
48
|
+
Manager for MatrixOne control operations (mo_ctl).
|
49
|
+
|
50
|
+
This class provides access to MatrixOne's control operations through the
|
51
|
+
mo_ctl SQL function. It allows programmatic execution of various
|
52
|
+
MatrixOne administrative and maintenance operations.
|
53
|
+
|
54
|
+
⚠️ CRITICAL REQUIREMENT: All mo_ctl operations require 'sys' account privileges.
|
55
|
+
These operations cannot be executed with regular user accounts.
|
56
|
+
|
57
|
+
Key Features:
|
58
|
+
|
59
|
+
- Programmatic access to mo_ctl commands
|
60
|
+
- Table flush operations for data persistence
|
61
|
+
- Checkpoint operations for data consistency
|
62
|
+
- Integration with MatrixOne client operations
|
63
|
+
- Error handling and result parsing
|
64
|
+
|
65
|
+
Supported Operations:
|
66
|
+
|
67
|
+
- Table flush operations (flush_table)
|
68
|
+
- Incremental checkpoints (increment_checkpoint)
|
69
|
+
- Global checkpoints (global_checkpoint)
|
70
|
+
|
71
|
+
Usage Examples:
|
72
|
+
|
73
|
+
# IMPORTANT: Connect with sys account first
|
74
|
+
client = Client()
|
75
|
+
client.connect(host, port, 'sys#root', password, database)
|
76
|
+
|
77
|
+
# Initialize mo_ctl manager
|
78
|
+
moctl = client.moctl
|
79
|
+
|
80
|
+
# Flush a specific table
|
81
|
+
result = moctl.flush_table("database_name", "table_name")
|
82
|
+
|
83
|
+
# Force incremental checkpoint
|
84
|
+
result = moctl.increment_checkpoint()
|
85
|
+
|
86
|
+
# Force global checkpoint
|
87
|
+
result = moctl.global_checkpoint()
|
88
|
+
|
89
|
+
Requirements:
|
90
|
+
- Must connect with 'sys' account (e.g., 'sys#root' or account='sys')
|
91
|
+
- Requires appropriate administrative privileges
|
92
|
+
- Operations may require specific tenant permissions
|
93
|
+
|
94
|
+
Note: If you get permission errors, ensure you're connected with sys account:
|
95
|
+
client.connect(host, port, 'sys#root', password, database)
|
96
|
+
# or
|
97
|
+
client.connect(host, port, 'root', password, database, account='sys')
|
98
|
+
"""
|
99
|
+
|
100
|
+
def __init__(self, client):
|
101
|
+
"""
|
102
|
+
Initialize MoCtlManager
|
103
|
+
|
104
|
+
Args:
|
105
|
+
|
106
|
+
client: MatrixOne client instance
|
107
|
+
"""
|
108
|
+
self.client = client
|
109
|
+
|
110
|
+
def _execute_moctl(self, method: str, target: str, params: str = "") -> Dict[str, Any]:
|
111
|
+
"""
|
112
|
+
Execute mo_ctl command
|
113
|
+
|
114
|
+
Args:
|
115
|
+
|
116
|
+
method: Control method (e.g., 'dn')
|
117
|
+
target: Target operation (e.g., 'flush', 'checkpoint')
|
118
|
+
params: Parameters for the operation
|
119
|
+
|
120
|
+
Returns:
|
121
|
+
|
122
|
+
Parsed result from mo_ctl command
|
123
|
+
|
124
|
+
Raises:
|
125
|
+
|
126
|
+
MoCtlError: If the operation fails
|
127
|
+
"""
|
128
|
+
try:
|
129
|
+
# Build mo_ctl SQL command
|
130
|
+
if params:
|
131
|
+
sql = f"SELECT mo_ctl('{method}', '{target}', '{params}')"
|
132
|
+
else:
|
133
|
+
sql = f"SELECT mo_ctl('{method}', '{target}', '')"
|
134
|
+
|
135
|
+
# Execute the command
|
136
|
+
result = self.client.execute(sql)
|
137
|
+
|
138
|
+
if not result.rows:
|
139
|
+
raise MoCtlError(f"mo_ctl command returned no results: {sql}")
|
140
|
+
|
141
|
+
# Parse the JSON result
|
142
|
+
result_str = result.rows[0][0]
|
143
|
+
parsed_result = json.loads(result_str)
|
144
|
+
|
145
|
+
# Check for errors in the result
|
146
|
+
if "result" in parsed_result and parsed_result["result"]:
|
147
|
+
first_result = parsed_result["result"][0]
|
148
|
+
if "returnStr" in first_result and first_result["returnStr"] != "OK":
|
149
|
+
raise MoCtlError(f"mo_ctl operation failed: {first_result['returnStr']}")
|
150
|
+
|
151
|
+
return parsed_result
|
152
|
+
|
153
|
+
except json.JSONDecodeError as e:
|
154
|
+
raise MoCtlError(f"Failed to parse mo_ctl result: {e}")
|
155
|
+
except Exception as e:
|
156
|
+
raise MoCtlError(f"mo_ctl operation failed: {e}")
|
157
|
+
|
158
|
+
def flush_table(self, database: str, table: str) -> Dict[str, Any]:
|
159
|
+
"""
|
160
|
+
Force flush table.
|
161
|
+
|
162
|
+
Force flush table `table` in database `database`. It returns after all blks in the table are flushed.
|
163
|
+
|
164
|
+
⚠️ Requires 'sys' account privileges.
|
165
|
+
|
166
|
+
Args:
|
167
|
+
|
168
|
+
database: Database name
|
169
|
+
table: Table name
|
170
|
+
|
171
|
+
Returns:
|
172
|
+
|
173
|
+
Result of the flush operation
|
174
|
+
|
175
|
+
Example:
|
176
|
+
|
177
|
+
>>> client.moctl.flush_table('db1', 't')
|
178
|
+
{'method': 'Flush', 'result': [{'returnStr': 'OK'}]}
|
179
|
+
"""
|
180
|
+
table_ref = f"{database}.{table}"
|
181
|
+
return self._execute_moctl("dn", "flush", table_ref)
|
182
|
+
|
183
|
+
def increment_checkpoint(self) -> Dict[str, Any]:
|
184
|
+
"""
|
185
|
+
Force incremental checkpoint.
|
186
|
+
|
187
|
+
Flush all blks in DN, generate an Incremental Checkpoint and truncate WAL.
|
188
|
+
|
189
|
+
⚠️ Requires 'sys' account privileges.
|
190
|
+
|
191
|
+
Returns:
|
192
|
+
|
193
|
+
Result of the incremental checkpoint operation
|
194
|
+
|
195
|
+
Example:
|
196
|
+
|
197
|
+
>>> client.moctl.increment_checkpoint()
|
198
|
+
{'method': 'Checkpoint', 'result': [{'returnStr': 'OK'}]}
|
199
|
+
"""
|
200
|
+
return self._execute_moctl("dn", "checkpoint", "")
|
201
|
+
|
202
|
+
def global_checkpoint(self) -> Dict[str, Any]:
|
203
|
+
"""
|
204
|
+
Force global checkpoint.
|
205
|
+
|
206
|
+
Generate a global checkpoint across all nodes.
|
207
|
+
|
208
|
+
⚠️ Requires 'sys' account privileges.
|
209
|
+
|
210
|
+
Returns:
|
211
|
+
|
212
|
+
Result of the global checkpoint operation
|
213
|
+
|
214
|
+
Example:
|
215
|
+
|
216
|
+
>>> client.moctl.global_checkpoint()
|
217
|
+
{'method': 'GlobalCheckpoint', 'result': [{'returnStr': 'OK'}]}
|
218
|
+
"""
|
219
|
+
return self._execute_moctl("dn", "globalcheckpoint", "")
|