diff --git a/src/animaltrack/selection/parser.py b/src/animaltrack/selection/parser.py index 13bd984..6c673f5 100644 --- a/src/animaltrack/selection/parser.py +++ b/src/animaltrack/selection/parser.py @@ -7,7 +7,7 @@ from animaltrack.selection.ast import FieldFilter, FilterAST # Supported filter fields VALID_FIELDS = frozenset( - {"location", "species", "sex", "life_stage", "identified", "tag", "status"} + {"animal_id", "location", "species", "sex", "life_stage", "identified", "tag", "status"} ) # Fields that can be used as flags (without :value) diff --git a/src/animaltrack/selection/resolver.py b/src/animaltrack/selection/resolver.py index b2da665..7bc2ab9 100644 --- a/src/animaltrack/selection/resolver.py +++ b/src/animaltrack/selection/resolver.py @@ -148,7 +148,16 @@ def _build_filter_clause(field_filter: FieldFilter, ts_utc: int) -> tuple[str, l field = field_filter.field values = list(field_filter.values) - if field == "species": + if field == "animal_id": + # Direct animal ID filter + placeholders = ",".join("?" * len(values)) + query = f""" + SELECT animal_id FROM animal_registry + WHERE animal_id IN ({placeholders}) + """ + return query, values + + elif field == "species": # Species from animal_registry (current state) placeholders = ",".join("?" * len(values)) query = f"""