Skip to content

Commit 2ee9d05

Browse files
LucaMarconatoclaude
andcommitted
Remove _filter_table_by_element_names and replace with _filter_table_by_elements
The old function filtered only by region name, ignoring instance IDs. Replace its only caller (filter_tables by coordinate system) with _filter_table_by_elements, which correctly filters by both region and instance. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent b714927 commit 2ee9d05

2 files changed

Lines changed: 9 additions & 29 deletions

File tree

src/spatialdata/_core/query/relational_query.py

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -59,31 +59,6 @@ def get_element_annotators(sdata: SpatialData, element_name: str) -> set[str]:
5959
return table_names
6060

6161

62-
def _filter_table_by_element_names(table: AnnData | None, element_names: str | list[str]) -> AnnData | None:
63-
"""
64-
Filter an AnnData table to keep only the rows that are in the coordinate system.
65-
66-
Parameters
67-
----------
68-
table
69-
The table to filter; if None, returns None
70-
element_names
71-
The element_names to keep in the tables obs.region column
72-
73-
Returns
74-
-------
75-
The filtered table, or None if the input table was None
76-
"""
77-
if table is None or not table.uns.get(TableModel.ATTRS_KEY):
78-
return None
79-
table_mapping_metadata = table.uns[TableModel.ATTRS_KEY]
80-
region_key = table_mapping_metadata[TableModel.REGION_KEY_KEY]
81-
table.obs = pd.DataFrame(table.obs)
82-
table = table[table.obs[region_key].isin(element_names)].copy()
83-
table.uns[TableModel.ATTRS_KEY][TableModel.REGION_KEY] = table.obs[region_key].unique().tolist()
84-
return table
85-
86-
8762
@singledispatch
8863
def get_element_instances(
8964
element: SpatialElement,

src/spatialdata/_core/spatialdata.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -691,12 +691,17 @@ def _filter_tables(
691691
continue
692692
# each mode here requires paths or elements, using assert here to avoid mypy errors.
693693
if by == "cs":
694-
from spatialdata._core.query.relational_query import (
695-
_filter_table_by_element_names,
696-
)
694+
from spatialdata._core.query.relational_query import _filter_table_by_elements
697695

698696
assert element_names is not None
699-
table = _filter_table_by_element_names(table, element_names)
697+
elements_dict = {}
698+
for element_type in ["images", "labels", "shapes", "points"]:
699+
elements = getattr(self, element_type)
700+
if elements: # Check if the dictionary is not empty
701+
elements_dict[element_type] = {
702+
name: elements[name] for name in element_names if name in elements
703+
}
704+
table = _filter_table_by_elements(table, elements_dict=elements_dict)
700705
if table is not None and len(table) != 0:
701706
tables[table_name] = table
702707
elif by == "elements":

0 commit comments

Comments
 (0)