from datetime import datetime
from typing import Dict, Iterator, Optional
from pygeofilter.backends.native.evaluate import NativeEvaluator
from pygeofilter.parsers.cql_json import parse as json_parse
CQL_ATTR_MAP = {"point_attr": "geometry", "*": "properties.*"}
[docs]def cql_filter(
_filter: Dict,
data: Iterator[Dict],
context: Optional[Dict] = None,
) -> Iterator[Dict]:
if not _filter:
yield from data
return
_filter = json_parse(_filter)
context = context or {}
nat_eval = NativeEvaluator(
function_map={
"now": datetime.now,
"context": lambda name, default=None: context.get(name, default),
},
attribute_map=CQL_ATTR_MAP,
use_getattr=False,
)
evaluator = nat_eval.evaluate(_filter)
yield from filter(evaluator, data)