pyobvector 0.2.4__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.
Files changed (35) hide show
  1. {pyobvector-0.2.4 → pyobvector-0.2.5}/PKG-INFO +2 -2
  2. {pyobvector-0.2.4 → pyobvector-0.2.5}/README.md +1 -1
  3. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/client/ob_vec_json_table_client.py +51 -19
  4. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyproject.toml +1 -1
  5. {pyobvector-0.2.4 → pyobvector-0.2.5}/LICENSE +0 -0
  6. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/__init__.py +0 -0
  7. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/client/__init__.py +0 -0
  8. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/client/collection_schema.py +0 -0
  9. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/client/enum.py +0 -0
  10. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/client/exceptions.py +0 -0
  11. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/client/fts_index_param.py +0 -0
  12. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/client/index_param.py +0 -0
  13. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/client/milvus_like_client.py +0 -0
  14. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/client/ob_vec_client.py +0 -0
  15. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/client/partitions.py +0 -0
  16. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/client/schema_type.py +0 -0
  17. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/json_table/__init__.py +0 -0
  18. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/json_table/json_value_returning_func.py +0 -0
  19. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/json_table/oceanbase_dialect.py +0 -0
  20. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/json_table/virtual_data_type.py +0 -0
  21. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/schema/__init__.py +0 -0
  22. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/schema/dialect.py +0 -0
  23. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/schema/full_text_index.py +0 -0
  24. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/schema/geo_srid_point.py +0 -0
  25. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/schema/gis_func.py +0 -0
  26. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/schema/match_against_func.py +0 -0
  27. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/schema/ob_table.py +0 -0
  28. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/schema/reflection.py +0 -0
  29. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/schema/replace_stmt.py +0 -0
  30. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/schema/vec_dist_func.py +0 -0
  31. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/schema/vector.py +0 -0
  32. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/schema/vector_index.py +0 -0
  33. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/util/__init__.py +0 -0
  34. {pyobvector-0.2.4 → pyobvector-0.2.5}/pyobvector/util/ob_version.py +0 -0
  35. {pyobvector-0.2.4 → 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.4
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.4
39
+ pip install pyobvector==0.2.5
40
40
  ```
41
41
 
42
42
  ## Build Doc
@@ -15,7 +15,7 @@ poetry install
15
15
  - install with pip:
16
16
 
17
17
  ```shell
18
- pip install pyobvector==0.2.4
18
+ pip install pyobvector==0.2.5
19
19
  ```
20
20
 
21
21
  ## 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.jmetadata = ObVecJsonTableClient.JsonTableMetadata(self.user_id)
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.user_id)
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.user_id,
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.user_id,
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
- user_id=self.user_id,
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
- user_id=self.user_id,
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.user_id,
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
- user_id=self.user_id,
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.user_id,
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
- user_id=self.user_id,
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
- user_id=self.user_id,
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.user_id,
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
- user_id=self.user_id,
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
- user_id=self.user_id,
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.user_id,
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
- 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)})"
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
- 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)})"
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
- extra_filter_str = f"{JSON_TABLE_DATA_TABLE_NAME}.user_id = '{self.user_id}' AND {JSON_TABLE_DATA_TABLE_NAME}.jtable_name = '{table_name}'"
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})"
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pyobvector"
3
- version = "0.2.4"
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