diff --git a/pygeoapi/provider/postgresql.py b/pygeoapi/provider/postgresql.py index 529bea5..744e591 100644 --- a/pygeoapi/provider/postgresql.py +++ b/pygeoapi/provider/postgresql.py @@ -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: