Skip to content

Commit 8892ec6

Browse files
authored
Merge pull request #1206 from sanders41/get-batches
Add option to pass parameters to get_batches
2 parents 78b8a52 + 8f3eac9 commit 8892ec6

File tree

4 files changed

+206
-10
lines changed

4 files changed

+206
-10
lines changed

meilisearch_python_sdk/_batch.py

Lines changed: 118 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
from datetime import datetime
34
from typing import TYPE_CHECKING
45

56
from meilisearch_python_sdk._utils import get_async_client, get_client
@@ -28,9 +29,38 @@ async def async_get_batch(
2829
return BatchResult(**response.json())
2930

3031

31-
async def async_get_batches(client: HttpxAsyncClient | AsyncClient) -> BatchStatus:
32+
async def async_get_batches(
33+
client: HttpxAsyncClient | AsyncClient,
34+
*,
35+
uids: list[int] | None = None,
36+
batch_uids: list[int] | None = None,
37+
index_uids: list[int] | None = None,
38+
statuses: list[str] | None = None,
39+
types: list[str] | None = None,
40+
limit: int = 20,
41+
from_: str | None = None,
42+
reverse: bool = False,
43+
before_enqueued_at: datetime | None = None,
44+
after_enqueued_at: datetime | None = None,
45+
before_started_at: datetime | None = None,
46+
after_finished_at: datetime | None = None,
47+
) -> BatchStatus:
3248
client_ = get_async_client(client)
33-
response = await client_.get("batches")
49+
params = _build_parameters(
50+
uids=uids,
51+
batch_uids=batch_uids,
52+
index_uids=index_uids,
53+
statuses=statuses,
54+
types=types,
55+
limit=limit,
56+
from_=from_,
57+
reverse=reverse,
58+
before_enqueued_at=before_enqueued_at,
59+
after_enqueued_at=after_enqueued_at,
60+
before_started_at=before_started_at,
61+
after_finished_at=after_finished_at,
62+
)
63+
response = await client_.get("batches", params=params)
3464

3565
return BatchStatus(**response.json())
3666

@@ -45,8 +75,92 @@ def get_batch(client: HttpxClient | Client, batch_uid: int) -> BatchResult | Non
4575
return BatchResult(**response.json())
4676

4777

48-
def get_batches(client: HttpxClient | Client) -> BatchStatus:
78+
def get_batches(
79+
client: HttpxClient | Client,
80+
*,
81+
uids: list[int] | None = None,
82+
batch_uids: list[int] | None = None,
83+
index_uids: list[int] | None = None,
84+
statuses: list[str] | None = None,
85+
types: list[str] | None = None,
86+
limit: int = 20,
87+
from_: str | None = None,
88+
reverse: bool = False,
89+
before_enqueued_at: datetime | None = None,
90+
after_enqueued_at: datetime | None = None,
91+
before_started_at: datetime | None = None,
92+
after_finished_at: datetime | None = None,
93+
) -> BatchStatus:
4994
client_ = get_client(client)
50-
response = client_.get("batches")
95+
params = _build_parameters(
96+
uids=uids,
97+
batch_uids=batch_uids,
98+
index_uids=index_uids,
99+
statuses=statuses,
100+
types=types,
101+
limit=limit,
102+
from_=from_,
103+
reverse=reverse,
104+
before_enqueued_at=before_enqueued_at,
105+
after_enqueued_at=after_enqueued_at,
106+
before_started_at=before_started_at,
107+
after_finished_at=after_finished_at,
108+
)
109+
110+
response = client_.get("batches", params=params)
51111

52112
return BatchStatus(**response.json())
113+
114+
115+
def _build_parameters(
116+
*,
117+
uids: list[int] | None = None,
118+
batch_uids: list[int] | None = None,
119+
index_uids: list[int] | None = None,
120+
statuses: list[str] | None = None,
121+
types: list[str] | None = None,
122+
limit: int = 20,
123+
from_: str | None = None,
124+
reverse: bool = False,
125+
before_enqueued_at: datetime | None = None,
126+
after_enqueued_at: datetime | None = None,
127+
before_started_at: datetime | None = None,
128+
after_finished_at: datetime | None = None,
129+
) -> dict[str, str]:
130+
params = {}
131+
132+
if uids:
133+
params["uids"] = ",".join([str(uid) for uid in uids])
134+
135+
if batch_uids: # pragma: no cover
136+
params["batchUids"] = ",".join([str(uid) for uid in batch_uids])
137+
138+
if index_uids: # pragma: no cover
139+
params["indexUids"] = ",".join([str(uid) for uid in index_uids])
140+
141+
if statuses: # pragma: no cover
142+
params["statuses"] = ",".join(statuses)
143+
144+
if types: # pragma: no cover
145+
params["types"] = ",".join(types)
146+
147+
params["limit"] = str(limit)
148+
149+
if from_: # pragma: no cover
150+
params["from"] = from_
151+
152+
params["reverse"] = "true" if reverse else "false"
153+
154+
if before_enqueued_at: # pragma: no cover
155+
params["beforeEnqueuedAt"] = before_enqueued_at.isoformat()
156+
157+
if after_enqueued_at: # pragma: no cover
158+
params["afterEnqueuedAt"] = after_enqueued_at.isoformat()
159+
160+
if before_started_at: # pragma: no cover
161+
params["beforeStartedAt"] = before_started_at.isoformat()
162+
163+
if after_finished_at: # pragma: no cover
164+
params["afterFinishedAt"] = after_finished_at.isoformat()
165+
166+
return params

meilisearch_python_sdk/_client.py

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
from httpx import Client as HttpxClient
1010

1111
from meilisearch_python_sdk import _task
12-
from meilisearch_python_sdk._batch import async_get_batch, async_get_batches, get_batch, get_batches
12+
from meilisearch_python_sdk._batch import async_get_batch, async_get_batches
13+
from meilisearch_python_sdk._batch import get_batch as _get_batch
14+
from meilisearch_python_sdk._batch import get_batches as _get_batches
1315
from meilisearch_python_sdk._http_requests import AsyncHttpRequests, HttpRequests
1416
from meilisearch_python_sdk.errors import InvalidRestriction, MeilisearchApiError
1517
from meilisearch_python_sdk.index import AsyncIndex, Index
@@ -775,8 +777,37 @@ async def swap_indexes(self, indexes: list[tuple[str, str]]) -> TaskInfo:
775777
async def get_batch(self, batch_uid: int) -> BatchResult | None:
776778
return await async_get_batch(self, batch_uid)
777779

778-
async def get_batches(self) -> BatchStatus:
779-
return await async_get_batches(self)
780+
async def get_batches(
781+
self,
782+
*,
783+
uids: list[int] | None = None,
784+
batch_uids: list[int] | None = None,
785+
index_uids: list[int] | None = None,
786+
statuses: list[str] | None = None,
787+
types: list[str] | None = None,
788+
limit: int = 20,
789+
from_: str | None = None,
790+
reverse: bool = False,
791+
before_enqueued_at: datetime | None = None,
792+
after_enqueued_at: datetime | None = None,
793+
before_started_at: datetime | None = None,
794+
after_finished_at: datetime | None = None,
795+
) -> BatchStatus:
796+
return await async_get_batches(
797+
self,
798+
uids=uids,
799+
batch_uids=batch_uids,
800+
index_uids=index_uids,
801+
statuses=statuses,
802+
types=types,
803+
limit=limit,
804+
from_=from_,
805+
reverse=reverse,
806+
before_enqueued_at=before_enqueued_at,
807+
after_enqueued_at=after_enqueued_at,
808+
before_started_at=before_started_at,
809+
after_finished_at=after_finished_at,
810+
)
780811

781812
async def cancel_tasks(
782813
self,
@@ -1599,10 +1630,39 @@ def swap_indexes(self, indexes: list[tuple[str, str]]) -> TaskInfo:
15991630
return TaskInfo(**response.json())
16001631

16011632
def get_batch(self, batch_uid: int) -> BatchResult | None:
1602-
return get_batch(self, batch_uid)
1633+
return _get_batch(self, batch_uid)
16031634

1604-
def get_batches(self) -> BatchStatus:
1605-
return get_batches(self)
1635+
def get_batches(
1636+
self,
1637+
*,
1638+
uids: list[int] | None = None,
1639+
batch_uids: list[int] | None = None,
1640+
index_uids: list[int] | None = None,
1641+
statuses: list[str] | None = None,
1642+
types: list[str] | None = None,
1643+
limit: int = 20,
1644+
from_: str | None = None,
1645+
reverse: bool = False,
1646+
before_enqueued_at: datetime | None = None,
1647+
after_enqueued_at: datetime | None = None,
1648+
before_started_at: datetime | None = None,
1649+
after_finished_at: datetime | None = None,
1650+
) -> BatchStatus:
1651+
return _get_batches(
1652+
self,
1653+
uids=uids,
1654+
batch_uids=batch_uids,
1655+
index_uids=index_uids,
1656+
statuses=statuses,
1657+
types=types,
1658+
limit=limit,
1659+
from_=from_,
1660+
reverse=reverse,
1661+
before_enqueued_at=before_enqueued_at,
1662+
after_enqueued_at=after_enqueued_at,
1663+
before_started_at=before_started_at,
1664+
after_finished_at=after_finished_at,
1665+
)
16061666

16071667
def cancel_tasks(
16081668
self,

tests/test_async_client.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,17 @@ async def test_get_batches(async_client, async_empty_index, small_movies):
10211021
assert len(result.results) > 0
10221022

10231023

1024+
async def test_get_batches_with_params(async_client, async_empty_index, small_movies):
1025+
# Add documents to create batches
1026+
index = await async_empty_index()
1027+
tasks = await index.add_documents_in_batches(small_movies, batch_size=5)
1028+
waits = [async_client.wait_for_task(x.task_uid) for x in tasks]
1029+
await asyncio.gather(*waits)
1030+
1031+
result = await async_client.get_batches(uids=[task.task_uid for task in tasks])
1032+
assert len(result.results) > 0
1033+
1034+
10241035
async def test_get_batch(async_client, async_empty_index, small_movies):
10251036
# Add documents to create batches
10261037
index = await async_empty_index()

tests/test_client.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,17 @@ def test_get_batches(client, empty_index, small_movies):
10021002
assert len(result.results) > 0
10031003

10041004

1005+
def test_get_batches_with_params(client, empty_index, small_movies):
1006+
# Add documents to create batches
1007+
index = empty_index()
1008+
tasks = index.add_documents_in_batches(small_movies, batch_size=5)
1009+
for task in tasks:
1010+
client.wait_for_task(task.task_uid)
1011+
1012+
result = client.get_batches(uids=[task.task_uid for task in tasks])
1013+
assert len(result.results) > 0
1014+
1015+
10051016
def test_get_batch(client, empty_index, small_movies):
10061017
# Add documents to create batches
10071018
index = empty_index()

0 commit comments

Comments
 (0)