CQL support

Providers

As of now the available providers supported for CQL filtering are limited to Elasticsearch and PostgreSQL.

Limitations

Support of CQL is limited to Simple CQL filter and thus it allows to query with the following predicates:

  • comparison predicates

  • spatial predicates

  • temporal predicates

Formats

At the moment Elasticsearch supports only the CQL dialect with the JSON encoding CQL-JSON.

PostgreSQL supports both CQL-JSON and CQL-text dialects, CQL-JSON and CQL-TEXT

Queries

The PostgreSQL provider uses pygeofilter allowing a range of filter expressions, see examples for:

Using Elasticsearch the following type of queries are supported right now:

  • between predicate query

  • Logical and query with between and eq expression

  • Spatial query with bbox

Examples

A BETWEEN example for a specific property through an HTTP POST request:

curl --location --request POST 'http://localhost:5000/collections/nhsl_hazard_threat_all_indicators_s_bc/items?f=json&limit=50&filter-lang=cql-json' \
--header 'Content-Type: application/query-cql-json' \
--data-raw '{
  "between": {
    "value": { "property": "properties.MHn_Intensity" },
    "lower": 0.59,
    "upper": 0.60
  }
}'

Or

curl --location --request POST 'http://localhost:5000/collections/recentearthquakes/items?f=json&limit=10&filter-lang=cql-json'
--header 'Content-Type: application/query-cql-json'
--data-raw '{
  "between":{
    "value":{"property": "ml"},
    "lower":4,
    "upper":4.5
  }
}'

The same BETWEEN query using HTTP GET request formatted as CQL text and URL encoded as below:

curl "http://localhost:5000/collections/recentearthquakes/items?f=json&limit=10&filter=ml%20BETWEEN%204%20AND%204.5"

An EQUALS example for a specific property:

curl --location --request POST 'http://localhost:5000/collections/recentearthquakes/items?f=json&limit=10&filter-lang=cql-json'
--header 'Content-Type: application/query-cql-json'
--data-raw '{
    "eq":[{"property": "user_entered"},"APBE"]
}'

A CROSSES example via an HTTP GET request. The CQL text is passed via the filter parameter.

curl "http://localhost:5000/collections/hot_osm_waterways/items?f=json&filter=CROSSES(foo_geom,%20LINESTRING(28%20-2,%2030%20-4))"

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)).