Bugfix - allow filtering on multiple workflow tags at once.

This commit is contained in:
John Chilton
2022-05-05 15:22:32 -04:00
parent d2601426a4
commit d2feecd443
2 changed files with 42 additions and 3 deletions
+9 -3
View File
@@ -27,6 +27,7 @@ from sqlalchemy import (
true,
)
from sqlalchemy.orm import (
aliased,
joinedload,
Query,
subqueryload,
@@ -160,7 +161,10 @@ class WorkflowsManager(sharable.SharableModelManager):
parsed_search = parse_filters_structured(search_query, INDEX_SEARCH_FILTERS)
def w_tag_filter(term_text: str, quoted: bool):
return tag_filter(model.StoredWorkflowTagAssociation, term_text, quoted)
nonlocal query
alias = aliased(model.StoredWorkflowTagAssociation)
query = query.outerjoin(model.StoredWorkflow.tags.of_type(alias))
return tag_filter(alias, term_text, quoted)
def name_filter(term):
return text_column_filter(model.StoredWorkflow.name, term)
@@ -170,7 +174,8 @@ class WorkflowsManager(sharable.SharableModelManager):
key = term.filter
q = term.text
if key == "tag":
query = query.filter(w_tag_filter(term.text, term.quoted))
tf = w_tag_filter(term.text, term.quoted)
query = query.filter(tf)
elif key == "name":
query = query.filter(name_filter(term))
elif key == "is":
@@ -182,11 +187,12 @@ class WorkflowsManager(sharable.SharableModelManager):
raise exceptions.RequestParameterInvalidException(message)
query = query.filter(model.StoredWorkflowUserShareAssociation.user == user)
elif isinstance(term, RawTextTerm):
tf = w_tag_filter(term.text, False)
query = query.filter(
raw_text_column_filter(
[
model.StoredWorkflow.name,
w_tag_filter(term.text, False),
tf,
],
term,
)
+33
View File
@@ -493,6 +493,39 @@ class WorkflowsApiTestCase(BaseWorkflowsApiTestCase, ChangeDatatypeTestCase):
index_ids = self.workflow_populator.index_ids(search="tag:moocowatag")
assert workflow_id_1 in index_ids
def test_index_search_tags_multiple(self):
name1 = self.dataset_populator.get_random_name()
name2 = self.dataset_populator.get_random_name()
name3 = self.dataset_populator.get_random_name()
workflow_id_1 = self.workflow_populator.simple_workflow(name1)
workflow_id_2 = self.workflow_populator.simple_workflow(name2)
workflow_id_3 = self.workflow_populator.simple_workflow(name3)
self.workflow_populator.set_tags(workflow_id_1, ["multipletagfilter1", "multipletagfilter2", "decoy1"])
self.workflow_populator.set_tags(workflow_id_2, ["multipletagfilter1", "decoy2"])
self.workflow_populator.set_tags(workflow_id_3, ["multipletagfilter2", "decoy3"])
for search in ["multipletagfilter1", "tag:ipletagfilter1", "tag:'multipletagfilter1'"]:
index_ids = self.workflow_populator.index_ids(search=search)
assert workflow_id_1 in index_ids
assert workflow_id_2 in index_ids
assert workflow_id_3 not in index_ids
for search in ["multipletagfilter2", "tag:ipletagfilter2", "tag:'multipletagfilter2'"]:
index_ids = self.workflow_populator.index_ids(search=search)
assert workflow_id_1 in index_ids
assert workflow_id_2 not in index_ids
assert workflow_id_3 in index_ids
for search in [
"multipletagfilter2 multipletagfilter1",
"tag:filter2 tag:tagfilter1",
"tag:'multipletagfilter2' tag:'multipletagfilter1'",
]:
index_ids = self.workflow_populator.index_ids(search=search)
assert workflow_id_1 in index_ids
assert workflow_id_2 not in index_ids
assert workflow_id_3 not in index_ids
def test_search_casing(self):
name1, name2 = (
self.dataset_populator.get_random_name().upper(),