Skip to content

Commit 2f648e4

Browse files
PB-1677: Add "properties." prefix to sortby params
Follow-up of #664: Prepend `properties.` to certain parameters used in the `sortby` query parameter and in the `/sortables` endpoint: - `datetime` -> `properties.datetime` - `title` -> `properties.title` - `created` -> `properties.created` - `updated` -> `properties.updated` - `id` and `collection` stay unchanged (top-level fields) In #663, we chose to omit the `properties.` prefix for the `sortby` query parameter. So we refer to `datetime`, not `properties.datetime`. This was because the "query" parameter of the [POST /search endpoint](https://data.geo.admin.ch/api/stac/static/spec/v1/apitransactional.html#tag/STAC/operation/postSearchSTAC) also omits the `properties.` prefix. Looking into the STAC Browser code, however, I see that the `properties.` prefix is the assumed default. I think then it would be better to follow the STAC Browser. The Query extension will anyway be replaced by the Filter extension (see PB-2392), so the inconsistency is ok.
1 parent cb88411 commit 2f648e4

8 files changed

Lines changed: 44 additions & 44 deletions

File tree

app/stac_api/utils.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -651,10 +651,10 @@ class SortableField:
651651
SORTABLE_FIELDS: dict[str, SortableField] = {
652652
'id': SortableField(model_field='name'),
653653
'collection': SortableField(model_field='collection__name'),
654-
'datetime': SortableField(model_field='properties_datetime', format='date-time'),
655-
'title': SortableField(model_field='properties_title'),
656-
'created': SortableField(model_field='created', format='date-time'),
657-
'updated': SortableField(model_field='updated', format='date-time'),
654+
'properties.datetime': SortableField(model_field='properties_datetime', format='date-time'),
655+
'properties.title': SortableField(model_field='properties_title'),
656+
'properties.created': SortableField(model_field='created', format='date-time'),
657+
'properties.updated': SortableField(model_field='updated', format='date-time'),
658658
}
659659

660660

@@ -710,7 +710,7 @@ def parse_sortby_post(sortby_param, sortable_fields):
710710
The sortby parameter in the request body is a list of objects with a 'field'
711711
and a 'direction' ('asc' or 'desc') property.
712712
713-
Example: [{"field": "created", "direction": "desc"}].
713+
Example: [{"field": "properties.created", "direction": "desc"}].
714714
715715
Args:
716716
sortby_param: list

app/tests/tests_10/test_items_endpoint.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ def test_sortby_properties_datetime(self):
228228

229229
# Test ascending sort
230230
response = self.client.get(
231-
f"/{STAC_BASE_V}/collections/{self.collection.name}/items?sortby=datetime"
231+
f"/{STAC_BASE_V}/collections/{self.collection.name}/items?sortby=properties.datetime"
232232
)
233233

234234
self.assertStatusCode(200, response)
@@ -237,7 +237,7 @@ def test_sortby_properties_datetime(self):
237237

238238
# Test descending sort
239239
response = self.client.get(
240-
f"/{STAC_BASE_V}/collections/{self.collection.name}/items?sortby=-datetime"
240+
f"/{STAC_BASE_V}/collections/{self.collection.name}/items?sortby=-properties.datetime"
241241
)
242242
self.assertStatusCode(200, response)
243243
item_ids = [item['id'] for item in response.json()['features']]
@@ -268,10 +268,10 @@ def test_sortby_multiple_fields(self):
268268
)
269269

270270
# Sort by datetime ascending, then by title descending
271-
response = self.client.get(
272-
(f"/{STAC_BASE_V}/collections/{self.collection.name}/items?"
273-
f"sortby=datetime,-title")
274-
)
271+
response = self.client.get((
272+
f"/{STAC_BASE_V}/collections/{self.collection.name}/items?"
273+
f"sortby=properties.datetime,-properties.title"
274+
))
275275
self.assertStatusCode(200, response)
276276
item_ids = [item['id'] for item in response.json()['features']]
277277
self.assertEqual(

app/tests/tests_10/test_search_endpoint_extensions.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -289,13 +289,13 @@ def test_get_sortby_properties_datetime(self):
289289
)
290290

291291
# ascending sort
292-
response = self.client.get(f"{self.path}?sortby=datetime")
292+
response = self.client.get(f"{self.path}?sortby=properties.datetime")
293293
self.assertStatusCode(200, response)
294294
item_ids = [item['id'] for item in response.json()['features']]
295295
self.assertEqual(item_ids, ['item-1', 'item-2', 'item-dt-2', 'item-dt-1', 'item-dt-3'])
296296

297297
# descending sort
298-
response = self.client.get(f"{self.path}?sortby=-datetime")
298+
response = self.client.get(f"{self.path}?sortby=-properties.datetime")
299299
self.assertStatusCode(200, response)
300300
item_ids = [item['id'] for item in response.json()['features']]
301301
self.assertEqual(item_ids, ['item-dt-3', 'item-dt-1', 'item-dt-2', 'item-2', 'item-1'])
@@ -325,7 +325,7 @@ def test_get_sortby_multiple_fields(self):
325325
)
326326

327327
# Sort by datetime ascending, then by title descending
328-
response = self.client.get(f"{self.path}?sortby=datetime,-title")
328+
response = self.client.get(f"{self.path}?sortby=properties.datetime,-properties.title")
329329
self.assertStatusCode(200, response)
330330
item_ids = [item['id'] for item in response.json()['features']]
331331
self.assertEqual(
@@ -378,14 +378,14 @@ def test_post_sortby_properties_datetime(self):
378378
)
379379

380380
# ascending sort
381-
payload = {"sortby": [{"field": "datetime", "direction": "asc"}]}
381+
payload = {"sortby": [{"field": "properties.datetime", "direction": "asc"}]}
382382
response = self.client.post(self.path, data=payload, content_type="application/json")
383383
self.assertStatusCode(200, response)
384384
item_ids = [item['id'] for item in response.json()['features']]
385385
self.assertEqual(item_ids, ['item-1', 'item-2', 'item-dt-2', 'item-dt-1', 'item-dt-3'])
386386

387387
# descending sort
388-
payload = {"sortby": [{"field": "datetime", "direction": "desc"}]}
388+
payload = {"sortby": [{"field": "properties.datetime", "direction": "desc"}]}
389389
response = self.client.post(self.path, data=payload, content_type="application/json")
390390
self.assertStatusCode(200, response)
391391
item_ids = [item['id'] for item in response.json()['features']]
@@ -418,9 +418,9 @@ def test_post_sortby_multiple_fields(self):
418418
# Sort by datetime ascending, then by title descending
419419
payload = {
420420
"sortby": [{
421-
"field": "datetime", "direction": "asc"
421+
"field": "properties.datetime", "direction": "asc"
422422
}, {
423-
"field": "title", "direction": "desc"
423+
"field": "properties.title", "direction": "desc"
424424
}]
425425
}
426426
response = self.client.post(self.path, data=payload, content_type="application/json")

app/tests/tests_10/test_sortables_endpoint.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ def test_get_sortables(self):
3232
"collection": {
3333
"type": "string"
3434
},
35-
"datetime": {
35+
"properties.datetime": {
3636
"type": "string", "format": "date-time"
3737
},
38-
"title": {
38+
"properties.title": {
3939
"type": "string"
4040
},
41-
"created": {
41+
"properties.created": {
4242
"type": "string", "format": "date-time"
4343
},
44-
"updated": {
44+
"properties.updated": {
4545
"type": "string", "format": "date-time"
4646
},
4747
},
@@ -84,16 +84,16 @@ def test_get_collection_sortables(self):
8484
"collection": {
8585
"type": "string"
8686
},
87-
"datetime": {
87+
"properties.datetime": {
8888
"type": "string", "format": "date-time"
8989
},
90-
"title": {
90+
"properties.title": {
9191
"type": "string"
9292
},
93-
"created": {
93+
"properties.created": {
9494
"type": "string", "format": "date-time"
9595
},
96-
"updated": {
96+
"properties.updated": {
9797
"type": "string", "format": "date-time"
9898
},
9999
},

spec/components/parameters.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,4 @@ components:
144144
required: false
145145
schema:
146146
type: string
147-
example: '-created,id'
147+
example: '-properties.created,id'

spec/components/schemas.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,7 +1754,7 @@ components:
17541754
- asc
17551755
- desc
17561756
example:
1757-
- field: created
1757+
- field: properties.created
17581758
direction: asc
17591759
- field: collection
17601760
direction: desc
@@ -1804,7 +1804,7 @@ components:
18041804
type:
18051805
type: string
18061806
example: string
1807-
datetime:
1807+
properties.datetime:
18081808
type: object
18091809
properties:
18101810
type:
@@ -1813,13 +1813,13 @@ components:
18131813
format:
18141814
type: string
18151815
example: date-time
1816-
title:
1816+
properties.title:
18171817
type: object
18181818
properties:
18191819
type:
18201820
type: string
18211821
example: string
1822-
created:
1822+
properties.created:
18231823
type: object
18241824
properties:
18251825
type:
@@ -1828,7 +1828,7 @@ components:
18281828
format:
18291829
type: string
18301830
example: date-time
1831-
updated:
1831+
properties.updated:
18321832
type: object
18331833
properties:
18341834
type:

spec/static/spec/v1/openapi.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ components:
141141
required: false
142142
schema:
143143
type: string
144-
example: '-created,id'
144+
example: '-properties.created,id'
145145
responses:
146146
Collection:
147147
headers:
@@ -2014,7 +2014,7 @@ components:
20142014
- asc
20152015
- desc
20162016
example:
2017-
- field: created
2017+
- field: properties.created
20182018
direction: asc
20192019
- field: collection
20202020
direction: desc
@@ -2063,7 +2063,7 @@ components:
20632063
type:
20642064
type: string
20652065
example: string
2066-
datetime:
2066+
properties.datetime:
20672067
type: object
20682068
properties:
20692069
type:
@@ -2072,13 +2072,13 @@ components:
20722072
format:
20732073
type: string
20742074
example: date-time
2075-
title:
2075+
properties.title:
20762076
type: object
20772077
properties:
20782078
type:
20792079
type: string
20802080
example: string
2081-
created:
2081+
properties.created:
20822082
type: object
20832083
properties:
20842084
type:
@@ -2087,7 +2087,7 @@ components:
20872087
format:
20882088
type: string
20892089
example: date-time
2090-
updated:
2090+
properties.updated:
20912091
type: object
20922092
properties:
20932093
type:

spec/static/spec/v1/openapitransactional.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ components:
141141
required: false
142142
schema:
143143
type: string
144-
example: '-created,id'
144+
example: '-properties.created,id'
145145
uploadId:
146146
name: uploadId
147147
in: path
@@ -2098,7 +2098,7 @@ components:
20982098
- asc
20992099
- desc
21002100
example:
2101-
- field: created
2101+
- field: properties.created
21022102
direction: asc
21032103
- field: collection
21042104
direction: desc
@@ -2147,7 +2147,7 @@ components:
21472147
type:
21482148
type: string
21492149
example: string
2150-
datetime:
2150+
properties.datetime:
21512151
type: object
21522152
properties:
21532153
type:
@@ -2156,13 +2156,13 @@ components:
21562156
format:
21572157
type: string
21582158
example: date-time
2159-
title:
2159+
properties.title:
21602160
type: object
21612161
properties:
21622162
type:
21632163
type: string
21642164
example: string
2165-
created:
2165+
properties.created:
21662166
type: object
21672167
properties:
21682168
type:
@@ -2171,7 +2171,7 @@ components:
21712171
format:
21722172
type: string
21732173
example: date-time
2174-
updated:
2174+
properties.updated:
21752175
type: object
21762176
properties:
21772177
type:

0 commit comments

Comments
 (0)