pyobvector 0.2.15__py3-none-any.whl → 0.2.17__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.
@@ -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
- # SPARSE_FLOAT_VECTOR = 104
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}")
@@ -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",
@@ -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
@@ -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
@@ -9,7 +9,7 @@ class CreateVectorIndex(DDLElement):
9
9
  """A new statement clause to create vector index.
10
10
 
11
11
  Attributes:
12
- index : vector index schema
12
+ index: vector index schema
13
13
  """
14
14
  def __init__(self, index):
15
15
  self.index = index
@@ -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"]
@@ -7,7 +7,7 @@ class ObVersion:
7
7
  """The class to describe OceanBase cluster version.
8
8
 
9
9
  Attributes:
10
- version_nums (List[int]) : version number of OceanBase cluster. For example, '4.3.3.0'
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
- _value (numpy.array) : a numpy array
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("unexpect vector type")
87
+ raise ValueError("unexpected vector type")
@@ -1,7 +1,8 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: pyobvector
3
- Version: 0.2.15
3
+ Version: 0.2.17
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
- Requires-Dist: aiomysql (>=0.2.0,<0.3.0)
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,<27.0.0)
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.14
41
+ pip install pyobvector==0.2.17
40
42
  ```
41
43
 
42
44
  ## Build Doc
@@ -174,19 +176,75 @@ client.insert(test_collection_name, data=data1)
174
176
  - do ann search:
175
177
 
176
178
  ```python
177
- # perform ann search
179
+ # perform ann search with basic column selection
178
180
  res = self.client.ann_search(
179
181
  test_collection_name,
180
182
  vec_data=[0,0,0],
181
183
  vec_column_name='embedding',
182
184
  distance_func=l2_distance,
183
185
  topk=5,
184
- output_column_names=['id']
186
+ output_column_names=['id'] # Legacy parameter
185
187
  )
186
188
  # For example, the result will be:
187
189
  # [(112,), (111,), (10,), (11,), (12,)]
190
+
191
+ # perform ann search with SQLAlchemy expressions (recommended)
192
+ from sqlalchemy import Table, text, func
193
+
194
+ table = Table(test_collection_name, client.metadata_obj, autoload_with=client.engine)
195
+ res = self.client.ann_search(
196
+ test_collection_name,
197
+ vec_data=[0,0,0],
198
+ vec_column_name='embedding',
199
+ distance_func=l2_distance,
200
+ topk=5,
201
+ output_columns=[
202
+ table.c.id,
203
+ table.c.meta,
204
+ (table.c.id + 1000).label('id_plus_1000'),
205
+ text("JSON_EXTRACT(meta, '$.key') as extracted_key")
206
+ ]
207
+ )
208
+ # For example, the result will be:
209
+ # [(112, '{"key": "value"}', 1112, 'value'), ...]
210
+
211
+ # perform ann search with distance threshold (filter results by distance)
212
+ res = self.client.ann_search(
213
+ test_collection_name,
214
+ vec_data=[0,0,0],
215
+ vec_column_name='embedding',
216
+ distance_func=l2_distance,
217
+ with_dist=True,
218
+ topk=10,
219
+ output_column_names=['id'],
220
+ distance_threshold=0.5 # Only return results where distance <= 0.5
221
+ )
222
+ # Only returns results with distance <= 0.5
223
+ # For example, the result will be:
224
+ # [(10, 0.0), (11, 0.0), ...] # Only includes results with distance <= 0.5
188
225
  ```
189
226
 
227
+ #### ann_search Parameters
228
+
229
+ The `ann_search` method supports flexible output column selection through the `output_columns` parameter:
230
+
231
+ - **`output_columns`** (recommended): Accepts SQLAlchemy Column objects, expressions, or a mix of both
232
+ - Column objects: `table.c.id`, `table.c.name`
233
+ - Expressions: `(table.c.age + 10).label('age_plus_10')`
234
+ - JSON queries: `text("JSON_EXTRACT(meta, '$.key') as extracted_key")`
235
+ - String functions: `func.concat(table.c.name, ' (', table.c.age, ')').label('name_age')`
236
+
237
+ - **`output_column_names`** (legacy): Accepts list of column name strings
238
+ - Example: `['id', 'name', 'meta']`
239
+
240
+ - **Parameter Priority**: `output_columns` takes precedence over `output_column_names` when both are provided
241
+
242
+ - **`distance_threshold`** (optional): Filter results by distance threshold
243
+ - Type: `Optional[float]`
244
+ - Only returns results where `distance <= threshold`
245
+ - Example: `distance_threshold=0.5` returns only results with distance <= 0.5
246
+ - Use case: Quality control for similarity search, only return highly similar results
247
+
190
248
  - 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
249
 
192
250
  ```python
@@ -0,0 +1,39 @@
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=09WNeWA0g7DWATVNGSX6ZJR_NoaGIZ4NB9M-BtQNYO8,3784
6
+ pyobvector/client/fts_index_param.py,sha256=UvU82p9_x444WAQMqhIUPHbqVHV5B3cFazje1Gw-slo,1105
7
+ pyobvector/client/index_param.py,sha256=Dg-FEFQPBRxb7qXChqoLgBSljpdJzF-C7ESUbG9x1mA,6926
8
+ pyobvector/client/milvus_like_client.py,sha256=jHxB-ZmIGZiIDxEpurSlAKffiCF_KFNZP-14_vq1RQM,27887
9
+ pyobvector/client/ob_client.py,sha256=csSRVWqbhnsaN2gj7FSwL7QExh4vbTx6EyqPznKRSz4,16172
10
+ pyobvector/client/ob_vec_client.py,sha256=6w6jmHzqDZ938_bOzhz3NQDNe6BxEIwN8PwXQt2NPjU,19886
11
+ pyobvector/client/ob_vec_json_table_client.py,sha256=rq80AfqAKhosLcrBFROAoINVSkr-48xlRH91Jt4pEwA,39246
12
+ pyobvector/client/partitions.py,sha256=Bxwr5yVNlXwZc7SXBC03NeqL9giy4Fe6S2qZdHD8xGw,15621
13
+ pyobvector/client/schema_type.py,sha256=gH2YiBsgkryo-R0GB_NYuRXMvzvrSjOamZTy6pwn2n0,1673
14
+ pyobvector/json_table/__init__.py,sha256=X5MmK3f10oyJleUUFZJFeunMEfzmf6P1f_7094b-FZc,554
15
+ pyobvector/json_table/json_value_returning_func.py,sha256=NWSV2zhe2-1KhIprQaFqOH3vUVF46YaHIZUqX66WZKM,1864
16
+ pyobvector/json_table/oceanbase_dialect.py,sha256=lxpbWBQdK18LWXLmGyk_-ODv6VfnwGLHbcpsQMElOUo,4480
17
+ pyobvector/json_table/virtual_data_type.py,sha256=uQh6ZQ0UbwpVO9TFegGeu4E8bXW7rdLHAXFQJdiEjLs,3467
18
+ pyobvector/schema/__init__.py,sha256=OMn7Cd2E8o_tm2ArbAXS_zRbiDW2sj7YKPLnbpmaueg,2405
19
+ pyobvector/schema/array.py,sha256=WDWLZbCdu8stK8wlGWfKUjkhWifS8vbsfYUEEJsQOlQ,4163
20
+ pyobvector/schema/dialect.py,sha256=6D9A7Niqig2mwK7C8sP7mCP7kYr5be2jV0xqL87mlz4,1999
21
+ pyobvector/schema/full_text_index.py,sha256=ohQX8uTPdRswEJONuN5A-bNv203d0N0b2BsJ7etx71g,2071
22
+ pyobvector/schema/geo_srid_point.py,sha256=RwEoCgGTmXDc0le1B2E3mZudtqiFdMf2M0Va1ocmVSY,1210
23
+ pyobvector/schema/gis_func.py,sha256=u7bqaB5qIylW8GvRdglLQL2H1SheQZNnAqgZrOGyrks,3118
24
+ pyobvector/schema/match_against_func.py,sha256=ExTQJvAXHaZwBo1Sjy6IlnF1nF6D9xGUsF4f7zaP8Q0,1336
25
+ pyobvector/schema/ob_table.py,sha256=wlb6Oo9LG-sr8XnG_wbX1Qi5CgnS0XUzNL5qTdsncoY,392
26
+ pyobvector/schema/reflection.py,sha256=orA0_lCdcIHw2TumtRCrAH3zG2yAWrGjXOmK5mK9XPw,5903
27
+ pyobvector/schema/replace_stmt.py,sha256=FtGLXHz6DwzD0FOZPn1EZgXdbHZu-K9HIHS02rZqYrE,560
28
+ pyobvector/schema/sparse_vector.py,sha256=ojqUrvKUnxQE8FErB2B58KO540otOJBqiPTMlwcUW2M,1061
29
+ pyobvector/schema/vec_dist_func.py,sha256=4GAWSrhFNDYooBpbBg604wDrByPrewp46Y4VeoDxV7Y,2986
30
+ pyobvector/schema/vector.py,sha256=dFKfPcTOto0jNxVjhvDmJM7Q4wwp6Z-HcZ3K6oZxUMc,1120
31
+ pyobvector/schema/vector_index.py,sha256=D1ZnhJEObWUCd9ESO57KN1ctl10tkEIH_gV0kwGrvu8,2250
32
+ pyobvector/util/__init__.py,sha256=-opvZ4Ya0ByTAhls06547-zW3vkdYRkUH6W5OCKUHD4,388
33
+ pyobvector/util/ob_version.py,sha256=cWkQWoJkIxG6OEF9-gBwJK8LUorltHuKSVAb_NFkpdE,1542
34
+ pyobvector/util/sparse_vector.py,sha256=1IG0CRYfC2z39nGwuG43TImQkWiuPAXOlOnYqJ1hA-o,1275
35
+ pyobvector/util/vector.py,sha256=58glSQqjOSTrGyNhUEIrs9r4F9oaYO_SdPNhMfbSnWs,2392
36
+ pyobvector-0.2.17.dist-info/METADATA,sha256=84qltXOoooYKNqPE-gNyunQioq2AIIvIJB4qRxLGKJY,8965
37
+ pyobvector-0.2.17.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
38
+ pyobvector-0.2.17.dist-info/licenses/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
39
+ pyobvector-0.2.17.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.3
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -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=CAsTHR9juYleRjYIa4bqk_lw14h8daBvChKoU0o19NI,3766
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=CpPo6mkGE8iNFpKGBFof3h7E1VTzy1DAPGlFM9F_s8g,26373
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.15.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
34
- pyobvector-0.2.15.dist-info/METADATA,sha256=msAPB_jEYpVDpBtf3Dvj0-4mmy9OwfXpfP1kODTE38A,6659
35
- pyobvector-0.2.15.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
36
- pyobvector-0.2.15.dist-info/RECORD,,