Merge "Search based on tags condition with or condition combiner"
This commit is contained in:
commit
5408124b87
|
@ -265,8 +265,14 @@ def _apply_user_filters(query, basic_conds, tag_conds, prop_conds):
|
|||
for tag_condition in tag_conds['and']:
|
||||
query = query.join(models.ArtifactTag, aliased=True).filter(
|
||||
and_(*tag_condition))
|
||||
tag_or_queries = []
|
||||
for tag_condition in tag_conds['or']:
|
||||
or_queries.append(*tag_condition)
|
||||
artifact_tag_alias = aliased(models.ArtifactTag)
|
||||
query = query.join(artifact_tag_alias)
|
||||
for tag_cond in tag_condition:
|
||||
tag_cond.left = artifact_tag_alias.value
|
||||
tag_or_queries.append(and_(*tag_condition))
|
||||
or_queries.append(and_(*tag_or_queries))
|
||||
|
||||
if prop_conds:
|
||||
for prop_condition in prop_conds['and']:
|
||||
|
|
|
@ -715,6 +715,21 @@ class TestList(base.TestArtifact):
|
|||
result = self.get(url=url)['artifacts']
|
||||
self.assertEqual([], result)
|
||||
|
||||
url = '/sample_artifact?name=or:eq:name2&tags-any=or:tag1,tag4' \
|
||||
'&sort=name:asc'
|
||||
result = self.get(url=url)['artifacts']
|
||||
self.assertEqual(4, len(result))
|
||||
for i in (1, 2, 4):
|
||||
self.assertIn(art_list[i], result)
|
||||
self.assertEqual(public_art, result[3])
|
||||
|
||||
url = '/sample_artifact?name=or:eq:name2&&tags=or:tag4,tag5' \
|
||||
'&sort=name:asc'
|
||||
result = self.get(url=url)['artifacts']
|
||||
self.assertEqual(2, len(result))
|
||||
self.assertEqual(art_list[2], result[0])
|
||||
self.assertEqual(public_art, result[1])
|
||||
|
||||
|
||||
class TestBlobs(base.TestArtifact):
|
||||
def test_blob_dicts(self):
|
||||
|
|
|
@ -539,10 +539,16 @@ class TestArtifactList(base.BaseTestArtifactAPI):
|
|||
for i in (3, 0):
|
||||
self.assertIn(arts[i], res['artifacts'])
|
||||
|
||||
filters = [('name', 'or:in:name4,name1'), ('tags-any', 'or:tag4')]
|
||||
filters = [('name', 'or:in:name2,name1'), ('tags-any', 'or:tag2,tag5')]
|
||||
res = self.controller.list(self.req, 'sample_artifact', filters)
|
||||
self.assertEqual(6, len(res['artifacts']))
|
||||
for i in (5, 4, 3, 0):
|
||||
self.assertEqual(4, len(res['artifacts']))
|
||||
for i in (5, 3, 1, 0):
|
||||
self.assertIn(arts[i], res['artifacts'])
|
||||
|
||||
filters = [('name', 'or:in:name4,name1'), ('tags', 'or:tag1,tag3')]
|
||||
res = self.controller.list(self.req, 'sample_artifact', filters)
|
||||
self.assertEqual(3, len(res['artifacts']))
|
||||
for i in (3, 1, 0):
|
||||
self.assertIn(arts[i], res['artifacts'])
|
||||
|
||||
# Filtering by tags with operators leads to BadRequest
|
||||
|
|
Loading…
Reference in New Issue