Skip to content

Commit 9e1a3b3

Browse files
authored
feat: allow tokens for paging (#23)
1 parent 7d3ea43 commit 9e1a3b3

File tree

4 files changed

+37
-5
lines changed

4 files changed

+37
-5
lines changed

Cargo.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pgstacrs.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class Client:
3434
sortby: str | list[str] | None = None,
3535
filter: str | dict[str, Any] | None = None,
3636
query: dict[str, Any] | None = None,
37+
**kwargs: str,
3738
) -> dict[str, Any]:
3839
"""
3940
Searches the database with STAC API item search.
@@ -59,6 +60,7 @@ class Client:
5960
query: Additional filtering based on properties.
6061
It is recommended to use filter instead, if possible.
6162
limit: The page size returned from the server.
63+
kwargs: Any additional arguments to pass down into the search, e.g a pagination token
6264
"""
6365

6466
async def print_config(self) -> None:

src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ impl Client {
293293
})
294294
}
295295

296-
#[pyo3(signature = (*, collections=None, ids=None, intersects=None, bbox=None, datetime=None, include=None, exclude=None, sortby=None, filter=None, query=None, limit=None))]
296+
#[pyo3(signature = (*, collections=None, ids=None, intersects=None, bbox=None, datetime=None, include=None, exclude=None, sortby=None, filter=None, query=None, limit=None, **kwargs))]
297297
fn search<'a>(
298298
&self,
299299
py: Python<'a>,
@@ -308,6 +308,7 @@ impl Client {
308308
filter: Option<StringOrDict>,
309309
query: Option<Bound<'a, PyDict>>,
310310
limit: Option<u64>,
311+
kwargs: Option<Bound<'a, PyDict>>,
311312
) -> PyResult<Bound<'a, PyAny>> {
312313
let search = stac_api::python::search(
313314
intersects,
@@ -321,6 +322,7 @@ impl Client {
321322
sortby,
322323
filter,
323324
query,
325+
kwargs,
324326
)?;
325327
self.run(py, |pool| async move {
326328
let connection = pool.get().await?;

tests/test_search.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import copy
2+
import urllib.parse
23
from typing import Any
34

45
import pytest
@@ -219,3 +220,30 @@ async def test_collections(
219220

220221
feature_collection = await client.search(collections=["simple-collection"])
221222
assert len(feature_collection["features"]) == 1
223+
224+
225+
async def test_pagination(
226+
client: Client, collection: dict[str, Any], item: dict[str, Any]
227+
) -> None:
228+
version = await client.get_version()
229+
230+
await client.create_collection(collection)
231+
item["id"] = "first-item"
232+
await client.create_item(item)
233+
second_item = copy.deepcopy(item)
234+
second_item["id"] = "second-item"
235+
await client.create_item(second_item)
236+
237+
feature_collection = await client.search(limit=1, sortby="id")
238+
239+
if version.startswith("0.9"):
240+
next_link = next(
241+
(link for link in feature_collection["links"] if link["rel"] == "next")
242+
)
243+
url = urllib.parse.urlparse(next_link["href"])
244+
token = url.query.split("=")[1]
245+
elif version.startswith("0.8"):
246+
token = "next:" + feature_collection["next"]
247+
248+
feature_collection = await client.search(limit=1, sortby="id", token=token)
249+
assert feature_collection["features"][0]["id"] == "second-item"

0 commit comments

Comments
 (0)