From 1e81442f7f64f3f95a7fc14d8b32dfffaf9d5236 Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Fri, 23 May 2025 13:09:07 -0400 Subject: [PATCH 1/2] normalize CQL text support to CQL2 (#2015) --- docs/source/{cql.rst => cql2.rst} | 22 +++++++++++----------- docs/source/index.rst | 2 +- docs/source/publishing/ogcapi-features.rst | 6 +++--- docs/source/publishing/ogcapi-records.rst | 2 +- pygeoapi/api/itemtypes.py | 4 ++-- tests/other/test_util.py | 2 +- tests/provider/test_postgresql_provider.py | 4 ++-- 7 files changed, 21 insertions(+), 21 deletions(-) rename docs/source/{cql.rst => cql2.rst} (81%) diff --git a/docs/source/cql.rst b/docs/source/cql2.rst similarity index 81% rename from docs/source/cql.rst rename to docs/source/cql2.rst index 66a6d6364..74717e23d 100644 --- a/docs/source/cql.rst +++ b/docs/source/cql2.rst @@ -1,9 +1,9 @@ -.. _cql: +.. _cql2: -CQL support -=========== +CQL2 support +============ -OGC Common Query Language (`CQL2`_) is a generic language designed to provide enhanced query and subset/filtering to (primarily) feature and record data. +`OGC Common Query Language`_ (CQL2) is a generic language designed to provide enhanced query and subset/filtering to (primarily) feature and record data. Providers --------- @@ -14,7 +14,7 @@ for current provider support. Limitations ----------- -Support of CQL is limited to `Basic CQL2 `_ and thus it allows to query with the +Support is limited to `Basic CQL2 `_ and thus it allows to query with the following predicates: * comparison predicates @@ -24,9 +24,9 @@ following predicates: Formats ------- -Supported providers leverage the CQL2 dialect with the JSON encoding `CQL-JSON `_. +Supported providers leverage the CQL2 dialect with the JSON encoding `CQL JSON `_. -PostgreSQL supports both `CQL2 JSON `_ and `CQL text `_ dialects. +PostgreSQL supports both `CQL JSON `_ and `CQL Text `_ dialects. Queries ^^^^^^^ @@ -83,7 +83,7 @@ Or ] }' -The same ``BETWEEN`` query using HTTP GET request formatted as CQL text and URL encoded as below: +The same ``BETWEEN`` query using HTTP GET request formatted as CQL2 text and URL encoded as below: .. code-block:: bash @@ -103,7 +103,7 @@ An ``EQUALS`` example for a specific property: ] }' -A ``CROSSES`` example via an HTTP GET request. The CQL text is passed via the ``filter`` parameter. +A ``CROSSES`` example via an HTTP GET request. The CQL2 text is passed via the ``filter`` parameter. .. code-block:: bash @@ -122,6 +122,6 @@ The same example, but this time providing a geometry in EWKT format: curl "http://localhost:5000/collections/beni/items?filter=DWITHIN(geometry,SRID=3857;POINT(1392921%205145517),100,meters)" -Note that the CQL text has been URL encoded. This is required in curl commands but when entering in a browser, plain text can be used e.g. ``CROSSES(foo_geom, LINESTRING(28 -2, 30 -4))``. +Note that the CQL2 text has been URL encoded. This is required in curl commands but when entering in a browser, plain text can be used e.g. ``CROSSES(foo_geom, LINESTRING(28 -2, 30 -4))``. -.. _`CQL2`: https://docs.ogc.org/is/21-065r2/21-065r2.html +.. _`OGC Common Query Language`: https://docs.ogc.org/is/21-065r2/21-065r2.html diff --git a/docs/source/index.rst b/docs/source/index.rst index a661a7cda..a4a183470 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -44,7 +44,7 @@ reference documentation on all aspects of the project. plugins html-templating crs - cql + cql2 language development ogc-compliance diff --git a/docs/source/publishing/ogcapi-features.rst b/docs/source/publishing/ogcapi-features.rst index 04969bcce..67d98c7bd 100644 --- a/docs/source/publishing/ogcapi-features.rst +++ b/docs/source/publishing/ogcapi-features.rst @@ -113,7 +113,7 @@ To publish an Elasticsearch index, the following are required in your index: The ES provider also has the support for the CQL queries as indicated in the table above. .. seealso:: - :ref:`cql` for more details on how to use Common Query Language (CQL) to filter the collection with specific queries. + :ref:`cql2` for more details on how to use Common Query Language (CQL) to filter the collection with specific queries. .. _ERDDAP Tabledap Service: @@ -430,7 +430,7 @@ To publish an OpenSearch index, the following are required in your index: The OpenSearch provider also has the support for the CQL queries as indicated in the table above. .. seealso:: - :ref:`cql` for more details on how to use Common Query Language (CQL) to filter the collection with specific queries. + :ref:`cql2` for more details on how to use Common Query Language (CQL) to filter the collection with specific queries. .. _Oracle: @@ -690,7 +690,7 @@ block contains the necessary socket connection information. This provider has support for the CQL queries as indicated in the Provider table above. .. seealso:: - :ref:`cql` for more details on how to use Common Query Language (CQL) to filter the collection with specific queries. + :ref:`cql2` for more details on how to use Common Query Language (CQL) to filter the collection with specific queries. SQLiteGPKG ^^^^^^^^^^ diff --git a/docs/source/publishing/ogcapi-records.rst b/docs/source/publishing/ogcapi-records.rst index fda95bdbd..f21533de7 100644 --- a/docs/source/publishing/ogcapi-records.rst +++ b/docs/source/publishing/ogcapi-records.rst @@ -54,7 +54,7 @@ To publish an Elasticsearch index, the following are required in your index: The ES provider also has the support for the CQL queries as indicated in the table above. .. seealso:: - :ref:`cql` for more details on how to use Common Query Language (CQL) to filter the collection with specific queries. + :ref:`cql2` for more details on how to use Common Query Language (CQL) to filter the collection with specific queries. TinyDBCatalogue ^^^^^^^^^^^^^^^ diff --git a/pygeoapi/api/itemtypes.py b/pygeoapi/api/itemtypes.py index 3207b6f1a..9e2f84928 100644 --- a/pygeoapi/api/itemtypes.py +++ b/pygeoapi/api/itemtypes.py @@ -43,7 +43,7 @@ from typing import Any, Tuple, Union, Optional import urllib.parse -from pygeofilter.parsers.ecql import parse as parse_ecql_text +from pygeofilter.parsers.cql2_text import parse as parse_cql2_text from pygeofilter.parsers.cql2_json import parse as parse_cql2_json from pyproj.exceptions import CRSError @@ -481,7 +481,7 @@ def get_collection_items( if cql_text is not None: try: - filter_ = parse_ecql_text(cql_text) + filter_ = parse_cql2_text(cql_text) filter_ = modify_pygeofilter( filter_, filter_crs_uri=filter_crs_uri, diff --git a/tests/other/test_util.py b/tests/other/test_util.py index e7570b756..d73f01ff9 100644 --- a/tests/other/test_util.py +++ b/tests/other/test_util.py @@ -38,7 +38,7 @@ import pytest from pyproj.exceptions import CRSError import pygeofilter.ast -from pygeofilter.parsers.ecql import parse +from pygeofilter.parsers.cql2_text import parse from pygeofilter.values import Geometry from shapely.geometry import Point diff --git a/tests/provider/test_postgresql_provider.py b/tests/provider/test_postgresql_provider.py index 42ceb0b3a..e1cf87e9e 100644 --- a/tests/provider/test_postgresql_provider.py +++ b/tests/provider/test_postgresql_provider.py @@ -46,7 +46,7 @@ import pyproj from http import HTTPStatus -from pygeofilter.parsers.ecql import parse +from pygeofilter.parsers.cql2_text import parse from pygeoapi.api import API from pygeoapi.api.itemtypes import ( @@ -353,7 +353,7 @@ def test_get_not_existing_item_raise_exception(config): 80835475, 80835478, 80835483, 80835486]), ("osm_id BETWEEN 80800000 AND 80900000 AND waterway = 'stream'", [80835470]), - ("osm_id BETWEEN 80800000 AND 80900000 AND waterway ILIKE 'sTrEam'", + ("osm_id BETWEEN 80800000 AND 80900000 AND waterway CASEI 'sTrEam'", [80835470]), ("osm_id BETWEEN 80800000 AND 80900000 AND waterway LIKE 's%'", [80835470]), From cddf2759510ddbb661726de92cdc3f653b871ba9 Mon Sep 17 00:00:00 2001 From: Tom Kralidis Date: Fri, 23 May 2025 13:39:52 -0400 Subject: [PATCH 2/2] fix CASEI --- tests/provider/test_postgresql_provider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/provider/test_postgresql_provider.py b/tests/provider/test_postgresql_provider.py index e1cf87e9e..eec2920cb 100644 --- a/tests/provider/test_postgresql_provider.py +++ b/tests/provider/test_postgresql_provider.py @@ -353,7 +353,7 @@ def test_get_not_existing_item_raise_exception(config): 80835475, 80835478, 80835483, 80835486]), ("osm_id BETWEEN 80800000 AND 80900000 AND waterway = 'stream'", [80835470]), - ("osm_id BETWEEN 80800000 AND 80900000 AND waterway CASEI 'sTrEam'", + ("osm_id BETWEEN 80800000 AND 80900000 AND CASEI(waterway) LIKE 'sTrEam'", [80835470]), ("osm_id BETWEEN 80800000 AND 80900000 AND waterway LIKE 's%'", [80835470]),