From 80df5e70c9c1263e866fb8813fdf3caa84c1a2d5 Mon Sep 17 00:00:00 2001 From: Codex Date: Tue, 21 Jul 2026 23:30:52 +0200 Subject: [PATCH] perf(map): simplify preclipped area queries --- backend/app/api/routes/datasets.py | 7 +- .../tests/test_sprint106_map_bbox_extract.py | 76 +++++++++++++++++++ 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/backend/app/api/routes/datasets.py b/backend/app/api/routes/datasets.py index f2717e82..483fc67c 100644 --- a/backend/app/api/routes/datasets.py +++ b/backend/app/api/routes/datasets.py @@ -633,16 +633,17 @@ def select_vector_features( payload.bbox.model_dump(), selection_area.geometry, ) - full_dataset_area = covers_full_area and VectorFeatureService.can_use_full_area_fast_path( + dataset_is_preclipped_to_area = VectorFeatureService.can_use_full_area_fast_path( dataset, selection_area.id, ) + full_dataset_area = covers_full_area and dataset_is_preclipped_to_area preclipped_partition_filter = VectorFeatureService.preclipped_partition_filter( dataset, getattr(selection_area, "name", None), ) selection_kwargs.update( - selection_geometry=selection_geometry, + selection_geometry=None if dataset_is_preclipped_to_area else selection_geometry, selection_area_id=selection_area.id, full_dataset_area=full_dataset_area, preclipped_partition_filter=preclipped_partition_filter, @@ -655,7 +656,7 @@ def select_vector_features( "total_feature_count": result.get("total_feature_count"), } if selection_area is not None: - summary_kwargs["selection_geometry"] = selection_geometry + summary_kwargs["selection_geometry"] = None if dataset_is_preclipped_to_area else selection_geometry summary_kwargs["full_dataset_area"] = full_dataset_area summary_kwargs["preclipped_partition_filter"] = preclipped_partition_filter result["summary"] = VectorFeatureService.summarize_features_by_bbox(db, **summary_kwargs) diff --git a/backend/tests/test_sprint106_map_bbox_extract.py b/backend/tests/test_sprint106_map_bbox_extract.py index 488c8fc3..4c30be4c 100644 --- a/backend/tests/test_sprint106_map_bbox_extract.py +++ b/backend/tests/test_sprint106_map_bbox_extract.py @@ -232,6 +232,82 @@ def test_vector_select_route_uses_persisted_area_geometry_when_requested(monkeyp assert captured["select"]["full_dataset_area"] is False +def test_vector_select_route_uses_bbox_for_dataset_preclipped_to_selected_area(monkeypatch) -> None: + from app.api.routes import datasets as dataset_routes + + project_id = uuid.uuid4() + dataset_id = uuid.uuid4() + area_id = uuid.uuid4() + dataset = Dataset( + id=dataset_id, + project_id=project_id, + area_id=area_id, + dataset_type="vector", + source="fixture", + name="Preclipped population", + source_metadata={ + "geometry_clipped_to_area": True, + "selection_aggregation": {"method": "feature_count"}, + }, + ) + area = SimpleNamespace( + id=area_id, + project_id=project_id, + geometry=from_shape(box(5.0, 51.0, 5.3, 51.3), srid=4326), + ) + captured: dict[str, dict[str, object]] = {} + + class _AreaSession: + @staticmethod + def get(model, selected_id): # noqa: ANN001 + assert model is dataset_routes.Area + assert selected_id == area_id + return area + + def select_features(_db, **kwargs): # noqa: ANN001 + captured["select"] = kwargs + return { + "selection_bbox": {"min_x": 4.9, "min_y": 51.1, "max_x": 5.2, "max_y": 51.2, "crs": "EPSG:4326"}, + "selection_area_id": str(area_id), + "feature_count": 1, + "total_feature_count": 1, + "limit": 25, + "truncated": False, + "geojson": {"type": "FeatureCollection", "features": []}, + } + + def summarize_features(_db, **kwargs): # noqa: ANN001 + captured["summary"] = kwargs + return { + "metric_label": "Inwoners", + "metric_value": 1, + "metric_unit": "inwoners", + "aggregation_method": "feature_count", + "feature_count": 1, + "is_estimate": False, + } + + monkeypatch.setattr(dataset_routes.DatasetService, "get_dataset", lambda _db, _id: dataset) + monkeypatch.setattr(dataset_routes.VectorFeatureService, "select_features_by_bbox", select_features) + monkeypatch.setattr(dataset_routes.VectorFeatureService, "summarize_features_by_bbox", summarize_features) + + dataset_routes.select_vector_features( + project_id=project_id, + dataset_id=dataset_id, + payload=dataset_routes.VectorSelectionRequest( + bbox=dataset_routes.VectorSelectionBBox(min_x=4.9, min_y=51.1, max_x=5.2, max_y=51.2), + area_id=area_id, + limit=25, + ), + db=_AreaSession(), + ) + + assert captured["select"]["selection_geometry"] is None + assert captured["summary"]["selection_geometry"] is None + assert captured["select"]["selection_area_id"] == area_id + assert captured["select"]["full_dataset_area"] is False + + def test_vector_select_route_rejects_area_from_another_project(monkeypatch) -> None: from app.api.routes import datasets as dataset_routes