From 2f7a924622ded9bdf8cbb98a62ae248849aad86d Mon Sep 17 00:00:00 2001 From: anon Date: Mon, 9 Nov 2026 19:11:11 +0100 Subject: [PATCH] feat(query): filter on the tissue and disease roll-up columns query() rejected tissue_system, tissue_organ, disease_class and disease_group, although the hub cut publishes them and the MCP connector's snippets filter on them, e.g. Catalog(version="2026-11-08").query(tissue_organ="brain", validation=None). They are now facets. Each row carries its anchor, so equality on an anchor includes every tissue or disease under it. --- src/sddb/_catalog_schema.py | 5 +++++ tests/test_facets_study_doi.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/sddb/_catalog_schema.py b/src/sddb/_catalog_schema.py index c476bad..a0d025a 100644 --- a/src/sddb/_catalog_schema.py +++ b/src/sddb/_catalog_schema.py @@ -193,7 +193,12 @@ "doi", "organism", "tissue", + # Ontology roll-ups the hub cut writes: each row has its anchor, so equality includes everything under it. + "tissue_system", + "tissue_organ", "disease", + "disease_class", + "disease_group", "development_stage", "technology", "vendor", diff --git a/tests/test_facets_study_doi.py b/tests/test_facets_study_doi.py index d125551..fa79a4a 100644 --- a/tests/test_facets_study_doi.py +++ b/tests/test_facets_study_doi.py @@ -1,4 +1,5 @@ import pandas as pd +import pytest from sddb import _catalog_schema as schema from sddb.catalog import Catalog @@ -27,3 +28,31 @@ def test_query_by_study_id(tmp_path): cat = Catalog.from_file(p) assert list(cat.query(study_id="oliveira_2025").to_df()["uid"]) == ["u1"] assert list(cat.query(doi="10.2/y").to_df()["uid"]) == ["u2"] + + +def test_query_by_tissue_and_disease_rollup(tmp_path): + df = pd.DataFrame( + { + "uid": ["u1", "u2", "u3"], + "technology": ["Xenium"] * 3, + "assay": ["spatial"] * 3, + "organism": ["Mus musculus"] * 3, + "tissue": ["cerebellum", "hippocampal formation", "liver"], + "tissue_system": ["nervous system", "nervous system", "digestive system"], + "tissue_organ": ["brain", "brain", "liver"], + "disease_class": ["neurodegenerative disease", None, None], + "disease_group": ["Alzheimer disease", None, None], + "validation_status": ["pass"] * 3, + "zarr_url": ["s3://b/1.zarr", "s3://b/2.zarr", "s3://b/3.zarr"], + } + ) + p = tmp_path / "catalog.parquet" + df.to_parquet(p) + cat = Catalog.from_file(p) + # the form the MCP connector emits + assert list(cat.query(tissue_organ="brain", validation=None).to_df()["uid"]) == ["u1", "u2"] + assert list(cat.query(tissue_system="Nervous System").to_df()["uid"]) == ["u1", "u2"] + assert list(cat.query(disease_group="Alzheimer disease", tissue_organ="brain").to_df()["uid"]) == ["u1"] + assert list(cat.query(disease_class="neurodegenerative disease").to_df()["uid"]) == ["u1"] + with pytest.raises(ValueError, match="did you mean"): + cat.query(tissue_organ="brian")