diff --git a/src/mavedb/lib/score_sets.py b/src/mavedb/lib/score_sets.py index 142623dd..cedccef3 100644 --- a/src/mavedb/lib/score_sets.py +++ b/src/mavedb/lib/score_sets.py @@ -216,12 +216,12 @@ def build_search_score_sets_query_filter( ) ) - if search.keywords: + if search.controlled_keywords: query = query.filter( ScoreSet.experiment.has( Experiment.keyword_objs.any( ExperimentControlledKeywordAssociation.controlled_keyword.has( - ControlledKeyword.label.in_(search.keywords) + ControlledKeyword.label.in_(search.controlled_keywords) ) ) ) @@ -334,6 +334,9 @@ def fetch_score_set_search_filter_options( publication_author_name_counter: Counter[str] = Counter() publication_db_name_counter: Counter[str] = Counter() publication_journal_counter: Counter[str] = Counter() + # Controlled keywords related counters + controlled_keywords_label_counter: Counter[str] = Counter() + # --- PERFORMANCE NOTE --- # The following counter construction loop is a bottleneck for large score set queries. @@ -388,6 +391,13 @@ def fetch_score_set_search_filter_options( if journal: publication_journal_counter[journal] += 1 + # Controlled keywords related options + for controlled_keyword in getattr(score_set.experiment, "keyword_objs", []): + keyword = getattr(controlled_keyword, "controlled_keyword", []) + label = getattr(keyword, "label", None) + if label: + controlled_keywords_label_counter[label] += 1 + logger.debug(msg="Score set search filter options were fetched.", extra=logging_context()) return { @@ -398,6 +408,7 @@ def fetch_score_set_search_filter_options( "publication_author_names": score_set_search_filter_options_from_counter(publication_author_name_counter), "publication_db_names": score_set_search_filter_options_from_counter(publication_db_name_counter), "publication_journals": score_set_search_filter_options_from_counter(publication_journal_counter), + "controlled_keywords": score_set_search_filter_options_from_counter(controlled_keywords_label_counter), } diff --git a/src/mavedb/view_models/search.py b/src/mavedb/view_models/search.py index 712cb5e3..09e7ff00 100644 --- a/src/mavedb/view_models/search.py +++ b/src/mavedb/view_models/search.py @@ -25,7 +25,7 @@ class ScoreSetsSearch(BaseModel): databases: Optional[list[str]] = None journals: Optional[list[str]] = None publication_identifiers: Optional[list[str]] = None - keywords: Optional[list[str]] = None + controlled_keywords: Optional[list[str]] = None text: Optional[str] = None include_experiment_score_set_urns_and_count: Optional[bool] = True offset: Optional[int] = None @@ -56,6 +56,7 @@ class ScoreSetsSearchFilterOptionsResponse(BaseModel): publication_author_names: list[ScoreSetsSearchFilterOption] publication_db_names: list[ScoreSetsSearchFilterOption] publication_journals: list[ScoreSetsSearchFilterOption] + controlled_keywords: list[ScoreSetsSearchFilterOption] class Config: from_attributes = True diff --git a/tests/helpers/constants.py b/tests/helpers/constants.py index e06d07a1..b39691a3 100644 --- a/tests/helpers/constants.py +++ b/tests/helpers/constants.py @@ -2184,7 +2184,7 @@ "databases": ["uniprot"], "journals": ["biomed"], "publication_identifiers": ["12345678"], - "keywords": ["keyword"], + "controlled_keywords": ["keyword"], "text": "testtesttest", } diff --git a/tests/lib/test_score_set.py b/tests/lib/test_score_set.py index 0b7852da..f74ae57b 100644 --- a/tests/lib/test_score_set.py +++ b/tests/lib/test_score_set.py @@ -391,6 +391,7 @@ def test_fetch_score_set_search_filter_options_no_score_sets(setup_lib_db, sessi filter_options = fetch_score_set_search_filter_options(session, None, None, score_set_search) assert filter_options == { + "controlled_keywords": [], "target_gene_categories": [], "target_gene_names": [], "target_organism_names": [], @@ -437,6 +438,7 @@ def test_fetch_score_set_search_filter_options_with_score_set(setup_lib_db, sess filter_options = fetch_score_set_search_filter_options(session, user_data, None, score_set_search) assert filter_options == { + "controlled_keywords": [], "target_gene_categories": [{"value": TargetCategory.protein_coding, "count": 1}], "target_gene_names": [{"value": "TEST2", "count": 1}], "target_organism_names": [], @@ -511,6 +513,7 @@ def test_fetch_score_set_search_filter_options_with_partial_filtered_score_sets( user_data = UserData(user=requesting_user, active_roles=[]) filter_options = fetch_score_set_search_filter_options(session, user_data, None, score_set_search) assert filter_options == { + "controlled_keywords": [], "target_gene_categories": [{"value": TargetCategory.protein_coding, "count": 1}], "target_gene_names": [{"value": "TEST1", "count": 1}], "target_organism_names": [{"count": 1, "value": "Organism name"}], @@ -528,6 +531,7 @@ def test_fetch_score_set_search_filter_options_with_no_matching_score_sets(setup filter_options = fetch_score_set_search_filter_options(session, user_data, None, score_set_search) assert filter_options == { + "controlled_keywords": [], "target_gene_categories": [], "target_gene_names": [], "target_organism_names": [], @@ -543,6 +547,7 @@ def test_fetch_score_set_search_filter_options_with_no_permitted_score_sets(setu filter_options = fetch_score_set_search_filter_options(session, None, None, score_set_search) assert filter_options == { + "controlled_keywords": [], "target_gene_categories": [], "target_gene_names": [], "target_organism_names": [],