Skip to content

Commit e556f57

Browse files
committed
fix(types): type multi-search union requests and responses
- add typed union/standard request schemas for multi-search - return `SearchResponse` when `union=true` in sync and async clients
1 parent e863b44 commit e556f57

3 files changed

Lines changed: 97 additions & 19 deletions

File tree

src/typesense/async_/multi_search.py

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,14 @@
2020

2121
from .api_call import AsyncApiCall
2222
from typesense.preprocess import stringify_search_params
23-
from typesense.types.document import MultiSearchCommonParameters
24-
from typesense.types.multi_search import MultiSearchRequestSchema, MultiSearchResponse
23+
from typesense.types.document import MultiSearchCommonParameters, SearchResponse
24+
from typesense.types.multi_search import (
25+
MultiSearchRequestSchema,
26+
MultiSearchRequestSchemaMulti,
27+
MultiSearchRequestSchemaUnion,
28+
MultiSearchResponse,
29+
MultiSearchResponseSchema,
30+
)
2531

2632
if sys.version_info >= (3, 11):
2733
import typing
@@ -51,11 +57,27 @@ def __init__(self, api_call: AsyncApiCall) -> None:
5157
"""
5258
self.api_call = api_call
5359

60+
@typing.overload
5461
async def perform(
5562
self,
56-
search_queries: MultiSearchRequestSchema,
63+
search_queries: MultiSearchRequestSchemaUnion,
64+
common_params: typing.Union[MultiSearchCommonParameters, None] = None,
65+
) -> SearchResponse[typing.Any]:
66+
"""Perform a union multi-search operation."""
67+
68+
@typing.overload
69+
async def perform(
70+
self,
71+
search_queries: MultiSearchRequestSchemaMulti,
5772
common_params: typing.Union[MultiSearchCommonParameters, None] = None,
5873
) -> MultiSearchResponse:
74+
"""Perform a standard multi-search operation."""
75+
76+
async def perform(
77+
self,
78+
search_queries: MultiSearchRequestSchema,
79+
common_params: typing.Union[MultiSearchCommonParameters, None] = None,
80+
) -> MultiSearchResponseSchema:
5981
"""
6082
Perform a multi-search operation.
6183
@@ -72,9 +94,9 @@ async def perform(
7294
Common parameters to apply to all search queries. Defaults to None.
7395
7496
Returns:
75-
MultiSearchResponse:
76-
The response from the multi-search operation, containing
77-
the results of all search queries.
97+
MultiSearchResponseSchema:
98+
A standard multi-search response for non-union requests,
99+
or a search response when ``union=True``.
78100
79101
Example:
80102
>>> multi_search = AsyncMultiSearch(async_api_call)
@@ -98,11 +120,17 @@ async def perform(
98120
"searches": stringified_search_params,
99121
"union": search_queries.get("union", False),
100122
}
101-
response: MultiSearchResponse = await self.api_call.post(
123+
entity_type: typing.Type[typing.Any]
124+
if search_body["union"]:
125+
entity_type = SearchResponse
126+
else:
127+
entity_type = MultiSearchResponse
128+
129+
response: MultiSearchResponseSchema = await self.api_call.post(
102130
AsyncMultiSearch.resource_path,
103131
body=search_body,
104132
params=common_params,
105133
as_json=True,
106-
entity_type=MultiSearchResponse,
134+
entity_type=entity_type,
107135
)
108136
return response

src/typesense/sync/multi_search.py

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,14 @@
2020

2121
from .api_call import ApiCall
2222
from typesense.preprocess import stringify_search_params
23-
from typesense.types.document import MultiSearchCommonParameters
24-
from typesense.types.multi_search import MultiSearchRequestSchema, MultiSearchResponse
23+
from typesense.types.document import MultiSearchCommonParameters, SearchResponse
24+
from typesense.types.multi_search import (
25+
MultiSearchRequestSchema,
26+
MultiSearchRequestSchemaMulti,
27+
MultiSearchRequestSchemaUnion,
28+
MultiSearchResponse,
29+
MultiSearchResponseSchema,
30+
)
2531

2632
if sys.version_info >= (3, 11):
2733
import typing
@@ -51,11 +57,27 @@ def __init__(self, api_call: ApiCall) -> None:
5157
"""
5258
self.api_call = api_call
5359

60+
@typing.overload
5461
def perform(
5562
self,
56-
search_queries: MultiSearchRequestSchema,
63+
search_queries: MultiSearchRequestSchemaUnion,
64+
common_params: typing.Union[MultiSearchCommonParameters, None] = None,
65+
) -> SearchResponse[typing.Any]:
66+
"""Perform a union multi-search operation."""
67+
68+
@typing.overload
69+
def perform(
70+
self,
71+
search_queries: MultiSearchRequestSchemaMulti,
5772
common_params: typing.Union[MultiSearchCommonParameters, None] = None,
5873
) -> MultiSearchResponse:
74+
"""Perform a standard multi-search operation."""
75+
76+
def perform(
77+
self,
78+
search_queries: MultiSearchRequestSchema,
79+
common_params: typing.Union[MultiSearchCommonParameters, None] = None,
80+
) -> MultiSearchResponseSchema:
5981
"""
6082
Perform a multi-search operation.
6183
@@ -72,9 +94,9 @@ def perform(
7294
Common parameters to apply to all search queries. Defaults to None.
7395
7496
Returns:
75-
MultiSearchResponse:
76-
The response from the multi-search operation, containing
77-
the results of all search queries.
97+
MultiSearchResponseSchema:
98+
A standard multi-search response for non-union requests,
99+
or a search response when ``union=True``.
78100
79101
Example:
80102
>>> multi_search = MultiSearch(async_api_call)
@@ -98,11 +120,17 @@ def perform(
98120
"searches": stringified_search_params,
99121
"union": search_queries.get("union", False),
100122
}
101-
response: MultiSearchResponse = self.api_call.post(
123+
entity_type: typing.Type[typing.Any]
124+
if search_body["union"]:
125+
entity_type = SearchResponse
126+
else:
127+
entity_type = MultiSearchResponse
128+
129+
response: MultiSearchResponseSchema = self.api_call.post(
102130
MultiSearch.resource_path,
103131
body=search_body,
104132
params=common_params,
105133
as_json=True,
106-
entity_type=MultiSearchResponse,
134+
entity_type=entity_type,
107135
)
108136
return response

src/typesense/types/multi_search.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,35 @@ class MultiSearchResponse(typing.TypedDict):
2121
results: typing.List[SearchResponse[typing.Any]] # noqa: WPS110
2222

2323

24-
class MultiSearchRequestSchema(typing.TypedDict):
24+
class MultiSearchRequestSchemaUnion(typing.TypedDict):
2525
"""
26-
Schema for multi-search request.
26+
Schema for union multi-search request.
2727
2828
Attributes:
2929
searches (list[MultiSearchParameters]): The search parameters.
3030
"""
3131

32-
union: typing.NotRequired[typing.Literal[True]]
32+
union: typing.Literal[True]
3333
searches: typing.List[MultiSearchParameters]
34+
35+
36+
class MultiSearchRequestSchemaMulti(typing.TypedDict):
37+
"""
38+
Schema for standard multi-search request.
39+
40+
Attributes:
41+
searches (list[MultiSearchParameters]): The search parameters.
42+
"""
43+
44+
union: typing.NotRequired[typing.Literal[False]]
45+
searches: typing.List[MultiSearchParameters]
46+
47+
48+
MultiSearchRequestSchema = typing.Union[
49+
MultiSearchRequestSchemaUnion,
50+
MultiSearchRequestSchemaMulti,
51+
]
52+
MultiSearchResponseSchema = typing.Union[
53+
MultiSearchResponse,
54+
SearchResponse[typing.Any],
55+
]

0 commit comments

Comments
 (0)