pyobvector 0.2.16__py3-none-any.whl → 0.2.18__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.
- pyobvector/__init__.py +3 -0
- pyobvector/client/collection_schema.py +6 -6
- pyobvector/client/exceptions.py +4 -4
- pyobvector/client/fts_index_param.py +2 -3
- pyobvector/client/hybrid_search.py +81 -0
- pyobvector/client/index_param.py +21 -8
- pyobvector/client/milvus_like_client.py +124 -88
- pyobvector/client/ob_client.py +459 -0
- pyobvector/client/ob_vec_client.py +153 -493
- pyobvector/client/schema_type.py +4 -2
- pyobvector/schema/__init__.py +3 -0
- pyobvector/schema/dialect.py +3 -0
- pyobvector/schema/reflection.py +1 -1
- pyobvector/schema/sparse_vector.py +35 -0
- pyobvector/schema/vector_index.py +1 -1
- pyobvector/util/__init__.py +3 -1
- pyobvector/util/ob_version.py +1 -1
- pyobvector/util/sparse_vector.py +48 -0
- pyobvector/util/vector.py +10 -4
- {pyobvector-0.2.16.dist-info → pyobvector-0.2.18.dist-info}/METADATA +69 -7
- pyobvector-0.2.18.dist-info/RECORD +40 -0
- {pyobvector-0.2.16.dist-info → pyobvector-0.2.18.dist-info}/WHEEL +1 -1
- pyobvector-0.2.16.dist-info/RECORD +0 -36
- {pyobvector-0.2.16.dist-info → pyobvector-0.2.18.dist-info/licenses}/LICENSE +0 -0
pyobvector/client/schema_type.py
CHANGED
|
@@ -11,7 +11,7 @@ from sqlalchemy import (
|
|
|
11
11
|
)
|
|
12
12
|
from sqlalchemy.dialects.mysql import LONGTEXT
|
|
13
13
|
from .enum import IntEnum
|
|
14
|
-
from ..schema import ARRAY, VECTOR
|
|
14
|
+
from ..schema import ARRAY, SPARSE_VECTOR, VECTOR
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class DataType(IntEnum):
|
|
@@ -35,7 +35,7 @@ class DataType(IntEnum):
|
|
|
35
35
|
FLOAT_VECTOR = 101
|
|
36
36
|
# FLOAT16_VECTOR = 102
|
|
37
37
|
# BFLOAT16_VECTOR = 103
|
|
38
|
-
|
|
38
|
+
SPARSE_FLOAT_VECTOR = 104
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
def convert_datatype_to_sqltype(datatype: DataType):
|
|
@@ -66,4 +66,6 @@ def convert_datatype_to_sqltype(datatype: DataType):
|
|
|
66
66
|
return JSON
|
|
67
67
|
if datatype == DataType.FLOAT_VECTOR:
|
|
68
68
|
return VECTOR
|
|
69
|
+
if datatype == DataType.SPARSE_FLOAT_VECTOR:
|
|
70
|
+
return SPARSE_VECTOR
|
|
69
71
|
raise ValueError(f"Invalid DataType: {datatype}")
|
pyobvector/schema/__init__.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
* ARRAY An extended data type in SQLAlchemy for ObVecClient
|
|
4
4
|
* VECTOR An extended data type in SQLAlchemy for ObVecClient
|
|
5
|
+
* SPARSE_VECTOR An extended data type in SQLAlchemy for ObVecClient
|
|
5
6
|
* VectorIndex An extended index type in SQLAlchemy for ObVecClient
|
|
6
7
|
* CreateVectorIndex Vector Index Creation statement clause
|
|
7
8
|
* ObTable Extension to Table for creating table with vector index
|
|
@@ -21,6 +22,7 @@
|
|
|
21
22
|
"""
|
|
22
23
|
from .array import ARRAY
|
|
23
24
|
from .vector import VECTOR
|
|
25
|
+
from .sparse_vector import SPARSE_VECTOR
|
|
24
26
|
from .geo_srid_point import POINT
|
|
25
27
|
from .vector_index import VectorIndex, CreateVectorIndex
|
|
26
28
|
from .ob_table import ObTable
|
|
@@ -34,6 +36,7 @@ from .match_against_func import MatchAgainst
|
|
|
34
36
|
__all__ = [
|
|
35
37
|
"ARRAY",
|
|
36
38
|
"VECTOR",
|
|
39
|
+
"SPARSE_VECTOR",
|
|
37
40
|
"POINT",
|
|
38
41
|
"VectorIndex",
|
|
39
42
|
"CreateVectorIndex",
|
pyobvector/schema/dialect.py
CHANGED
|
@@ -4,6 +4,7 @@ from sqlalchemy.dialects.mysql import aiomysql, pymysql
|
|
|
4
4
|
|
|
5
5
|
from .reflection import OceanBaseTableDefinitionParser
|
|
6
6
|
from .vector import VECTOR
|
|
7
|
+
from .sparse_vector import SPARSE_VECTOR
|
|
7
8
|
from .geo_srid_point import POINT
|
|
8
9
|
|
|
9
10
|
class OceanBaseDialect(pymysql.MySQLDialect_pymysql):
|
|
@@ -15,6 +16,7 @@ class OceanBaseDialect(pymysql.MySQLDialect_pymysql):
|
|
|
15
16
|
def __init__(self, **kwargs):
|
|
16
17
|
super().__init__(**kwargs)
|
|
17
18
|
self.ischema_names["VECTOR"] = VECTOR
|
|
19
|
+
self.ischema_names["SPARSEVECTOR"] = SPARSE_VECTOR
|
|
18
20
|
self.ischema_names["point"] = POINT
|
|
19
21
|
|
|
20
22
|
@util.memoized_property
|
|
@@ -39,6 +41,7 @@ class AsyncOceanBaseDialect(aiomysql.MySQLDialect_aiomysql):
|
|
|
39
41
|
def __init__(self, **kwargs):
|
|
40
42
|
super().__init__(**kwargs)
|
|
41
43
|
self.ischema_names["VECTOR"] = VECTOR
|
|
44
|
+
self.ischema_names["SPARSEVECTOR"] = SPARSE_VECTOR
|
|
42
45
|
self.ischema_names["point"] = POINT
|
|
43
46
|
|
|
44
47
|
@util.memoized_property
|
pyobvector/schema/reflection.py
CHANGED
|
@@ -45,7 +45,7 @@ class OceanBaseTableDefinitionParser(MySQLTableDefinitionParser):
|
|
|
45
45
|
|
|
46
46
|
self._re_key = _re_compile(
|
|
47
47
|
r" "
|
|
48
|
-
r"(?:(FULLTEXT|SPATIAL|VECTOR|(?P<type>\S+)) )?KEY"
|
|
48
|
+
r"(?:(FULLTEXT|SPATIAL|VECTOR|SPARSEVECTOR|(?P<type>\S+)) )?KEY"
|
|
49
49
|
# r"(?:(?P<type>\S+) )?KEY"
|
|
50
50
|
r"(?: +{iq}(?P<name>(?:{esc_fq}|[^{fq}])+){fq})?"
|
|
51
51
|
r"(?: +USING +(?P<using_pre>\S+))?"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""SPARSE_VECTOR: An extended data type for SQLAlchemy"""
|
|
2
|
+
from sqlalchemy.types import UserDefinedType, String
|
|
3
|
+
from ..util import SparseVector
|
|
4
|
+
|
|
5
|
+
class SPARSE_VECTOR(UserDefinedType):
|
|
6
|
+
"""SPARSE_VECTOR data type definition."""
|
|
7
|
+
cache_ok = True
|
|
8
|
+
_string = String()
|
|
9
|
+
|
|
10
|
+
def __init__(self):
|
|
11
|
+
super(UserDefinedType, self).__init__()
|
|
12
|
+
|
|
13
|
+
def get_col_spec(self, **kw): # pylint: disable=unused-argument
|
|
14
|
+
"""Parse to sparse vector data type definition in text SQL."""
|
|
15
|
+
return "SPARSEVECTOR"
|
|
16
|
+
|
|
17
|
+
def bind_processor(self, dialect):
|
|
18
|
+
def process(value):
|
|
19
|
+
return SparseVector._to_db(value)
|
|
20
|
+
|
|
21
|
+
return process
|
|
22
|
+
|
|
23
|
+
def literal_processor(self, dialect):
|
|
24
|
+
string_literal_processor = self._string._cached_literal_processor(dialect)
|
|
25
|
+
|
|
26
|
+
def process(value):
|
|
27
|
+
return string_literal_processor(SparseVector._to_db(value))
|
|
28
|
+
|
|
29
|
+
return process
|
|
30
|
+
|
|
31
|
+
def result_processor(self, dialect, coltype):
|
|
32
|
+
def process(value):
|
|
33
|
+
return SparseVector._from_db(value)
|
|
34
|
+
|
|
35
|
+
return process
|
pyobvector/util/__init__.py
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"""A utility module for pyobvector.
|
|
2
2
|
|
|
3
3
|
* Vector A utility class for the extended data type class 'VECTOR'
|
|
4
|
+
* SparseVector A utility class for the extended data type class 'SPARSE_VECTOR'
|
|
4
5
|
* ObVersion OceanBase cluster version class
|
|
5
6
|
"""
|
|
6
7
|
from .vector import Vector
|
|
8
|
+
from .sparse_vector import SparseVector
|
|
7
9
|
from .ob_version import ObVersion
|
|
8
10
|
|
|
9
|
-
__all__ = ["Vector", "ObVersion"]
|
|
11
|
+
__all__ = ["Vector", "SparseVector", "ObVersion"]
|
pyobvector/util/ob_version.py
CHANGED
|
@@ -7,7 +7,7 @@ class ObVersion:
|
|
|
7
7
|
"""The class to describe OceanBase cluster version.
|
|
8
8
|
|
|
9
9
|
Attributes:
|
|
10
|
-
|
|
10
|
+
version_nums (List[int]): version number of OceanBase cluster. For example, '4.3.3.0'
|
|
11
11
|
"""
|
|
12
12
|
def __init__(self, version_nums: List[int]):
|
|
13
13
|
self.version_nums = copy.deepcopy(version_nums)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""A utility module for the extended data type class 'SPARSE_VECTOR'."""
|
|
2
|
+
import ast
|
|
3
|
+
|
|
4
|
+
class SparseVector:
|
|
5
|
+
"""A transformer class between python dict and OceanBase SPARSE_VECTOR.
|
|
6
|
+
|
|
7
|
+
Attributes:
|
|
8
|
+
_value (Dict) : a python dict
|
|
9
|
+
"""
|
|
10
|
+
def __init__(self, value):
|
|
11
|
+
if not isinstance(value, dict):
|
|
12
|
+
raise ValueError("Sparse Vector should be a dict in python")
|
|
13
|
+
|
|
14
|
+
self._value = value
|
|
15
|
+
|
|
16
|
+
def __repr__(self):
|
|
17
|
+
return f"{self._value}"
|
|
18
|
+
|
|
19
|
+
def to_text(self):
|
|
20
|
+
return f"{self._value}"
|
|
21
|
+
|
|
22
|
+
@classmethod
|
|
23
|
+
def from_text(cls, value: str):
|
|
24
|
+
"""Construct Sparse Vector class with dict in string format.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
value: For example, '{1:1.1, 2:2.2}'
|
|
28
|
+
"""
|
|
29
|
+
return cls(ast.literal_eval(value))
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
def _to_db(cls, value):
|
|
33
|
+
if value is None:
|
|
34
|
+
return value
|
|
35
|
+
|
|
36
|
+
if not isinstance(value, cls):
|
|
37
|
+
value = cls(value)
|
|
38
|
+
|
|
39
|
+
return value.to_text()
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def _from_db(cls, value):
|
|
43
|
+
if value is None or isinstance(value, dict):
|
|
44
|
+
return value
|
|
45
|
+
|
|
46
|
+
if isinstance(value, str):
|
|
47
|
+
return cls.from_text(value)._value
|
|
48
|
+
raise ValueError(f"unexpected sparse vector type: {type(value)}")
|
pyobvector/util/vector.py
CHANGED
|
@@ -7,7 +7,7 @@ class Vector:
|
|
|
7
7
|
"""A transformer class between python numpy array and OceanBase VECTOR.
|
|
8
8
|
|
|
9
9
|
Attributes:
|
|
10
|
-
|
|
10
|
+
_value (numpy.array): a numpy array
|
|
11
11
|
"""
|
|
12
12
|
def __init__(self, value):
|
|
13
13
|
# big-endian float32
|
|
@@ -43,7 +43,10 @@ class Vector:
|
|
|
43
43
|
"""Construct Vector class with list string.
|
|
44
44
|
|
|
45
45
|
Args:
|
|
46
|
-
value: For example, '[1,2,3]'
|
|
46
|
+
value (str): For example, '[1,2,3]'
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
Vector: Vector instance
|
|
47
50
|
"""
|
|
48
51
|
return cls([float(v) for v in value[1:-1].split(",")])
|
|
49
52
|
|
|
@@ -52,7 +55,10 @@ class Vector:
|
|
|
52
55
|
"""Construct Vector class with raw bytes.
|
|
53
56
|
|
|
54
57
|
Args:
|
|
55
|
-
value: the bytes of python list
|
|
58
|
+
value (bytes): the bytes of python list
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
Vector: Vector instance
|
|
56
62
|
"""
|
|
57
63
|
return cls(json.loads(value.decode()))
|
|
58
64
|
|
|
@@ -78,4 +84,4 @@ class Vector:
|
|
|
78
84
|
return cls.from_text(value).to_numpy().astype(np.float32)
|
|
79
85
|
if isinstance(value, bytes):
|
|
80
86
|
return cls.from_bytes(value).to_numpy().astype(np.float32)
|
|
81
|
-
raise ValueError("
|
|
87
|
+
raise ValueError("unexpected vector type")
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: pyobvector
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.18
|
|
4
4
|
Summary: A python SDK for OceanBase Vector Store, based on SQLAlchemy, compatible with Milvus API.
|
|
5
|
+
License-File: LICENSE
|
|
5
6
|
Author: shanhaikang.shk
|
|
6
7
|
Author-email: shanhaikang.shk@oceanbase.com
|
|
7
8
|
Requires-Python: >=3.9,<4.0
|
|
@@ -11,12 +12,13 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
11
12
|
Classifier: Programming Language :: Python :: 3.11
|
|
12
13
|
Classifier: Programming Language :: Python :: 3.12
|
|
13
14
|
Classifier: Programming Language :: Python :: 3.13
|
|
14
|
-
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Requires-Dist: aiomysql (>=0.3.2,<0.4.0)
|
|
15
17
|
Requires-Dist: numpy (>=1.17.0,<2.0.0)
|
|
16
18
|
Requires-Dist: pydantic (>=2.7.0,<3)
|
|
17
19
|
Requires-Dist: pymysql (>=1.1.1,<2.0.0)
|
|
18
20
|
Requires-Dist: sqlalchemy (>=1.4,<=3)
|
|
19
|
-
Requires-Dist: sqlglot (>=26.0.1
|
|
21
|
+
Requires-Dist: sqlglot (>=26.0.1)
|
|
20
22
|
Description-Content-Type: text/markdown
|
|
21
23
|
|
|
22
24
|
# pyobvector
|
|
@@ -36,7 +38,7 @@ poetry install
|
|
|
36
38
|
- install with pip:
|
|
37
39
|
|
|
38
40
|
```shell
|
|
39
|
-
pip install pyobvector==0.2.
|
|
41
|
+
pip install pyobvector==0.2.18
|
|
40
42
|
```
|
|
41
43
|
|
|
42
44
|
## Build Doc
|
|
@@ -48,6 +50,10 @@ mkdir build
|
|
|
48
50
|
make html
|
|
49
51
|
```
|
|
50
52
|
|
|
53
|
+
## Release Notes
|
|
54
|
+
|
|
55
|
+
For detailed release notes and changelog, see [RELEASE_NOTES.md](RELEASE_NOTES.md).
|
|
56
|
+
|
|
51
57
|
## Usage
|
|
52
58
|
|
|
53
59
|
`pyobvector` supports two modes:
|
|
@@ -174,19 +180,75 @@ client.insert(test_collection_name, data=data1)
|
|
|
174
180
|
- do ann search:
|
|
175
181
|
|
|
176
182
|
```python
|
|
177
|
-
# perform ann search
|
|
183
|
+
# perform ann search with basic column selection
|
|
178
184
|
res = self.client.ann_search(
|
|
179
185
|
test_collection_name,
|
|
180
186
|
vec_data=[0,0,0],
|
|
181
187
|
vec_column_name='embedding',
|
|
182
188
|
distance_func=l2_distance,
|
|
183
189
|
topk=5,
|
|
184
|
-
output_column_names=['id']
|
|
190
|
+
output_column_names=['id'] # Legacy parameter
|
|
185
191
|
)
|
|
186
192
|
# For example, the result will be:
|
|
187
193
|
# [(112,), (111,), (10,), (11,), (12,)]
|
|
194
|
+
|
|
195
|
+
# perform ann search with SQLAlchemy expressions (recommended)
|
|
196
|
+
from sqlalchemy import Table, text, func
|
|
197
|
+
|
|
198
|
+
table = Table(test_collection_name, client.metadata_obj, autoload_with=client.engine)
|
|
199
|
+
res = self.client.ann_search(
|
|
200
|
+
test_collection_name,
|
|
201
|
+
vec_data=[0,0,0],
|
|
202
|
+
vec_column_name='embedding',
|
|
203
|
+
distance_func=l2_distance,
|
|
204
|
+
topk=5,
|
|
205
|
+
output_columns=[
|
|
206
|
+
table.c.id,
|
|
207
|
+
table.c.meta,
|
|
208
|
+
(table.c.id + 1000).label('id_plus_1000'),
|
|
209
|
+
text("JSON_EXTRACT(meta, '$.key') as extracted_key")
|
|
210
|
+
]
|
|
211
|
+
)
|
|
212
|
+
# For example, the result will be:
|
|
213
|
+
# [(112, '{"key": "value"}', 1112, 'value'), ...]
|
|
214
|
+
|
|
215
|
+
# perform ann search with distance threshold (filter results by distance)
|
|
216
|
+
res = self.client.ann_search(
|
|
217
|
+
test_collection_name,
|
|
218
|
+
vec_data=[0,0,0],
|
|
219
|
+
vec_column_name='embedding',
|
|
220
|
+
distance_func=l2_distance,
|
|
221
|
+
with_dist=True,
|
|
222
|
+
topk=10,
|
|
223
|
+
output_column_names=['id'],
|
|
224
|
+
distance_threshold=0.5 # Only return results where distance <= 0.5
|
|
225
|
+
)
|
|
226
|
+
# Only returns results with distance <= 0.5
|
|
227
|
+
# For example, the result will be:
|
|
228
|
+
# [(10, 0.0), (11, 0.0), ...] # Only includes results with distance <= 0.5
|
|
188
229
|
```
|
|
189
230
|
|
|
231
|
+
#### ann_search Parameters
|
|
232
|
+
|
|
233
|
+
The `ann_search` method supports flexible output column selection through the `output_columns` parameter:
|
|
234
|
+
|
|
235
|
+
- **`output_columns`** (recommended): Accepts SQLAlchemy Column objects, expressions, or a mix of both
|
|
236
|
+
- Column objects: `table.c.id`, `table.c.name`
|
|
237
|
+
- Expressions: `(table.c.age + 10).label('age_plus_10')`
|
|
238
|
+
- JSON queries: `text("JSON_EXTRACT(meta, '$.key') as extracted_key")`
|
|
239
|
+
- String functions: `func.concat(table.c.name, ' (', table.c.age, ')').label('name_age')`
|
|
240
|
+
|
|
241
|
+
- **`output_column_names`** (legacy): Accepts list of column name strings
|
|
242
|
+
- Example: `['id', 'name', 'meta']`
|
|
243
|
+
|
|
244
|
+
- **Parameter Priority**: `output_columns` takes precedence over `output_column_names` when both are provided
|
|
245
|
+
|
|
246
|
+
- **`distance_threshold`** (optional): Filter results by distance threshold
|
|
247
|
+
- Type: `Optional[float]`
|
|
248
|
+
- Only returns results where `distance <= threshold`
|
|
249
|
+
- Example: `distance_threshold=0.5` returns only results with distance <= 0.5
|
|
250
|
+
- Use case: Quality control for similarity search, only return highly similar results
|
|
251
|
+
|
|
190
252
|
- If you want to use pure `SQLAlchemy` API with `OceanBase` dialect, you can just get an `SQLAlchemy.engine` via `client.engine`. The engine can also be created as following:
|
|
191
253
|
|
|
192
254
|
```python
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
pyobvector/__init__.py,sha256=5RtWI_ol3qxj_m7UXTQzByTmGZdIiQ0yyCyHZUhRDas,3888
|
|
2
|
+
pyobvector/client/__init__.py,sha256=fDK2FVdSm3-XCwTqsam7zisic5UMhANUq97r29i27nc,2819
|
|
3
|
+
pyobvector/client/collection_schema.py,sha256=a7JQk83ZxMsvMDGt5CC_4lz2-skONqKgk-OGUz297hM,5538
|
|
4
|
+
pyobvector/client/enum.py,sha256=3lPjSltITSE694-qOAP4yoX6fzCjKD4WAewmIxFs49o,139
|
|
5
|
+
pyobvector/client/exceptions.py,sha256=CjoquSCc0H705MtvhpQW_F7_KaviYrKAHkndpF8sJx4,3777
|
|
6
|
+
pyobvector/client/fts_index_param.py,sha256=UvU82p9_x444WAQMqhIUPHbqVHV5B3cFazje1Gw-slo,1105
|
|
7
|
+
pyobvector/client/hybrid_search.py,sha256=RRjWGpSu625-ND-eZq0_JPL9OAP548XkOI9I9U-mTG4,2323
|
|
8
|
+
pyobvector/client/index_param.py,sha256=Dg-FEFQPBRxb7qXChqoLgBSljpdJzF-C7ESUbG9x1mA,6926
|
|
9
|
+
pyobvector/client/milvus_like_client.py,sha256=jHxB-ZmIGZiIDxEpurSlAKffiCF_KFNZP-14_vq1RQM,27887
|
|
10
|
+
pyobvector/client/ob_client.py,sha256=csSRVWqbhnsaN2gj7FSwL7QExh4vbTx6EyqPznKRSz4,16172
|
|
11
|
+
pyobvector/client/ob_vec_client.py,sha256=P6IMtsYxS_S78VsQtltK3UenW91iYfRKa0s1hIc8CI0,19916
|
|
12
|
+
pyobvector/client/ob_vec_json_table_client.py,sha256=rq80AfqAKhosLcrBFROAoINVSkr-48xlRH91Jt4pEwA,39246
|
|
13
|
+
pyobvector/client/partitions.py,sha256=Bxwr5yVNlXwZc7SXBC03NeqL9giy4Fe6S2qZdHD8xGw,15621
|
|
14
|
+
pyobvector/client/schema_type.py,sha256=gH2YiBsgkryo-R0GB_NYuRXMvzvrSjOamZTy6pwn2n0,1673
|
|
15
|
+
pyobvector/json_table/__init__.py,sha256=X5MmK3f10oyJleUUFZJFeunMEfzmf6P1f_7094b-FZc,554
|
|
16
|
+
pyobvector/json_table/json_value_returning_func.py,sha256=NWSV2zhe2-1KhIprQaFqOH3vUVF46YaHIZUqX66WZKM,1864
|
|
17
|
+
pyobvector/json_table/oceanbase_dialect.py,sha256=lxpbWBQdK18LWXLmGyk_-ODv6VfnwGLHbcpsQMElOUo,4480
|
|
18
|
+
pyobvector/json_table/virtual_data_type.py,sha256=uQh6ZQ0UbwpVO9TFegGeu4E8bXW7rdLHAXFQJdiEjLs,3467
|
|
19
|
+
pyobvector/schema/__init__.py,sha256=OMn7Cd2E8o_tm2ArbAXS_zRbiDW2sj7YKPLnbpmaueg,2405
|
|
20
|
+
pyobvector/schema/array.py,sha256=WDWLZbCdu8stK8wlGWfKUjkhWifS8vbsfYUEEJsQOlQ,4163
|
|
21
|
+
pyobvector/schema/dialect.py,sha256=6D9A7Niqig2mwK7C8sP7mCP7kYr5be2jV0xqL87mlz4,1999
|
|
22
|
+
pyobvector/schema/full_text_index.py,sha256=ohQX8uTPdRswEJONuN5A-bNv203d0N0b2BsJ7etx71g,2071
|
|
23
|
+
pyobvector/schema/geo_srid_point.py,sha256=RwEoCgGTmXDc0le1B2E3mZudtqiFdMf2M0Va1ocmVSY,1210
|
|
24
|
+
pyobvector/schema/gis_func.py,sha256=u7bqaB5qIylW8GvRdglLQL2H1SheQZNnAqgZrOGyrks,3118
|
|
25
|
+
pyobvector/schema/match_against_func.py,sha256=ExTQJvAXHaZwBo1Sjy6IlnF1nF6D9xGUsF4f7zaP8Q0,1336
|
|
26
|
+
pyobvector/schema/ob_table.py,sha256=wlb6Oo9LG-sr8XnG_wbX1Qi5CgnS0XUzNL5qTdsncoY,392
|
|
27
|
+
pyobvector/schema/reflection.py,sha256=orA0_lCdcIHw2TumtRCrAH3zG2yAWrGjXOmK5mK9XPw,5903
|
|
28
|
+
pyobvector/schema/replace_stmt.py,sha256=FtGLXHz6DwzD0FOZPn1EZgXdbHZu-K9HIHS02rZqYrE,560
|
|
29
|
+
pyobvector/schema/sparse_vector.py,sha256=ojqUrvKUnxQE8FErB2B58KO540otOJBqiPTMlwcUW2M,1061
|
|
30
|
+
pyobvector/schema/vec_dist_func.py,sha256=4GAWSrhFNDYooBpbBg604wDrByPrewp46Y4VeoDxV7Y,2986
|
|
31
|
+
pyobvector/schema/vector.py,sha256=dFKfPcTOto0jNxVjhvDmJM7Q4wwp6Z-HcZ3K6oZxUMc,1120
|
|
32
|
+
pyobvector/schema/vector_index.py,sha256=D1ZnhJEObWUCd9ESO57KN1ctl10tkEIH_gV0kwGrvu8,2250
|
|
33
|
+
pyobvector/util/__init__.py,sha256=-opvZ4Ya0ByTAhls06547-zW3vkdYRkUH6W5OCKUHD4,388
|
|
34
|
+
pyobvector/util/ob_version.py,sha256=cWkQWoJkIxG6OEF9-gBwJK8LUorltHuKSVAb_NFkpdE,1542
|
|
35
|
+
pyobvector/util/sparse_vector.py,sha256=1IG0CRYfC2z39nGwuG43TImQkWiuPAXOlOnYqJ1hA-o,1275
|
|
36
|
+
pyobvector/util/vector.py,sha256=58glSQqjOSTrGyNhUEIrs9r4F9oaYO_SdPNhMfbSnWs,2392
|
|
37
|
+
pyobvector-0.2.18.dist-info/METADATA,sha256=vqKxp4TJISXO73RxmXxqAPbzZERDoO-MwhPGruxYpXc,9068
|
|
38
|
+
pyobvector-0.2.18.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
39
|
+
pyobvector-0.2.18.dist-info/licenses/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
|
|
40
|
+
pyobvector-0.2.18.dist-info/RECORD,,
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
pyobvector/__init__.py,sha256=q_WyBRa0pVIQZSMbWvgykOJDD7JVDKGnojVDo9CT26E,3772
|
|
2
|
-
pyobvector/client/__init__.py,sha256=fDK2FVdSm3-XCwTqsam7zisic5UMhANUq97r29i27nc,2819
|
|
3
|
-
pyobvector/client/collection_schema.py,sha256=x6cicII8wdsThgzMDA0HlcMYefnLfpdHepnh_Rv8Hr8,5548
|
|
4
|
-
pyobvector/client/enum.py,sha256=3lPjSltITSE694-qOAP4yoX6fzCjKD4WAewmIxFs49o,139
|
|
5
|
-
pyobvector/client/exceptions.py,sha256=ipQFZ-dKXDVmbPhcPJafhkgmSoj2dJ3t4UZZf0_Bz4U,3784
|
|
6
|
-
pyobvector/client/fts_index_param.py,sha256=hMCjA3Aecnt0uQQT6UQGTIIqdPk1M4gX4-zREDQygLs,1139
|
|
7
|
-
pyobvector/client/index_param.py,sha256=3gXi66Ey1PO9x5_61CrH7DmPb496kviBQI5NT7nfbGc,6309
|
|
8
|
-
pyobvector/client/milvus_like_client.py,sha256=f_-eGP_cKissiVhMtFApJrlW9FLD89H1GPbvz1y4jb8,26329
|
|
9
|
-
pyobvector/client/ob_vec_client.py,sha256=XRbsf9wT6obnbJTBV-xlseXBrkvMhkfmzis-gQKD6Os,31566
|
|
10
|
-
pyobvector/client/ob_vec_json_table_client.py,sha256=rq80AfqAKhosLcrBFROAoINVSkr-48xlRH91Jt4pEwA,39246
|
|
11
|
-
pyobvector/client/partitions.py,sha256=Bxwr5yVNlXwZc7SXBC03NeqL9giy4Fe6S2qZdHD8xGw,15621
|
|
12
|
-
pyobvector/client/schema_type.py,sha256=u1LJsr1o9lxv2b_6KYu77RciFa1R_Qk69k_WT30x6BU,1582
|
|
13
|
-
pyobvector/json_table/__init__.py,sha256=X5MmK3f10oyJleUUFZJFeunMEfzmf6P1f_7094b-FZc,554
|
|
14
|
-
pyobvector/json_table/json_value_returning_func.py,sha256=NWSV2zhe2-1KhIprQaFqOH3vUVF46YaHIZUqX66WZKM,1864
|
|
15
|
-
pyobvector/json_table/oceanbase_dialect.py,sha256=lxpbWBQdK18LWXLmGyk_-ODv6VfnwGLHbcpsQMElOUo,4480
|
|
16
|
-
pyobvector/json_table/virtual_data_type.py,sha256=uQh6ZQ0UbwpVO9TFegGeu4E8bXW7rdLHAXFQJdiEjLs,3467
|
|
17
|
-
pyobvector/schema/__init__.py,sha256=EU8NH8Q-L05sFBGKPV6yIBUeh5f3awTkArdBJ7d4CvQ,2271
|
|
18
|
-
pyobvector/schema/array.py,sha256=WDWLZbCdu8stK8wlGWfKUjkhWifS8vbsfYUEEJsQOlQ,4163
|
|
19
|
-
pyobvector/schema/dialect.py,sha256=mdRjn3roztCkk6RXbaB0Wn1uhT2BPS2y18MwL6wW-jo,1840
|
|
20
|
-
pyobvector/schema/full_text_index.py,sha256=ohQX8uTPdRswEJONuN5A-bNv203d0N0b2BsJ7etx71g,2071
|
|
21
|
-
pyobvector/schema/geo_srid_point.py,sha256=RwEoCgGTmXDc0le1B2E3mZudtqiFdMf2M0Va1ocmVSY,1210
|
|
22
|
-
pyobvector/schema/gis_func.py,sha256=u7bqaB5qIylW8GvRdglLQL2H1SheQZNnAqgZrOGyrks,3118
|
|
23
|
-
pyobvector/schema/match_against_func.py,sha256=ExTQJvAXHaZwBo1Sjy6IlnF1nF6D9xGUsF4f7zaP8Q0,1336
|
|
24
|
-
pyobvector/schema/ob_table.py,sha256=wlb6Oo9LG-sr8XnG_wbX1Qi5CgnS0XUzNL5qTdsncoY,392
|
|
25
|
-
pyobvector/schema/reflection.py,sha256=ae8BYlbOWddyU6ly_bOcudsB1CKcD_OcUpAvLVgOW7o,5890
|
|
26
|
-
pyobvector/schema/replace_stmt.py,sha256=FtGLXHz6DwzD0FOZPn1EZgXdbHZu-K9HIHS02rZqYrE,560
|
|
27
|
-
pyobvector/schema/vec_dist_func.py,sha256=4GAWSrhFNDYooBpbBg604wDrByPrewp46Y4VeoDxV7Y,2986
|
|
28
|
-
pyobvector/schema/vector.py,sha256=dFKfPcTOto0jNxVjhvDmJM7Q4wwp6Z-HcZ3K6oZxUMc,1120
|
|
29
|
-
pyobvector/schema/vector_index.py,sha256=aNtrEBUclc4s6QuqCZpu3Hj3OdjyhbWgtLiJzo6F_6M,2247
|
|
30
|
-
pyobvector/util/__init__.py,sha256=D9EgRDlcMSDhY3uI__vnCl45Or75dOXMWSval5P5fqs,251
|
|
31
|
-
pyobvector/util/ob_version.py,sha256=ZIySam8q_MCiwctAiAHPB4GdAzGQiXEo1wVkc9IOTDU,1539
|
|
32
|
-
pyobvector/util/vector.py,sha256=xyM-NuOyd78K7P3kinqyWvLIzEbf9c-4TKn_QVF7qgw,2265
|
|
33
|
-
pyobvector-0.2.16.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
|
|
34
|
-
pyobvector-0.2.16.dist-info/METADATA,sha256=RHYofdmJzv5E1_kU_SfOCBGXm6lBo765CvWcLC4OrHI,6659
|
|
35
|
-
pyobvector-0.2.16.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
36
|
-
pyobvector-0.2.16.dist-info/RECORD,,
|
|
File without changes
|