Condition based INNER JOIN for artifact_properties table
In case that "artifact data" does not contain properties other than base artifact properties, query will return no records. That because of INNER JOIN usage between glare_artifacts and glare_artifact_properties tables (as there are no rows in glare_artifact_properties corresponding to that artifact_id). Therefore INNER JOIN needed to be added only if there is any glare_artifact_properties based condition. Change-Id: Icfcbeb41703771145db5405ffc2609dbb6ca1741
This commit is contained in:
parent
1a0c7c01cf
commit
06e46b778f
@ -276,8 +276,10 @@ def _apply_user_filters(query, basic_conds, tag_conds, prop_conds):
|
|||||||
or_queries.append(and_(*prop_condition))
|
or_queries.append(and_(*prop_condition))
|
||||||
|
|
||||||
if len(or_queries) != 0:
|
if len(or_queries) != 0:
|
||||||
query = query.join(models.ArtifactProperty, aliased=True).filter(
|
if len(prop_conds['or']) > 0:
|
||||||
or_(*or_queries))
|
query = query.join(models.ArtifactProperty, aliased=True)
|
||||||
|
|
||||||
|
query = query.filter(or_(*or_queries))
|
||||||
|
|
||||||
return query
|
return query
|
||||||
|
|
||||||
|
@ -2193,17 +2193,21 @@ class TestUpdate(base.TestArtifact):
|
|||||||
'value': 'value1'}]
|
'value': 'value1'}]
|
||||||
url = '/sample_artifact/%s' % art1['id']
|
url = '/sample_artifact/%s' % art1['id']
|
||||||
result = self.patch(url=url, data=data)
|
result = self.patch(url=url, data=data)
|
||||||
self.assertEqual(['tag1', 'tag2'], result['tags'])
|
self.assertEqual(['tag1', 'tag2'], sorted(result['tags']))
|
||||||
self.assertEqual({'meta1': 'value1'}, result['metadata'])
|
self.assertEqual({'meta1': 'value1'}, result['metadata'])
|
||||||
|
|
||||||
|
# Tags is set data structure so sequence of data is not fixed
|
||||||
|
first_tag = result['tags'][0]
|
||||||
|
second_tag = result['tags'][1]
|
||||||
|
|
||||||
# move tag to metadata
|
# move tag to metadata
|
||||||
data = [{"op": "move",
|
data = [{"op": "move",
|
||||||
"from": "/tags/0",
|
"from": "/tags/0",
|
||||||
"path": "/metadata/meta2"}]
|
"path": "/metadata/meta2"}]
|
||||||
url = '/sample_artifact/%s' % art1['id']
|
url = '/sample_artifact/%s' % art1['id']
|
||||||
result = self.patch(url=url, data=data)
|
result = self.patch(url=url, data=data)
|
||||||
self.assertEqual(['tag2'], result['tags'])
|
self.assertEqual([second_tag], result['tags'])
|
||||||
self.assertEqual({'meta1': 'value1', 'meta2': 'tag1'},
|
self.assertEqual({'meta1': 'value1', 'meta2': first_tag},
|
||||||
result['metadata'])
|
result['metadata'])
|
||||||
|
|
||||||
# move data from one dict to another one
|
# move data from one dict to another one
|
||||||
@ -2214,7 +2218,7 @@ class TestUpdate(base.TestArtifact):
|
|||||||
result = self.patch(url=url, data=data)
|
result = self.patch(url=url, data=data)
|
||||||
self.assertEqual({}, result['dict_of_str'])
|
self.assertEqual({}, result['dict_of_str'])
|
||||||
self.assertEqual({'meta1': 'value1',
|
self.assertEqual({'meta1': 'value1',
|
||||||
'meta2': 'tag1',
|
'meta2': first_tag,
|
||||||
'wrong_type': '1'}, result['metadata'])
|
'wrong_type': '1'}, result['metadata'])
|
||||||
|
|
||||||
# move data from one data to another one having same key
|
# move data from one data to another one having same key
|
||||||
@ -2229,7 +2233,7 @@ class TestUpdate(base.TestArtifact):
|
|||||||
result = self.patch(url=url, data=data)
|
result = self.patch(url=url, data=data)
|
||||||
self.assertEqual({"new_key": "new_value"}, result['dict_of_str'])
|
self.assertEqual({"new_key": "new_value"}, result['dict_of_str'])
|
||||||
self.assertEqual({'meta1': 'value1',
|
self.assertEqual({'meta1': 'value1',
|
||||||
'meta2': 'tag1',
|
'meta2': first_tag,
|
||||||
'wrong_type': '1',
|
'wrong_type': '1',
|
||||||
"new_key": "new_value"}, result['metadata'])
|
"new_key": "new_value"}, result['metadata'])
|
||||||
|
|
||||||
@ -2239,7 +2243,7 @@ class TestUpdate(base.TestArtifact):
|
|||||||
result = self.patch(url=url, data=data)
|
result = self.patch(url=url, data=data)
|
||||||
self.assertEqual({}, result['dict_of_str'])
|
self.assertEqual({}, result['dict_of_str'])
|
||||||
self.assertEqual({'meta1': 'value1',
|
self.assertEqual({'meta1': 'value1',
|
||||||
'meta2': 'tag1',
|
'meta2': first_tag,
|
||||||
'wrong_type': '1',
|
'wrong_type': '1',
|
||||||
"new_key": "new_value"}, result['metadata'])
|
"new_key": "new_value"}, result['metadata'])
|
||||||
|
|
||||||
|
@ -657,3 +657,13 @@ class TestArtifactList(base.BaseTestArtifactAPI):
|
|||||||
filters = [('name', 'or:tt:ttt'), ('str1', "or:blabla")]
|
filters = [('name', 'or:tt:ttt'), ('str1', "or:blabla")]
|
||||||
self.assertRaises(exc.BadRequest, self.controller.list,
|
self.assertRaises(exc.BadRequest, self.controller.list,
|
||||||
self.req, 'sample_artifact', filters)
|
self.req, 'sample_artifact', filters)
|
||||||
|
|
||||||
|
res = self.controller.create(self.req, 'heat_templates',
|
||||||
|
{'name': "artifact_without_properties"})
|
||||||
|
|
||||||
|
filters = [('name', 'or:eq:non_existant_name'),
|
||||||
|
('id', 'or:eq:' + res['id'])]
|
||||||
|
res = self.controller.list(self.req, 'heat_templates',
|
||||||
|
filters)['artifacts']
|
||||||
|
self.assertEqual(1, len(res))
|
||||||
|
self.assertEqual('artifact_without_properties', res[0]['name'])
|
||||||
|
Loading…
Reference in New Issue
Block a user