Skip to content

Commit

Permalink
Addition of time filtering to postgresql.py provider. (#1629)
Browse files Browse the repository at this point in the history
* Addition of time filtering to postgresql.py provider.

* Consistency update: single quotes + filter renamed to datetime_filter.

* Update to datetime filter to use <= upper bound for consistency for CQL implementation.
  • Loading branch information
david-i-berry committed Apr 15, 2024
1 parent 8aba75f commit 32e5773
Showing 1 changed file with 25 additions and 0 deletions.
25 changes: 25 additions & 0 deletions pygeoapi/provider/postgresql.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ def query(self, offset=0, limit=10, resulttype='results',
property_filters = self._get_property_filters(properties)
cql_filters = self._get_cql_filters(filterq)
bbox_filter = self._get_bbox_filter(bbox)
time_filter = self._get_datetime_filter(datetime_)
order_by_clauses = self._get_order_by_clauses(sortby, self.table_model)
selected_properties = self._select_properties_clause(select_properties,
skip_geometry)
Expand All @@ -151,6 +152,7 @@ def query(self, offset=0, limit=10, resulttype='results',
.filter(property_filters)
.filter(cql_filters)
.filter(bbox_filter)
.filter(time_filter)
.options(selected_properties))

matched = results.count()
Expand Down Expand Up @@ -455,6 +457,29 @@ def _get_bbox_filter(self, bbox):

return bbox_filter

def _get_datetime_filter(self, datetime_):
if datetime_ in (None, '../..'):
return True
else:
if self.time_field is None:
LOGGER.error('time_field not enabled for collection')
raise ProviderQueryError()

time_column = getattr(self.table_model, self.time_field)

if '/' in datetime_: # envelope
LOGGER.debug('detected time range')
time_begin, time_end = datetime_.split('/')
if time_begin == '..':
datetime_filter = time_column <= time_end
elif time_end == '..':
datetime_filter = time_column >= time_begin
else:
datetime_filter = time_column.between(time_begin, time_end)
else:
datetime_filter = time_column == datetime_
return datetime_filter

def _select_properties_clause(self, select_properties, skip_geometry):
# List the column names that we want
if select_properties:
Expand Down

0 comments on commit 32e5773

Please sign in to comment.