Source code for openeo.rest.multiresult
from __future__ import annotations
from typing import Dict, List, Optional
from openeo import BatchJob
from openeo.internal.graph_building import FlatGraphableMixin, MultiLeafGraph
from openeo.rest import OpenEoClientException
from openeo.rest.connection import Connection, extract_connections
[docs]
class MultiResult(FlatGraphableMixin):
"""
Helper to create and run batch jobs with process graphs
that contain multiple result nodes
or, more generally speaking, multiple process graph "leaf" nodes.
Provide multiple
:py:class:`~openeo.rest.datacube.DataCube`/:py:class:`~openeo.rest.vectorcube.VectorCube`
instances to the constructor,
and start a batch job from that,
for example as follows:
.. code-block:: python
from openeo import MultiResult
cube1 = ...
cube2 = ...
multi_result = MultiResult([cube1, cube2])
job = multi_result.create_job()
.. seealso::
:ref:`multi-result-process-graphs`
.. versionadded:: 0.35.0
"""
__slots__ = ("_multi_leaf_graph", "_connection")
[docs]
def __init__(self, leaves: List[FlatGraphableMixin], connection: Optional[Connection] = None):
"""
Build a :py:class:`MultiResult` instance from multiple leaf nodes
:param leaves: list of objects that can be
converted to an openEO-style (flat) process graph representation,
typically :py:class:`~openeo.rest.datacube.DataCube`
or :py:class:`~openeo.rest.vectorcube.VectorCube` instances.
:param connection: Optional connection to use for creating/starting batch jobs,
for special use cases where the provided leaf instances
are not already associated with a connection.
"""
self._multi_leaf_graph = MultiLeafGraph(leaves=leaves)
self._connection = self._extract_connection(leaves=leaves, connection=connection)
@staticmethod
def _extract_connection(leaves: List[FlatGraphableMixin], connection: Optional[Connection] = None) -> Connection:
"""
Extract common connection from leaves and/or explicitly provided connection.
Fails if there are multiple or none.
"""
connections = set()
if connection:
connections.add(connection)
connections.update(extract_connections(leaves))
if len(connections) == 1:
return connections.pop()
elif len(connections) == 0:
raise OpenEoClientException("No connection in any of the MultiResult leaves")
else:
raise OpenEoClientException("MultiResult with multiple different connections")
def flat_graph(self) -> Dict[str, dict]:
return self._multi_leaf_graph.flat_graph()
def create_job(
self,
*,
title: Optional[str] = None,
description: Optional[str] = None,
additional: Optional[dict] = None,
job_options: Optional[dict] = None,
validate: Optional[bool] = None,
) -> BatchJob:
return self._connection.create_job(
process_graph=self._multi_leaf_graph,
title=title,
description=description,
additional=additional,
job_options=job_options,
validate=validate,
)
def execute_batch(
self,
*,
title: Optional[str] = None,
description: Optional[str] = None,
additional: Optional[dict] = None,
job_options: Optional[dict] = None,
validate: Optional[bool] = None,
) -> BatchJob:
job = self.create_job(
title=title,
description=description,
additional=additional,
job_options=job_options,
validate=validate,
)
return job.run_synchronous()