Skip to content

Commit 1b7bbaf

Browse files
committed
Update elasticsearch ext
1 parent 3709a06 commit 1b7bbaf

File tree

3 files changed

+2975
-28
lines changed

3 files changed

+2975
-28
lines changed

fastapi_pagination/bases.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class PydanticUndefinedAnnotation(Exception): # type: ignore[no-redef]
4141

4242
from collections.abc import Sequence
4343

44-
from typing_extensions import Self, TypeGuard
44+
from typing_extensions import Self, TypeIs
4545

4646
from .types import Cursor, GreaterEqualZero, ParamsType
4747

@@ -68,11 +68,11 @@ def as_cursor(self) -> CursorRawParams:
6868
raise ValueError("Not a 'cursor' params")
6969

7070

71-
def is_limit_offset(params: BaseRawParams) -> TypeGuard[RawParams]:
71+
def is_limit_offset(params: BaseRawParams) -> TypeIs[RawParams]:
7272
return params.type == "limit-offset"
7373

7474

75-
def is_cursor(params: BaseRawParams) -> TypeGuard[CursorRawParams]:
75+
def is_cursor(params: BaseRawParams) -> TypeIs[CursorRawParams]:
7676
return params.type == "cursor"
7777

7878

fastapi_pagination/ext/elasticsearch.py

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,54 +2,57 @@
22
"paginate",
33
]
44

5+
from typing import Any, Optional
56

67
from elasticsearch import Elasticsearch
78
from elasticsearch_dsl import Search
89

910
from fastapi_pagination.api import apply_items_transformer, create_page
10-
from fastapi_pagination.bases import AbstractParams, CursorRawParams, is_limit_offset
11+
from fastapi_pagination.bases import AbstractParams, is_limit_offset
1112
from fastapi_pagination.types import AdditionalData, SyncItemsTransformer
1213
from fastapi_pagination.utils import verify_params
1314

1415

1516
def paginate(
1617
conn: Elasticsearch,
1718
query: Search,
18-
params: AbstractParams | None = None,
19+
params: Optional[AbstractParams] = None,
1920
*,
20-
transformer: SyncItemsTransformer | None = None,
21-
additional_data: AdditionalData | None = None,
22-
):
21+
transformer: Optional[SyncItemsTransformer] = None,
22+
additional_data: Optional[AdditionalData] = None,
23+
) -> Any:
2324
params, raw_params = verify_params(params, "limit-offset", "cursor")
24-
if is_limit_offset(raw_params):
25-
total = query.using(conn).count()
26-
response = query.using(conn)[raw_params.offset : raw_params.offset + raw_params.limit].execute()
27-
items = response
28-
t_items = apply_items_transformer(items, transformer)
29-
return create_page(
30-
t_items,
31-
total=total,
32-
params=params,
33-
**(additional_data or {}),
34-
)
3525

3626
total = None
3727
if raw_params.include_total:
3828
total = query.using(conn).count()
39-
raw_params: CursorRawParams
40-
if not raw_params.cursor:
41-
response = query.params(scroll="1m").extra(size=raw_params.size).execute()
42-
items = response.hits
43-
next_ = response._scroll_id
29+
30+
kwargs = {}
31+
items: Any
32+
33+
if is_limit_offset(raw_params):
34+
items = query.using(conn)[raw_params.as_slice()].execute()
4435
else:
45-
response = conn.scroll(scroll_id=raw_params.cursor, scroll="1m")
46-
next_ = response.get("_scroll_id")
47-
items = [item.get("_source") for item in response["hits"]["hits"]]
36+
raw_params = raw_params.as_cursor()
37+
38+
response: Any
39+
if not raw_params.cursor:
40+
response = query.params(scroll="1m").extra(size=raw_params.size).execute()
41+
items = response.hits
42+
next_ = response._scroll_id
43+
else:
44+
response = conn.scroll(scroll_id=raw_params.cursor, scroll="1m") # type: ignore[arg-type]
45+
next_ = response.get("_scroll_id")
46+
items = [item.get("_source") for item in response["hits"]["hits"]]
47+
48+
kwargs["next_"] = next_
49+
4850
t_items = apply_items_transformer(items, transformer)
51+
4952
return create_page(
5053
t_items,
5154
total=total,
5255
params=params,
53-
next_=next_,
56+
**kwargs,
5457
**(additional_data or {}),
5558
)

0 commit comments

Comments
 (0)