Skip to content

Commit

Permalink
Switch order of operations so axes are not filtered by parameter subs…
Browse files Browse the repository at this point in the history
…etting (#57)

* Switch order of operations so axes are not filtered by parameter subsetting

* Add tests for edge case

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Fix area selection errors, update tests

* Clean up prints

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
  • Loading branch information
mpiannucci and pre-commit-ci[bot] authored Nov 10, 2024
1 parent 790347b commit bf9d5d9
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 31 deletions.
10 changes: 6 additions & 4 deletions tests/test_cf_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,9 @@ def test_cf_position_query(cf_client, cf_dataset):
def test_cf_position_csv(cf_client):
x = 204
y = 44
response = cf_client.get(f"/datasets/air/edr/position?coords=POINT({x} {y})&f=csv")
response = cf_client.get(
f"/datasets/air/edr/position?coords=POINT({x} {y})&f=csv&parameter-name=air",
)

assert response.status_code == 200, "Response did not return successfully"
assert (
Expand Down Expand Up @@ -215,7 +217,7 @@ def test_cf_position_geojson(cf_client):
x = 204
y = 44
response = cf_client.get(
f"/datasets/air/edr/position?coords=POINT({x} {y})&f=geojson",
f"/datasets/air/edr/position?coords=POINT({x} {y})&f=geojson&parameter-name=air",
)

assert response.status_code == 200, "Response did not return successfully"
Expand Down Expand Up @@ -332,10 +334,10 @@ def test_cf_area_query(cf_client, cf_dataset):
axes = data["domain"]["axes"]

assert axes["x"] == {
"values": [202.5, 202.5, 202.5, 205.0, 205.0, 205.0, 207.5, 207.5, 207.5],
"values": [202.5, 205.0, 207.5, 202.5, 205.0, 207.5, 202.5, 205.0, 207.5],
}, "Did not select nearby x coordinates within the polygon"
assert axes["y"] == {
"values": [47.5, 45.0, 42.5, 47.5, 45.0, 42.5, 47.5, 45.0, 42.5],
"values": [47.5, 47.5, 47.5, 45.0, 45.0, 45.0, 42.5, 42.5, 42.5],
}, "Did not select a nearby y coordinates within the polygon"

assert (
Expand Down
16 changes: 8 additions & 8 deletions tests/test_select.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,19 +216,19 @@ def test_select_area_regular_xy(regular_xy_dataset):
ds["air"].isel(time=0),
np.array(
[
280.0,
282.79,
284.6,
279.0,
280.7,
283.2,
284.9,
279.0,
278.9,
280.0,
280.7,
280.2,
282.6,
284.2,
279.6,
282.79,
283.2,
282.6,
281.9,
284.9,
284.2,
],
),
),
Expand Down
3 changes: 2 additions & 1 deletion xpublish_edr/geometry/area.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,11 @@ def _select_area_regular_xy_grid(
mask = shapely.intersects_xy(polygon, pts[0], pts[1])

# Find the x and y indices that have any points within the polygon
x_inds, y_inds = np.nonzero(mask)
y_inds, x_inds = np.nonzero(mask)
x_sel = xr.Variable(data=x_inds, dims=VECTORIZED_DIM)
y_sel = xr.Variable(data=y_inds, dims=VECTORIZED_DIM)

# Apply the mask and vectorize to a 1d collection of points
ds_sub = ds.cf.isel(X=x_sel, Y=y_sel)

return ds_sub
36 changes: 18 additions & 18 deletions xpublish_edr/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,26 +91,26 @@ def get_position(
Extra selecting/slicing parameters can be provided as extra query parameters
"""
try:
ds = select_by_position(dataset, query.geometry, query.method)
except KeyError:
ds = query.select(dataset, dict(request.query_params))
except ValueError as e:
raise HTTPException(
status_code=404,
detail="Dataset does not have CF Convention compliant metadata",
detail=f"Error selecting from query: {e.args[0]}",
)

logger.debug(
f"Dataset filtered by position ({query.geometry}): {ds}",
)
logger.debug(f"Dataset filtered by query params {ds}")

try:
ds = query.select(ds, dict(request.query_params))
except ValueError as e:
ds = select_by_position(ds, query.geometry, query.method)
except KeyError:
raise HTTPException(
status_code=404,
detail=f"Error selecting from query: {e.args[0]}",
detail="Dataset does not have CF Convention compliant metadata",
)

logger.debug(f"Dataset filtered by query params {ds}")
logger.debug(
f"Dataset filtered by position ({query.geometry}): {ds}",
)

if query.format:
try:
Expand Down Expand Up @@ -138,24 +138,24 @@ def get_area(
Extra selecting/slicing parameters can be provided as extra query parameters
"""
try:
ds = select_by_area(dataset, query.geometry)
except KeyError:
ds = query.select(dataset, dict(request.query_params))
except ValueError as e:
raise HTTPException(
status_code=404,
detail="Dataset does not have CF Convention compliant metadata",
detail=f"Error selecting from query: {e.args[0]}",
)

logger.debug(f"Dataset filtered by polygon {query.geometry.boundary}: {ds}")
logger.debug(f"Dataset filtered by query params {ds}")

try:
ds = query.select(ds, dict(request.query_params))
except ValueError as e:
ds = select_by_area(ds, query.geometry)
except KeyError:
raise HTTPException(
status_code=404,
detail=f"Error selecting from query: {e.args[0]}",
detail="Dataset does not have CF Convention compliant metadata",
)

logger.debug(f"Dataset filtered by query params {ds}")
logger.debug(f"Dataset filtered by polygon {query.geometry.boundary}: {ds}")

if query.format:
try:
Expand Down

0 comments on commit bf9d5d9

Please sign in to comment.