11"""tifeatures.layers."""
22
33import abc
4+ import re
45from dataclasses import dataclass
56from typing import Any , ClassVar , Dict , List , Optional , Tuple
67
@@ -261,6 +262,29 @@ def _datetime_filter_to_sql(self, interval: List[str], dt_name: str):
261262 logic .V (dt_name ) < logic .S (pg_funcs .cast (end , "timestamptz" )),
262263 )
263264
265+ def _sortby (self , sortby : Optional [str ]):
266+ sorts = []
267+ if sortby :
268+ for s in sortby .strip ().split ("," ):
269+ parts = re .match (
270+ "^(?P<direction>[+-]?)(?P<column>.*)$" , s
271+ ).groupdict () # type:ignore
272+
273+ direction = parts ["direction" ]
274+ column = parts ["column" ].strip ()
275+ if self .get_column (column ):
276+ if direction == "-" :
277+ sorts .append (logic .V (column ).desc ())
278+ else :
279+ sorts .append (logic .V (column ))
280+ else :
281+ raise InvalidPropertyName (f"Property { column } does not exist." )
282+
283+ else :
284+ sorts .append (logic .V (self .id_column ))
285+
286+ return clauses .OrderBy (* sorts )
287+
264288 def _features_query (
265289 self ,
266290 * ,
@@ -269,6 +293,7 @@ def _features_query(
269293 datetime_filter : Optional [List [str ]] = None ,
270294 properties_filter : Optional [List [Tuple [str , str ]]] = None ,
271295 cql_filter : Optional [AstType ] = None ,
296+ sortby : Optional [str ] = None ,
272297 properties : Optional [List [str ]] = None ,
273298 geom : str = None ,
274299 dt : str = None ,
@@ -288,6 +313,7 @@ def _features_query(
288313 geom = geom ,
289314 dt = dt ,
290315 )
316+ + self ._sortby (sortby )
291317 + clauses .Limit (limit or 10 )
292318 + clauses .Offset (offset or 0 )
293319 )
@@ -327,6 +353,7 @@ async def query(
327353 datetime_filter : Optional [List [str ]] = None ,
328354 properties_filter : Optional [List [Tuple [str , str ]]] = None ,
329355 cql_filter : Optional [AstType ] = None ,
356+ sortby : Optional [str ] = None ,
330357 properties : Optional [List [str ]] = None ,
331358 geom : str = None ,
332359 dt : str = None ,
@@ -370,6 +397,7 @@ async def query(
370397 datetime_filter = datetime_filter ,
371398 properties_filter = properties_filter ,
372399 cql_filter = cql_filter ,
400+ sortby = sortby ,
373401 properties = properties ,
374402 geom = geom ,
375403 dt = dt ,
0 commit comments