Skip to content

Commit 9d66d59

Browse files
committed
add query to item collection
1 parent db0e448 commit 9d66d59

File tree

4 files changed

+41
-2
lines changed

4 files changed

+41
-2
lines changed

stac_fastapi/core/stac_fastapi/core/core.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ async def item_collection(
289289
limit: Optional[int] = None,
290290
sortby: Optional[str] = None,
291291
token: Optional[str] = None,
292+
query: Optional[str] = None,
292293
**kwargs,
293294
) -> stac_types.ItemCollection:
294295
"""List items within a specific collection.
@@ -306,6 +307,7 @@ async def item_collection(
306307
like ``sortby=-properties.datetime`` or ``sortby=+id``. Bare fields (e.g. ``sortby=id``)
307308
imply ascending order.
308309
token (Optional[str]): Optional pagination token.
310+
query (Optional[str]): Optional query string.
309311
**kwargs: Must include ``request`` (FastAPI Request).
310312
311313
Returns:
@@ -330,6 +332,7 @@ async def item_collection(
330332
limit=limit,
331333
token=token,
332334
sortby=sortby,
335+
query=query,
333336
)
334337

335338
async def get_item(

stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
TransactionExtension,
4545
)
4646
from stac_fastapi.extensions.core.filter import FilterConformanceClasses
47+
from stac_fastapi.extensions.core.query import QueryConformanceClasses
4748
from stac_fastapi.extensions.core.sort import SortConformanceClasses
4849
from stac_fastapi.extensions.third_party import BulkTransactionExtension
4950
from stac_fastapi.sfeos_helpers.aggregation import EsAsyncBaseAggregationClient
@@ -127,7 +128,10 @@
127128
extensions=[
128129
SortExtension(
129130
conformance_classes=[SortConformanceClasses.ITEMS],
130-
)
131+
),
132+
QueryExtension(
133+
conformance_classes=[QueryConformanceClasses.ITEMS],
134+
),
131135
],
132136
request_type="GET",
133137
)

stac_fastapi/opensearch/stac_fastapi/opensearch/app.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
TransactionExtension,
3939
)
4040
from stac_fastapi.extensions.core.filter import FilterConformanceClasses
41+
from stac_fastapi.extensions.core.query import QueryConformanceClasses
4142
from stac_fastapi.extensions.core.sort import SortConformanceClasses
4243
from stac_fastapi.extensions.third_party import BulkTransactionExtension
4344
from stac_fastapi.opensearch.config import OpensearchSettings
@@ -127,7 +128,10 @@
127128
extensions=[
128129
SortExtension(
129130
conformance_classes=[SortConformanceClasses.ITEMS],
130-
)
131+
),
132+
QueryExtension(
133+
conformance_classes=[QueryConformanceClasses.ITEMS],
134+
),
131135
],
132136
request_type="GET",
133137
)

stac_fastapi/tests/api/test_api.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,3 +1606,31 @@ async def test_collection_items_sort_asc(app_client, txn_client, ctx):
16061606
resp_json = resp.json()
16071607
assert resp_json["features"][0]["id"] == second_item["id"]
16081608
assert resp_json["features"][1]["id"] == first_item["id"]
1609+
1610+
1611+
@pytest.mark.asyncio
1612+
async def test_item_collection_query(app_client, txn_client, ctx):
1613+
"""Simple query parameter test on the Item Collection route.
1614+
1615+
Creates an item with a unique property and ensures it can be retrieved
1616+
using the 'query' parameter on GET /collections/{collection_id}/items.
1617+
"""
1618+
unique_val = str(uuid.uuid4())
1619+
test_item = deepcopy(ctx.item)
1620+
test_item["id"] = f"query-basic-{unique_val}"
1621+
# Add a property to filter on
1622+
test_item.setdefault("properties", {})["test_query_key"] = unique_val
1623+
1624+
await create_item(txn_client, test_item)
1625+
1626+
# Provide the query parameter as a JSON string without adding new imports
1627+
query_param = f'{{"test_query_key": {{"eq": "{unique_val}"}}}}'
1628+
1629+
resp = await app_client.get(
1630+
f"/collections/{test_item['collection']}/items",
1631+
params=[("query", query_param)],
1632+
)
1633+
assert resp.status_code == 200
1634+
resp_json = resp.json()
1635+
ids = [f["id"] for f in resp_json["features"]]
1636+
assert test_item["id"] in ids

0 commit comments

Comments
 (0)