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")