)]}'
{"ceilometer/event/storage/impl_sqlalchemy.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"6224b5c0884f84d3eb7cb231ae1700238dd57058","unresolved":false,"context_lines":[{"line_number":282,"context_line":"                    _event_list.extend(q.add_columns(models.Event.generated,"},{"line_number":283,"context_line":"                                                     models.Event.message_id,"},{"line_number":284,"context_line":"                                                     models.EventType.desc,"},{"line_number":285,"context_line":"                                                     models.Event.raw).all())"},{"line_number":286,"context_line":"                event_list \u003d {}"},{"line_number":287,"context_line":"                for e in sorted(_event_list,"},{"line_number":288,"context_line":"                                key\u003dlambda e: e.generated)[:limit]:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_293819d3","line":285,"updated":"2015-09-14 15:17:49.000000000","message":"not a fan of double query... it\u0027s better with union... apparently it doesn\u0027t know how to handle indexes when OR condition applied... the following works well when i have 300k event db.\n\ndiff --git a/ceilometer/event/storage/impl_sqlalchemy.py b/ceilometer/event/storage/impl_sqlalchemy.py\nindex e0497b4..33b0152 100644\n--- a/ceilometer/event/storage/impl_sqlalchemy.py\n+++ b/ceilometer/event/storage/impl_sqlalchemy.py\n@@ -266,14 +266,18 @@ class Connection(base.Connection):\n                 query \u003d query.join(trait_subq,\n                                    trait_subq.c.ev_id \u003d\u003d models.Event.id)\n             if event_filter.admin_proj:\n-                admin_q \u003d session.query(models.TraitText).filter(\n+                no_proj_q \u003d session.query(models.TraitText.event_id).filter(\n                     models.TraitText.key \u003d\u003d \u0027project_id\u0027)\n-                query \u003d query.filter(sa.or_(~sa.exists().where(\n-                    models.Event.id \u003d\u003d admin_q.subquery().c.event_id),\n+                admin_q \u003d (session.query(models.TraitText.event_id).filter(\n+                    ~sa.exists().where(models.TraitText.event_id \u003d\u003d\n+                                       no_proj_q.subquery().c.event_id))\n+                    .union(session.query(models.TraitText.event_id).filter(\n                     sa.and_(\n                         models.TraitText.key \u003d\u003d \u0027project_id\u0027,\n                         models.TraitText.value \u003d\u003d event_filter.admin_proj,\n-                        models.Event.id \u003d\u003d models.TraitText.event_id)))\n+                        models.Event.id \u003d\u003d models.TraitText.event_id))))\n+                query \u003d query.filter(sa.exists()\n+                    .where(models.Event.id \u003d\u003d admin_q.subquery().c.trait_text_event_id))\n             if event_filter_conditions:\n                 query \u003d query.filter(sa.and_(*event_filter_conditions))\n \n@@ -283,7 +287,7 @@ class Connection(base.Connection):\n             for (id_, generated, message_id,\n                  desc, raw) in query.add_columns(\n                      models.Event.generated, models.Event.message_id,\n-                     models.EventType.desc, models.Event.raw).distinct().all():\n+                     models.EventType.desc, models.Event.raw).all():\n                 event_list[id_] \u003d api_models.Event(message_id, desc,\n                                                    generated, [], raw)\n             # Query all traits related to events.","commit_id":"a9637a18c8db03578d16914c9200c235cfb78a08"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"e917886601673c1349ec7dff84e45c4d3f0480af","unresolved":false,"context_lines":[{"line_number":282,"context_line":"                    _event_list.extend(q.add_columns(models.Event.generated,"},{"line_number":283,"context_line":"                                                     models.Event.message_id,"},{"line_number":284,"context_line":"                                                     models.EventType.desc,"},{"line_number":285,"context_line":"                                                     models.Event.raw).all())"},{"line_number":286,"context_line":"                event_list \u003d {}"},{"line_number":287,"context_line":"                for e in sorted(_event_list,"},{"line_number":288,"context_line":"                                key\u003dlambda e: e.generated)[:limit]:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba15a1d1_8111e7ae","line":285,"in_reply_to":"ba15a1d1_293819d3","updated":"2015-09-15 02:09:24.000000000","message":"yes, this looks more reasonable:), and has been tested OK!","commit_id":"a9637a18c8db03578d16914c9200c235cfb78a08"}]}
