diff options
author | Jenkins <jenkins@review.openstack.org> | 2015-11-04 14:14:33 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2015-11-04 14:14:33 +0000 |
commit | b88c1c7438655200ce69051c989653f232618f89 (patch) | |
tree | 48df9262db9b021ba4240d0e23b00fe24879b47b | |
parent | 72a57fab8112eda4331fb7d624c82e0e1e5f8df8 (diff) | |
parent | 5d3622a484c103c8d16d1880646df64a6a40f3c1 (diff) | |
download | ceilometer-b88c1c7438655200ce69051c989653f232618f89.tar.gz |
Merge "SQL: Fix event-list with multiple trait query filters" into stable/kilo
-rw-r--r-- | ceilometer/event/storage/impl_sqlalchemy.py | 16 | ||||
-rw-r--r-- | ceilometer/tests/api/v2/test_event_scenarios.py | 10 |
2 files changed, 18 insertions, 8 deletions
diff --git a/ceilometer/event/storage/impl_sqlalchemy.py b/ceilometer/event/storage/impl_sqlalchemy.py index 4c680681..95877f00 100644 --- a/ceilometer/event/storage/impl_sqlalchemy.py +++ b/ceilometer/event/storage/impl_sqlalchemy.py @@ -70,7 +70,7 @@ def _build_trait_query(session, trait_type, key, value, op='eq'): 'ne': (trait_model.value != value)} conditions = [trait_model.key == key, op_dict[op]] return (session.query(trait_model.event_id.label('ev_id')) - .filter(*conditions), trait_model) + .filter(*conditions)) class Connection(base.Connection): @@ -258,17 +258,17 @@ class Connection(base.Connection): trait_filter = filters.pop() key = trait_filter.pop('key') op = trait_filter.pop('op', 'eq') - trait_subq, t_model = _build_trait_query( - session, trait_filter.keys()[0], key, - trait_filter.values()[0], op) + trait_type, value = list(trait_filter.items())[0] + trait_subq = _build_trait_query(session, trait_type, + key, value, op) for trait_filter in filters: key = trait_filter.pop('key') op = trait_filter.pop('op', 'eq') - q, model = _build_trait_query( - session, trait_filter.keys()[0], key, - trait_filter.values()[0], op) + trait_type, value = list(trait_filter.items())[0] + q = _build_trait_query(session, trait_type, + key, value, op) trait_subq = trait_subq.filter( - q.filter(model.event_id == t_model.event_id).exists()) + trait_subq.subquery().c.ev_id == q.subquery().c.ev_id) trait_subq = trait_subq.subquery() query = (session.query(models.Event.id) diff --git a/ceilometer/tests/api/v2/test_event_scenarios.py b/ceilometer/tests/api/v2/test_event_scenarios.py index b6bc50c0..ba94c59e 100644 --- a/ceilometer/tests/api/v2/test_event_scenarios.py +++ b/ceilometer/tests/api/v2/test_event_scenarios.py @@ -274,6 +274,16 @@ class TestEventAPI(EventTestBase): self.assertEqual(0, len(data)) + def test_get_events_multiple_filters_same_field_different_values(self): + data = self.get_json(self.PATH, headers=headers, + q=[{'field': 'trait_A', + 'value': 'my_Foo_text', + 'type': 'string'}, + {'field': 'trait_A', + 'value': 'my_Bar_text', + 'type': 'string'}]) + self.assertEqual(0, len(data)) + def test_get_events_not_filters(self): data = self.get_json(self.PATH, headers=headers, q=[]) |