From c1c4feb3d72f7de17d40ba5646092d318ac0afe3 Mon Sep 17 00:00:00 2001 From: Estelle Da Date: Fri, 10 Apr 2026 17:41:58 +1000 Subject: [PATCH 1/3] Add controlled keywords to score set search filter options. --- src/mavedb/lib/score_sets.py | 15 +++++++++++++-- src/mavedb/view_models/search.py | 3 ++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/mavedb/lib/score_sets.py b/src/mavedb/lib/score_sets.py index 142623dd2..cedccef3f 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 712cb5e32..09e7ff00d 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 From 527847ea7558b4c134b60bcc0bccaa04072d0431 Mon Sep 17 00:00:00 2001 From: Estelle Da Date: Fri, 10 Apr 2026 17:45:24 +1000 Subject: [PATCH 2/3] Modify keywords to controlled_keywords in constant test. --- tests/helpers/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/helpers/constants.py b/tests/helpers/constants.py index e06d07a12..b39691a32 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", } From a04442e76884d65131b60923a4cc7ce7a25c179a Mon Sep 17 00:00:00 2001 From: Estelle Da Date: Fri, 10 Apr 2026 18:19:15 +1000 Subject: [PATCH 3/3] Add controlled_keywords in some tests. --- tests/lib/test_score_set.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/lib/test_score_set.py b/tests/lib/test_score_set.py index 0b7852dae..f74ae57ba 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": [],