From e096d213d79c2d3dd68044795afbb399111aa428 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 14 May 2026 17:55:15 +0000 Subject: [PATCH 1/2] Initial plan From 1c017a3b69ba42e8db2ab9d6c1527ecf1303ea22 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 14 May 2026 18:00:22 +0000 Subject: [PATCH 2/2] feat: support delayed vector URL handling in filter_spatial Agent-Logs-Url: https://github.com/Open-EO/openeo-python-driver/sessions/77baa63f-cf43-49dc-85ce-d7824cd4ee69 Co-authored-by: jdries <5937096+jdries@users.noreply.github.com> --- .../process_implementations/cubes.py | 2 +- tests/test_dry_run.py | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/openeo_driver/processgraph/process_implementations/cubes.py b/openeo_driver/processgraph/process_implementations/cubes.py index 64c8b455..6ada2935 100644 --- a/openeo_driver/processgraph/process_implementations/cubes.py +++ b/openeo_driver/processgraph/process_implementations/cubes.py @@ -367,7 +367,7 @@ def filter_spatial(args: ProcessArgs, env: EvalEnv) -> DriverDataCube: ] geometries = MultiPolygon(polygons) elif isinstance(geometries, DelayedVector): - geometries = DriverVectorCube.from_fiona([geometries.path]).to_multipolygon() + geometries = geometries.to_driver_vector_cube() elif isinstance(geometries, DriverVectorCube): pass else: diff --git a/tests/test_dry_run.py b/tests/test_dry_run.py index 5a66a393..d7f5ba25 100644 --- a/tests/test_dry_run.py +++ b/tests/test_dry_run.py @@ -1332,6 +1332,31 @@ def test_aggregate_spatial_read_vector(dry_run_env, dry_run_tracer): assert isinstance(geometries, DriverVectorCube) +def test_filter_spatial_read_vector_remote_url_no_extension(dry_run_env, dry_run_tracer, tmp_path): + source = get_path("geojson/FeatureCollection01.json") + target = tmp_path / "vector" + target.write_text(source.read_text()) + with ephemeral_fileserver(path=tmp_path) as fileserver_root: + geometry_url = f"{fileserver_root}/{target.name}" + pg = { + "lc1": {"process_id": "load_collection", "arguments": {"id": "ESA_WORLDCOVER_10M_2020_V1"}}, + "vector": {"process_id": "read_vector", "arguments": {"filename": geometry_url}}, + "filter": { + "process_id": "filter_spatial", + "arguments": {"data": {"from_node": "lc1"}, "geometries": {"from_node": "vector"}}, + "result": True, + }, + } + evaluate(pg, env=dry_run_env) + + source_constraints = dry_run_tracer.get_source_constraints(merge=True) + assert len(source_constraints) == 1 + src, constraints = source_constraints[0] + assert src == ("load_collection", ("ESA_WORLDCOVER_10M_2020_V1", ()), "lc1") + assert isinstance(constraints["filter_spatial"]["geometries"], DriverVectorCube) + assert constraints["filter_spatial"]["geometries"].get_bounding_box() == pytest.approx((4.45, 51.1, 4.52, 51.2)) + + def test_aggregate_spatial_get_geometries_feature_collection(dry_run_env, dry_run_tracer): pg = { "lc1": {"process_id": "load_collection", "arguments": {"id": "ESA_WORLDCOVER_10M_2020_V1"}},