Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 23 additions & 19 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,34 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
image_tag: ["4.4.1.0-100000032025101610"]
init_sql: ["ALTER SYSTEM ob_vector_memory_limit_percentage = 30; SET GLOBAL ob_query_timeout=100000000;"]
test_filter: ["tests/test_hybrid_search.py::HybridSearchTest"]
include:
- image_tag: "4.3.5.3-103000092025080818"
- python-version: 3.12
image_tag: "4.3.5.3-103000092025080818"
init_sql: "ALTER SYSTEM ob_vector_memory_limit_percentage = 30; CREATE USER 'jtuser'@'%'; GRANT SELECT, INSERT, UPDATE, DELETE ON test.* TO 'jtuser'@'%'; FLUSH PRIVILEGES;"
test_filter: "-k \"not HybridSearchTest\""
- image_tag: "4.4.1.0-100000032025101610"
init_sql: "ALTER SYSTEM ob_vector_memory_limit_percentage = 30; SET GLOBAL ob_query_timeout=100000000;"
test_filter: "tests/test_hybrid_search.py::HybridSearchTest"

steps:
- name: Check out code
uses: actions/checkout@v6

- name: Install uv
uses: astral-sh/setup-uv@v6
with:
python-version: ${{ matrix.python-version }}

- name: Install dependencies
run: uv sync --dev

- name: Lint
run: uv run ruff check

- name: Package build test
run: uv build

- name: Free disk space
uses: kfir4444/free-disk-space@main
with:
Expand All @@ -32,21 +51,6 @@ jobs:
large-packages: true
swap-storage: true

- name: Check out code
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v3
with:
python-version: '3.x'

- name: Install uv
uses: astral-sh/setup-uv@v6

- name: Install dependencies
run: |
uv sync --dev

- name: Start OceanBase container
uses: oceanbase/setup-oceanbase-ce@v1
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/python-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6

- name: Set up Python
uses: actions/setup-python@v3
uses: actions/setup-python@v6
with:
python-version: '3.x'

Expand Down
4 changes: 2 additions & 2 deletions pyobvector/client/collection_schema.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""FieldSchema & CollectionSchema definition module to be compatible with Milvus."""
import copy
from typing import Optional, List
from typing import Optional
from sqlalchemy import Column
from .schema_type import DataType, convert_datatype_to_sqltype
from .exceptions import *
Expand Down Expand Up @@ -125,7 +125,7 @@ class CollectionSchema:
"""
def __init__(
self,
fields: Optional[List[FieldSchema]] = None,
fields: Optional[list[FieldSchema]] = None,
partitions: Optional[ObPartition] = None,
description: str = "", # ignored in oceanbase
**kwargs,
Expand Down
4 changes: 2 additions & 2 deletions pyobvector/client/fts_index_param.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""A module to specify fts index parameters"""
from enum import Enum
from typing import List, Optional, Union
from typing import Optional, Union

class FtsParser(Enum):
"""Built-in full-text search parser types supported by OceanBase"""
Expand All @@ -23,7 +23,7 @@ class FtsIndexParam:
def __init__(
self,
index_name: str,
field_names: List[str],
field_names: list[str],
parser_type: Optional[Union[FtsParser, str]] = None,
):
self.index_name = index_name
Expand Down
6 changes: 3 additions & 3 deletions pyobvector/client/hybrid_search.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""OceanBase Hybrid Search Client."""
import json
import logging
from typing import Dict, Any
from typing import Any

from sqlalchemy import text

Expand Down Expand Up @@ -41,7 +41,7 @@ def __init__(
def search(
self,
index: str,
body: Dict[str, Any],
body: dict[str, Any],
**kwargs,
):
"""Execute hybrid search with parameter compatible with Elasticsearch.
Expand All @@ -66,7 +66,7 @@ def search(
def get_sql(
self,
index: str,
body: Dict[str, Any],
body: dict[str, Any],
) -> str:
"""Get the SQL actually to be executed in hybrid search.

Expand Down
28 changes: 14 additions & 14 deletions pyobvector/client/milvus_like_client.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Milvus Like Client."""
import logging
import json
from typing import Optional, Union, Dict, List
from typing import Optional, Union

from sqlalchemy.exc import NoSuchTableError
from sqlalchemy import (
Expand Down Expand Up @@ -147,7 +147,7 @@ def create_collection(

def get_collection_stats(
self, collection_name: str, timeout: Optional[float] = None # pylint: disable=unused-argument
) -> Dict:
) -> dict:
"""Get collection row count.

Args:
Expand Down Expand Up @@ -354,12 +354,12 @@ def search(
with_dist: bool = False,
flter=None,
limit: int = 10,
output_fields: Optional[List[str]] = None,
output_fields: Optional[list[str]] = None,
search_params: Optional[dict] = None,
timeout: Optional[float] = None, # pylint: disable=unused-argument
partition_names: Optional[List[str]] = None,
partition_names: Optional[list[str]] = None,
**kwargs, # pylint: disable=unused-argument
) -> List[dict]:
) -> list[dict]:
"""Perform ann search.
Note: OceanBase does not support batch search now. `data` & the return value is not a batch.

Expand Down Expand Up @@ -467,11 +467,11 @@ def query(
self,
collection_name: str,
flter=None,
output_fields: Optional[List[str]] = None,
output_fields: Optional[list[str]] = None,
timeout: Optional[float] = None, # pylint: disable=unused-argument
partition_names: Optional[List[str]] = None,
partition_names: Optional[list[str]] = None,
**kwargs, # pylint: disable=unused-argument
) -> List[dict]:
) -> list[dict]:
"""Query records.

Args:
Expand Down Expand Up @@ -533,11 +533,11 @@ def get(
self,
collection_name: str,
ids: Union[list, str, int] = None,
output_fields: Optional[List[str]] = None,
output_fields: Optional[list[str]] = None,
timeout: Optional[float] = None, # pylint: disable=unused-argument
partition_names: Optional[List[str]] = None,
partition_names: Optional[list[str]] = None,
**kwargs, # pylint: disable=unused-argument
) -> List[dict]:
) -> list[dict]:
"""Get records with specified primary field `ids`.

Args:
Expand Down Expand Up @@ -672,7 +672,7 @@ def delete(
def insert(
self,
collection_name: str,
data: Union[Dict, List[Dict]],
data: Union[dict, list[dict]],
timeout: Optional[float] = None,
partition_name: Optional[str] = "",
) -> (
Expand Down Expand Up @@ -700,10 +700,10 @@ def insert(
def upsert(
self,
collection_name: str,
data: Union[Dict, List[Dict]],
data: Union[dict, list[dict]],
timeout: Optional[float] = None, # pylint: disable=unused-argument
partition_name: Optional[str] = "",
) -> List[Union[str, int]]:
) -> list[Union[str, int]]:
"""Update data in table. If primary key is duplicated, replace it.

Args:
Expand Down
18 changes: 9 additions & 9 deletions pyobvector/client/ob_client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import logging
from typing import List, Optional, Dict, Union
from typing import Optional, Union
from urllib.parse import quote

import sqlalchemy.sql.functions as func_mod
Expand Down Expand Up @@ -141,8 +141,8 @@ def check_table_exists(self, table_name: str):
def create_table(
self,
table_name: str,
columns: List[Column],
indexes: Optional[List[Index]] = None,
columns: list[Column],
indexes: Optional[list[Index]] = None,
partitions: Optional[ObPartition] = None,
**kwargs,
):
Expand Down Expand Up @@ -208,7 +208,7 @@ def drop_index(self, table_name: str, index_name: str):
def insert(
self,
table_name: str,
data: Union[Dict, List[Dict]],
data: Union[dict, list[dict]],
partition_name: Optional[str] = "",
):
"""Insert data into table.
Expand All @@ -218,7 +218,7 @@ def insert(
data (Union[Dict, List[Dict]]): data that will be inserted
partition_name (Optional[str]): limit the query to certain partition
"""
if isinstance(data, Dict):
if isinstance(data, dict):
data = [data]

if len(data) == 0:
Expand All @@ -240,7 +240,7 @@ def insert(
def upsert(
self,
table_name: str,
data: Union[Dict, List[Dict]],
data: Union[dict, list[dict]],
partition_name: Optional[str] = "",
):
"""Update data in table. If primary key is duplicated, replace it.
Expand All @@ -250,7 +250,7 @@ def upsert(
data (Union[Dict, List[Dict]]): data that will be upserted
partition_name (Optional[str]): limit the query to certain partition
"""
if isinstance(data, Dict):
if isinstance(data, dict):
data = [data]

if len(data) == 0:
Expand Down Expand Up @@ -365,8 +365,8 @@ def get(
table_name: str,
ids: Optional[Union[list, str, int]] = None,
where_clause=None,
output_column_name: Optional[List[str]] = None,
partition_names: Optional[List[str]] = None,
output_column_name: Optional[list[str]] = None,
partition_names: Optional[list[str]] = None,
n_limits: Optional[int] = None,
):
"""Get records with specified primary field `ids`.
Expand Down
30 changes: 15 additions & 15 deletions pyobvector/client/ob_vec_client.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""OceanBase Vector Store Client."""
import logging
from typing import List, Optional, Union
from typing import Optional, Union

import numpy as np
from sqlalchemy import (
Expand Down Expand Up @@ -60,10 +60,10 @@ def _get_sparse_vector_index_params(
def create_table_with_index_params(
self,
table_name: str,
columns: List[Column],
indexes: Optional[List[Index]] = None,
columns: list[Column],
indexes: Optional[list[Index]] = None,
vidxs: Optional[IndexParams] = None,
fts_idxs: Optional[List[FtsIndexParam]] = None,
fts_idxs: Optional[list[FtsIndexParam]] = None,
partitions: Optional[ObPartition] = None,
):
"""Create table with optional index_params.
Expand Down Expand Up @@ -140,7 +140,7 @@ def create_index(
table_name: str,
is_vec_index: bool,
index_name: str,
column_names: List[str],
column_names: list[str],
vidx_params: Optional[str] = None,
**kw,
):
Expand Down Expand Up @@ -274,12 +274,12 @@ def ann_search(
distance_func,
with_dist: bool = False,
topk: int = 10,
output_column_names: Optional[List[str]] = None,
output_columns: Optional[Union[List, tuple]] = None,
extra_output_cols: Optional[List] = None,
output_column_names: Optional[list[str]] = None,
output_columns: Optional[Union[list, tuple]] = None,
extra_output_cols: Optional[list] = None,
where_clause=None,
partition_names: Optional[List[str]] = None,
idx_name_hint: Optional[List[str]] = None,
partition_names: Optional[list[str]] = None,
idx_name_hint: Optional[list[str]] = None,
distance_threshold: Optional[float] = None,
**kwargs,
): # pylint: disable=unused-argument
Expand Down Expand Up @@ -403,11 +403,11 @@ def post_ann_search(
distance_func,
with_dist: bool = False,
topk: int = 10,
output_column_names: Optional[List[str]] = None,
extra_output_cols: Optional[List] = None,
output_column_names: Optional[list[str]] = None,
extra_output_cols: Optional[list] = None,
where_clause=None,
partition_names: Optional[List[str]] = None,
str_list: Optional[List[str]] = None,
partition_names: Optional[list[str]] = None,
str_list: Optional[list[str]] = None,
**kwargs,
): # pylint: disable=unused-argument
"""Perform post ann search.
Expand Down Expand Up @@ -483,7 +483,7 @@ def precise_search(
vec_column_name: str,
distance_func,
topk: int = 10,
output_column_names: Optional[List[str]] = None,
output_column_names: Optional[list[str]] = None,
where_clause=None,
**kwargs,
): # pylint: disable=unused-argument
Expand Down
Loading