Addition of time filtering to postgresql.py provider. (#1629)

* 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.
This commit is contained in:
david-i-berry
2024-04-15 19:55:45 +02:00
committed by GitHub
parent 8aba75f938
commit 32e5773db6
+25
View File
@@ -140,6 +140,7 @@ class PostgreSQLProvider(BaseProvider):
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)
@@ -151,6 +152,7 @@ class PostgreSQLProvider(BaseProvider):
.filter(property_filters)
.filter(cql_filters)
.filter(bbox_filter)
.filter(time_filter)
.options(selected_properties))
matched = results.count()
@@ -455,6 +457,29 @@ class PostgreSQLProvider(BaseProvider):
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: