pyobvector 0.2.3__tar.gz → 0.2.5__tar.gz
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.
- {pyobvector-0.2.3 → pyobvector-0.2.5}/PKG-INFO +2 -2
- {pyobvector-0.2.3 → pyobvector-0.2.5}/README.md +1 -1
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/client/ob_vec_json_table_client.py +51 -19
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/json_table/oceanbase_dialect.py +1 -1
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyproject.toml +1 -1
- {pyobvector-0.2.3 → pyobvector-0.2.5}/LICENSE +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/__init__.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/client/__init__.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/client/collection_schema.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/client/enum.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/client/exceptions.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/client/fts_index_param.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/client/index_param.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/client/milvus_like_client.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/client/ob_vec_client.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/client/partitions.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/client/schema_type.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/json_table/__init__.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/json_table/json_value_returning_func.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/json_table/virtual_data_type.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/schema/__init__.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/schema/dialect.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/schema/full_text_index.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/schema/geo_srid_point.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/schema/gis_func.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/schema/match_against_func.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/schema/ob_table.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/schema/reflection.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/schema/replace_stmt.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/schema/vec_dist_func.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/schema/vector.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/schema/vector_index.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/util/__init__.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/util/ob_version.py +0 -0
- {pyobvector-0.2.3 → pyobvector-0.2.5}/pyobvector/util/vector.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pyobvector
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5
|
|
4
4
|
Summary: A python SDK for OceanBase Vector Store, based on SQLAlchemy, compatible with Milvus API.
|
|
5
5
|
Author: shanhaikang.shk
|
|
6
6
|
Author-email: shanhaikang.shk@oceanbase.com
|
|
@@ -36,7 +36,7 @@ poetry install
|
|
|
36
36
|
- install with pip:
|
|
37
37
|
|
|
38
38
|
```shell
|
|
39
|
-
pip install pyobvector==0.2.
|
|
39
|
+
pip install pyobvector==0.2.5
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
## Build Doc
|
|
@@ -50,6 +50,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
50
50
|
__tablename__ = JSON_TABLE_DATA_TABLE_NAME
|
|
51
51
|
|
|
52
52
|
user_id = Column(String(128), primary_key=True, autoincrement=False)
|
|
53
|
+
admin_id = Column(String(128), primary_key=True)
|
|
53
54
|
jtable_name = Column(String(512), primary_key=True)
|
|
54
55
|
jdata_id = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
|
|
55
56
|
jdata = Column(JSON)
|
|
@@ -121,7 +122,8 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
121
122
|
|
|
122
123
|
def __init__(
|
|
123
124
|
self,
|
|
124
|
-
user_id: str,
|
|
125
|
+
user_id: Optional[str],
|
|
126
|
+
admin_id: str,
|
|
125
127
|
uri: str = "127.0.0.1:2881",
|
|
126
128
|
user: str = "root@test",
|
|
127
129
|
password: str = "",
|
|
@@ -132,14 +134,31 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
132
134
|
self.Base.metadata.create_all(self.engine)
|
|
133
135
|
self.session = sessionmaker(bind=self.engine)
|
|
134
136
|
self.user_id = user_id
|
|
135
|
-
self.
|
|
137
|
+
self.admin_id = admin_id
|
|
138
|
+
if not self.check_admin_id_ok():
|
|
139
|
+
raise ValueError(f"Invalid admin_id: {admin_id}")
|
|
140
|
+
self.jmetadata = ObVecJsonTableClient.JsonTableMetadata(self.admin_id)
|
|
136
141
|
self.jmetadata.reflect(self.engine)
|
|
142
|
+
|
|
143
|
+
def check_admin_id_ok(self):
|
|
144
|
+
if self.user_id is None:
|
|
145
|
+
return True
|
|
146
|
+
|
|
147
|
+
session = self.session()
|
|
148
|
+
distinct_admin_ids = (
|
|
149
|
+
session.query(ObVecJsonTableClient.JsonTableDataTBL.admin_id)
|
|
150
|
+
.filter_by(user_id = self.user_id)
|
|
151
|
+
.distinct()
|
|
152
|
+
.all()
|
|
153
|
+
)
|
|
154
|
+
admin_ids = [admin_id[0] for admin_id in distinct_admin_ids]
|
|
155
|
+
return (len(admin_ids) == 0) or (len(admin_ids) == 1 and admin_ids[0] == self.admin_id)
|
|
137
156
|
|
|
138
157
|
def _reset(self):
|
|
139
158
|
# Only for test
|
|
140
159
|
self.perform_raw_text_sql(f"TRUNCATE TABLE {JSON_TABLE_DATA_TABLE_NAME}")
|
|
141
160
|
self.perform_raw_text_sql(f"TRUNCATE TABLE {JSON_TABLE_META_TABLE_NAME}")
|
|
142
|
-
self.jmetadata = ObVecJsonTableClient.JsonTableMetadata(self.
|
|
161
|
+
self.jmetadata = ObVecJsonTableClient.JsonTableMetadata(self.admin_id)
|
|
143
162
|
|
|
144
163
|
def refresh_metadata(self) -> None:
|
|
145
164
|
self.jmetadata.reflect(self.engine)
|
|
@@ -266,7 +285,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
266
285
|
'jcol_model': col_type_model,
|
|
267
286
|
})
|
|
268
287
|
session.add(ObVecJsonTableClient.JsonTableMetaTBL(
|
|
269
|
-
user_id = self.
|
|
288
|
+
user_id = self.admin_id,
|
|
270
289
|
jtable_name = jtable_name,
|
|
271
290
|
jcol_id = col_id,
|
|
272
291
|
jcol_name = col_name,
|
|
@@ -351,7 +370,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
351
370
|
col_type_str = self._parse_col_datatype(change_col.dtype)
|
|
352
371
|
|
|
353
372
|
session.query(ObVecJsonTableClient.JsonTableMetaTBL).filter_by(
|
|
354
|
-
user_id=self.
|
|
373
|
+
user_id=self.admin_id,
|
|
355
374
|
jtable_name=jtable_name,
|
|
356
375
|
jcol_name=origin_col_name
|
|
357
376
|
).update({
|
|
@@ -365,7 +384,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
365
384
|
})
|
|
366
385
|
|
|
367
386
|
session.query(ObVecJsonTableClient.JsonTableDataTBL).filter_by(
|
|
368
|
-
|
|
387
|
+
admin_id=self.admin_id,
|
|
369
388
|
jtable_name=jtable_name,
|
|
370
389
|
).update({
|
|
371
390
|
ObVecJsonTableClient.JsonTableDataTBL.jdata: func.json_insert(
|
|
@@ -380,7 +399,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
380
399
|
})
|
|
381
400
|
|
|
382
401
|
session.query(ObVecJsonTableClient.JsonTableDataTBL).filter_by(
|
|
383
|
-
|
|
402
|
+
admin_id=self.admin_id,
|
|
384
403
|
jtable_name=jtable_name,
|
|
385
404
|
).update({
|
|
386
405
|
ObVecJsonTableClient.JsonTableDataTBL.jdata: func.json_replace(
|
|
@@ -408,13 +427,13 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
408
427
|
raise ValueError(f"{col_name} not exists in {jtable_name}")
|
|
409
428
|
|
|
410
429
|
session.query(ObVecJsonTableClient.JsonTableMetaTBL).filter_by(
|
|
411
|
-
user_id=self.
|
|
430
|
+
user_id=self.admin_id,
|
|
412
431
|
jtable_name=jtable_name,
|
|
413
432
|
jcol_name=col_name
|
|
414
433
|
).delete()
|
|
415
434
|
|
|
416
435
|
session.query(ObVecJsonTableClient.JsonTableDataTBL).filter_by(
|
|
417
|
-
|
|
436
|
+
admin_id=self.admin_id,
|
|
418
437
|
jtable_name=jtable_name,
|
|
419
438
|
).update({
|
|
420
439
|
ObVecJsonTableClient.JsonTableDataTBL.jdata: func.json_remove(
|
|
@@ -443,7 +462,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
443
462
|
cur_col_id = max([meta['jcol_id'] for meta in self.jmetadata.meta_cache[jtable_name]]) + 1
|
|
444
463
|
|
|
445
464
|
session.add(ObVecJsonTableClient.JsonTableMetaTBL(
|
|
446
|
-
user_id = self.
|
|
465
|
+
user_id = self.admin_id,
|
|
447
466
|
jtable_name = jtable_name,
|
|
448
467
|
jcol_id = cur_col_id,
|
|
449
468
|
jcol_name = new_col_name,
|
|
@@ -457,7 +476,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
457
476
|
|
|
458
477
|
if constraints['jcol_default'] is None:
|
|
459
478
|
session.query(ObVecJsonTableClient.JsonTableDataTBL).filter_by(
|
|
460
|
-
|
|
479
|
+
admin_id=self.admin_id,
|
|
461
480
|
jtable_name=jtable_name,
|
|
462
481
|
).update({
|
|
463
482
|
ObVecJsonTableClient.JsonTableDataTBL.jdata: func.json_insert(
|
|
@@ -471,7 +490,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
471
490
|
datum = model(val=self._calc_default_value(constraints['jcol_default']))
|
|
472
491
|
json_val = val2json(datum.val)
|
|
473
492
|
session.query(ObVecJsonTableClient.JsonTableDataTBL).filter_by(
|
|
474
|
-
|
|
493
|
+
admin_id=self.admin_id,
|
|
475
494
|
jtable_name=jtable_name,
|
|
476
495
|
).update({
|
|
477
496
|
ObVecJsonTableClient.JsonTableDataTBL.jdata: func.json_insert(
|
|
@@ -502,7 +521,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
502
521
|
model(val=self._calc_default_value(constraints['jcol_default']))
|
|
503
522
|
|
|
504
523
|
session.query(ObVecJsonTableClient.JsonTableMetaTBL).filter_by(
|
|
505
|
-
user_id=self.
|
|
524
|
+
user_id=self.admin_id,
|
|
506
525
|
jtable_name=jtable_name,
|
|
507
526
|
jcol_name=col_name
|
|
508
527
|
).update({
|
|
@@ -517,7 +536,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
517
536
|
|
|
518
537
|
if constraints['jcol_default'] is None:
|
|
519
538
|
session.query(ObVecJsonTableClient.JsonTableDataTBL).filter_by(
|
|
520
|
-
|
|
539
|
+
admin_id=self.admin_id,
|
|
521
540
|
jtable_name=jtable_name,
|
|
522
541
|
).update({
|
|
523
542
|
ObVecJsonTableClient.JsonTableDataTBL.jdata: func.json_replace(
|
|
@@ -535,7 +554,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
535
554
|
datum = model(val=self._calc_default_value(constraints['jcol_default']))
|
|
536
555
|
json_val = val2json(datum.val)
|
|
537
556
|
session.query(ObVecJsonTableClient.JsonTableDataTBL).filter_by(
|
|
538
|
-
|
|
557
|
+
admin_id=self.admin_id,
|
|
539
558
|
jtable_name=jtable_name,
|
|
540
559
|
).update({
|
|
541
560
|
ObVecJsonTableClient.JsonTableDataTBL.jdata: func.json_replace(
|
|
@@ -566,7 +585,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
566
585
|
raise ValueError(f"Table {new_table_name} exists!")
|
|
567
586
|
|
|
568
587
|
session.query(ObVecJsonTableClient.JsonTableMetaTBL).filter_by(
|
|
569
|
-
user_id=self.
|
|
588
|
+
user_id=self.admin_id,
|
|
570
589
|
jtable_name=jtable_name,
|
|
571
590
|
).update({
|
|
572
591
|
ObVecJsonTableClient.JsonTableMetaTBL.jtable_name: new_table_name,
|
|
@@ -624,6 +643,9 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
624
643
|
session.close()
|
|
625
644
|
|
|
626
645
|
def _handle_jtable_dml_insert(self, ast: Expression):
|
|
646
|
+
if self.user_id is None:
|
|
647
|
+
raise ValueError(f"inserting is disabled when user_id is None")
|
|
648
|
+
|
|
627
649
|
if isinstance(ast.this, exp.Schema):
|
|
628
650
|
table_name = ast.this.this.this.this
|
|
629
651
|
else:
|
|
@@ -670,6 +692,7 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
670
692
|
|
|
671
693
|
session.add(ObVecJsonTableClient.JsonTableDataTBL(
|
|
672
694
|
user_id = self.user_id,
|
|
695
|
+
admin_id = self.admin_id,
|
|
673
696
|
jtable_name = table_name,
|
|
674
697
|
jdata = kv,
|
|
675
698
|
))
|
|
@@ -718,7 +741,10 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
718
741
|
column.parent.args['this'] = parse_one(
|
|
719
742
|
f"JSON_VALUE({JSON_TABLE_DATA_TABLE_NAME}.jdata, '$.{where_col_name}')"
|
|
720
743
|
)
|
|
721
|
-
|
|
744
|
+
if self.user_id:
|
|
745
|
+
where_clause = f"{JSON_TABLE_DATA_TABLE_NAME}.user_id = '{self.user_id}' AND {JSON_TABLE_DATA_TABLE_NAME}.jtable_name = '{table_name}' AND ({str(ast.args['where'].this)})"
|
|
746
|
+
else:
|
|
747
|
+
where_clause = f"{JSON_TABLE_DATA_TABLE_NAME}.jtable_name = '{table_name}' AND ({str(ast.args['where'].this)})"
|
|
722
748
|
|
|
723
749
|
if where_clause:
|
|
724
750
|
update_sql = f"UPDATE {JSON_TABLE_DATA_TABLE_NAME} SET jdata = JSON_REPLACE({JSON_TABLE_DATA_TABLE_NAME}.jdata, {', '.join(path_settings)}) WHERE {where_clause}"
|
|
@@ -742,7 +768,10 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
742
768
|
column.parent.args['this'] = parse_one(
|
|
743
769
|
f"JSON_VALUE({JSON_TABLE_DATA_TABLE_NAME}.jdata, '$.{where_col_name}')"
|
|
744
770
|
)
|
|
745
|
-
|
|
771
|
+
if self.user_id:
|
|
772
|
+
where_clause = f"{JSON_TABLE_DATA_TABLE_NAME}.user_id = '{self.user_id}' AND {JSON_TABLE_DATA_TABLE_NAME}.jtable_name = '{table_name}' AND ({str(ast.args['where'].this)})"
|
|
773
|
+
else:
|
|
774
|
+
where_clause = f"{JSON_TABLE_DATA_TABLE_NAME}.jtable_name = '{table_name}' AND ({str(ast.args['where'].this)})"
|
|
746
775
|
|
|
747
776
|
if where_clause:
|
|
748
777
|
delete_sql = f"DELETE FROM {JSON_TABLE_DATA_TABLE_NAME} WHERE {where_clause}"
|
|
@@ -812,7 +841,10 @@ class ObVecJsonTableClient(ObVecClient):
|
|
|
812
841
|
else:
|
|
813
842
|
ast.args['joins'] = [join_node]
|
|
814
843
|
|
|
815
|
-
|
|
844
|
+
if self.user_id:
|
|
845
|
+
extra_filter_str = f"{JSON_TABLE_DATA_TABLE_NAME}.user_id = '{self.user_id}' AND {JSON_TABLE_DATA_TABLE_NAME}.jtable_name = '{table_name}'"
|
|
846
|
+
else:
|
|
847
|
+
extra_filter_str = f"{JSON_TABLE_DATA_TABLE_NAME}.jtable_name = '{table_name}'"
|
|
816
848
|
if 'where' in ast.args.keys():
|
|
817
849
|
filter_str = str(ast.args['where'].args['this'])
|
|
818
850
|
new_filter_str = f"{extra_filter_str} AND ({filter_str})"
|
|
@@ -64,7 +64,7 @@ class OceanBase(MySQL):
|
|
|
64
64
|
using=self._match(TokenType.USING) and self._parse_assignment(),
|
|
65
65
|
)
|
|
66
66
|
|
|
67
|
-
def _parse_drop(self, exists: bool = False) -> exp.Drop
|
|
67
|
+
def _parse_drop(self, exists: bool = False) -> t.Union[exp.Drop, exp.Command]:
|
|
68
68
|
temporary = self._match(TokenType.TEMPORARY)
|
|
69
69
|
materialized = self._match_text_seq("MATERIALIZED")
|
|
70
70
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "pyobvector"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.5"
|
|
4
4
|
description = "A python SDK for OceanBase Vector Store, based on SQLAlchemy, compatible with Milvus API."
|
|
5
5
|
authors = ["shanhaikang.shk <shanhaikang.shk@oceanbase.com>"]
|
|
6
6
|
readme = "README.md"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|