Skip to content

Commit

Permalink
Add collection_property helper to simplify building property filter…
Browse files Browse the repository at this point in the history
…s for load_collection
  • Loading branch information
soxofaan committed Nov 14, 2023
1 parent d1ce448 commit f143c7a
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 5 deletions.
5 changes: 4 additions & 1 deletion docs/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,11 @@ openeo.processes
:members: process


openeo.internal
Graph building
----------------

.. automodule:: openeo.rest.graph_building
:members: collection_property

.. automodule:: openeo.internal.graph_building
:members: PGNode, FlatGraphableMixin
1 change: 1 addition & 0 deletions openeo/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ class BaseOpenEoException(Exception):
from openeo._version import __version__
from openeo.rest.connection import Connection, connect, session
from openeo.rest.datacube import UDF, DataCube
from openeo.rest.graph_building import collection_property
from openeo.rest.job import BatchJob, RESTJob


Expand Down
5 changes: 4 additions & 1 deletion openeo/internal/graph_building.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
"""
Internal openEO process graph building utilities
''''''''''''''''''''''''''''''''''''''''''''''''''
Internal functionality for abstracting, building, manipulating and processing openEO process graphs.
Functionality for abstracting, building, manipulating and processing openEO process graphs.
"""

from __future__ import annotations
Expand Down
11 changes: 8 additions & 3 deletions openeo/rest/datacube.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,14 @@
from openeo.internal.documentation import openeo_process
from openeo.internal.graph_building import PGNode, ReduceNode, _FromNodeMixin
from openeo.internal.jupyter import in_jupyter_context
from openeo.internal.processes.builder import ProcessBuilderBase
from openeo.internal.processes.builder import ProcessBuilderBase, convert_callable_to_pgnode, get_parameter_names
from openeo.internal.warnings import UserDeprecationWarning, deprecated, legacy_alias
from openeo.metadata import Band, CollectionMetadata
from openeo.metadata import Band, BandDimension, CollectionMetadata, SpatialDimension, TemporalDimension
from openeo.processes import ProcessBuilder
from openeo.rest import BandMathException, OpenEoClientException, OperatorException
from openeo.rest._datacube import THIS, UDF, _ProcessGraphAbstraction, build_child_callback
from openeo.rest.job import BatchJob
from openeo.rest.graph_building import CollectionProperty
from openeo.rest.job import BatchJob, RESTJob
from openeo.rest.mlmodel import MlModel
from openeo.rest.service import Service
from openeo.rest.udp import RESTUserDefinedProcess
Expand Down Expand Up @@ -173,6 +175,9 @@ def load_collection(
properties = properties or {}
properties["eo:cloud_cover"] = lambda v: v <= max_cloud_cover
if properties:
if isinstance(properties, list):
# TODO: warn about list items that are not expected CollectionProperty
properties = {p.name: p.from_node() for p in properties if isinstance(p, CollectionProperty)}
summaries = metadata and metadata.get("summaries") or {}
undefined_properties = set(properties.keys()).difference(summaries.keys())
if undefined_properties:
Expand Down
59 changes: 59 additions & 0 deletions openeo/rest/graph_building.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"""
Public openEO process graph building utilities
'''''''''''''''''''''''''''''''''''''''''''''''
"""

from typing import Optional

from openeo.internal.graph_building import PGNode, _FromNodeMixin
from openeo.processes import ProcessBuilder


class CollectionProperty(_FromNodeMixin):
def __init__(self, name: str, _builder: Optional[ProcessBuilder] = None):
self.name = name
self._builder = _builder or ProcessBuilder(pgnode={"from_parameter": "value"})

def from_node(self) -> PGNode:
return self._builder.from_node()

def __eq__(self, other):
return CollectionProperty(self.name, _builder=self._builder == other)

def __ne__(self, other):
return CollectionProperty(self.name, _builder=self._builder != other)

def __gt__(self, other):
return CollectionProperty(self.name, _builder=self._builder > other)

def __ge__(self, other):
return CollectionProperty(self.name, _builder=self._builder >= other)

def __lt__(self, other):
return CollectionProperty(self.name, _builder=self._builder < other)

def __le__(self, other):
return CollectionProperty(self.name, _builder=self._builder <= other)


def collection_property(name: str) -> CollectionProperty:
"""
Helper to easily create simple a `load_collection` property filter.
Usage example:
.. code-block:: python
connection.load_collection(
...
properties=[
collection_property("eo:cloud_cover") <= 75,
collection_property("platform") == "Sentinel-2B",
]
)
:param name: name of the property to filter on
:return: an object which supports operators like ``<=``, ``==`` to build a simple property filter.
"""
return CollectionProperty(name=name)
31 changes: 31 additions & 0 deletions tests/rest/datacube/test_datacube100.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import openeo.metadata
import openeo.processes
from openeo import collection_property
from openeo.api.process import Parameter
from openeo.capabilities import ComparableVersion
from openeo.internal.graph_building import PGNode
Expand Down Expand Up @@ -1645,6 +1646,36 @@ def test_load_collection_max_cloud_cover_summaries_warning(
assert len(recwarn.list) == 0


def test_load_collection_with_collection_properties(con100):
im = con100.load_collection(
"S2",
properties=[
collection_property("eo:cloud_cover") <= 75,
collection_property("platform") == "Sentinel-2B",
],
)
assert im.flat_graph()["loadcollection1"]["arguments"]["properties"] == {
"eo:cloud_cover": {
"process_graph": {
"lte1": {
"process_id": "lte",
"arguments": {"x": {"from_parameter": "value"}, "y": 75},
"result": True,
}
}
},
"platform": {
"process_graph": {
"eq1": {
"process_id": "eq",
"arguments": {"x": {"from_parameter": "value"}, "y": "Sentinel-2B"},
"result": True,
}
}
},
}


def test_load_collection_temporal_extent_process_builder_function(con100):
from openeo.processes import date_shift

Expand Down

0 comments on commit f143c7a

Please sign in to comment.