From b4b7ee1c086a09dd3d7cb643d10e9bee1f153454 Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Mon, 15 Apr 2024 10:24:15 -0400 Subject: [PATCH] PostgreSQL provider: fix paging (#1594) (#1628) * PostgreSQL provider: fix paging (#1594) * add test --- pygeoapi/provider/postgresql.py | 16 ++++++---------- tests/test_postgresql_provider.py | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/pygeoapi/provider/postgresql.py b/pygeoapi/provider/postgresql.py index 47d9b7e..529bea5 100644 --- a/pygeoapi/provider/postgresql.py +++ b/pygeoapi/provider/postgresql.py @@ -151,15 +151,9 @@ class PostgreSQLProvider(BaseProvider): .filter(property_filters) .filter(cql_filters) .filter(bbox_filter) - .order_by(*order_by_clauses) - .options(selected_properties) - .offset(offset)) + .options(selected_properties)) matched = results.count() - if limit < matched: - returned = limit - else: - returned = matched LOGGER.debug(f'Found {matched} result(s)') @@ -168,14 +162,16 @@ class PostgreSQLProvider(BaseProvider): 'type': 'FeatureCollection', 'features': [], 'numberMatched': matched, - 'numberReturned': returned + 'numberReturned': 0 } if resulttype == "hits" or not results: - response['numberReturned'] = 0 return response + crs_transform_out = self._get_crs_transform(crs_transform_spec) - for item in results.limit(limit): + + for item in results.order_by(*order_by_clauses).offset(offset).limit(limit): # noqa + response['numberReturned'] += 1 response['features'].append( self._sqlalchemy_to_feature(item, crs_transform_out) ) diff --git a/tests/test_postgresql_provider.py b/tests/test_postgresql_provider.py index b027d08..5832667 100644 --- a/tests/test_postgresql_provider.py +++ b/tests/test_postgresql_provider.py @@ -158,6 +158,21 @@ def test_query_with_property_filter(config): assert feature_collection['numberReturned'] == 50 +def test_query_with_paging(config): + """Test query valid features with paging""" + p = PostgreSQLProvider(config) + feature_collection = p.query(limit=50) + + assert feature_collection['numberMatched'] == 14776 + assert feature_collection['numberReturned'] == 50 + + offset = feature_collection['numberMatched'] - 10 + + feature_collection = p.query(offset=offset) + assert feature_collection['numberMatched'] == 14776 + assert feature_collection['numberReturned'] == 10 + + def test_query_with_config_properties(config): """ Test that query is restricted by properties in the config.