)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"7fd579c6e1665b4d3894333a42725eaaa7d1bce4","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[Mongodb] Implement events on Mongodb and DB2"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In this change events are written into database (Mongodb, DB2) and retrieve"},{"line_number":10,"context_line":"it."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"For this purpose were implemented several methods:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1ae5cdf2_95a7540b","line":9,"updated":"2014-06-23 08:52:34.000000000","message":"Probably I miss the meaning, but I guess you wanted to write \"... and retrieved from it\"","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"9e3107b4b5c93ddfb64da94b709b0033cb125308","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[Mongodb] Implement events on Mongodb and DB2"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In this change events are written into database (Mongodb, DB2) and retrieve"},{"line_number":10,"context_line":"it."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"For this purpose were implemented several methods:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1ae5cdf2_e7f2ade2","line":9,"in_reply_to":"1ae5cdf2_95a7540b","updated":"2014-06-23 10:37:13.000000000","message":"Done","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"7fd579c6e1665b4d3894333a42725eaaa7d1bce4","unresolved":false,"context_lines":[{"line_number":9,"context_line":"In this change events are written into database (Mongodb, DB2) and retrieve"},{"line_number":10,"context_line":"it."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"For this purpose were implemented several methods:"},{"line_number":13,"context_line":"1. record_events --- store events into databases"},{"line_number":14,"context_line":"2. get_events, get_event_types, get_trait_types and get_traits --- get data"},{"line_number":15,"context_line":"from db."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1ae5cdf2_554f8c6a","line":12,"updated":"2014-06-23 08:52:34.000000000","message":"Word order, please:\n\n\"Several methods were implemented for this purpose.\"","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"9e3107b4b5c93ddfb64da94b709b0033cb125308","unresolved":false,"context_lines":[{"line_number":9,"context_line":"In this change events are written into database (Mongodb, DB2) and retrieve"},{"line_number":10,"context_line":"it."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"For this purpose were implemented several methods:"},{"line_number":13,"context_line":"1. record_events --- store events into databases"},{"line_number":14,"context_line":"2. get_events, get_event_types, get_trait_types and get_traits --- get data"},{"line_number":15,"context_line":"from db."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1ae5cdf2_8723a957","line":12,"in_reply_to":"1ae5cdf2_554f8c6a","updated":"2014-06-23 10:37:13.000000000","message":"Done","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"7fd579c6e1665b4d3894333a42725eaaa7d1bce4","unresolved":false,"context_lines":[{"line_number":10,"context_line":"it."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"For this purpose were implemented several methods:"},{"line_number":13,"context_line":"1. record_events --- store events into databases"},{"line_number":14,"context_line":"2. get_events, get_event_types, get_trait_types and get_traits --- get data"},{"line_number":15,"context_line":"from db."},{"line_number":16,"context_line":"Add some attendant changes."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1ae5cdf2_357f606b","line":13,"updated":"2014-06-23 08:52:34.000000000","message":"\u0027database\u0027 will look better as at one moment there is used only one of them, actually","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"9e3107b4b5c93ddfb64da94b709b0033cb125308","unresolved":false,"context_lines":[{"line_number":10,"context_line":"it."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"For this purpose were implemented several methods:"},{"line_number":13,"context_line":"1. record_events --- store events into databases"},{"line_number":14,"context_line":"2. get_events, get_event_types, get_trait_types and get_traits --- get data"},{"line_number":15,"context_line":"from db."},{"line_number":16,"context_line":"Add some attendant changes."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1ae5cdf2_c71cd117","line":13,"in_reply_to":"1ae5cdf2_357f606b","updated":"2014-06-23 10:37:13.000000000","message":"Done","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"}],"ceilometer/storage/mongo/utils.py":[{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"7fd579c6e1665b4d3894333a42725eaaa7d1bce4","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                    # we need to check if they are in the query or no."},{"line_number":94,"context_line":"                    if k \u003d\u003d \u0027key\u0027:"},{"line_number":95,"context_line":"                        dict_query.setdefault(\u0027trait_name\u0027, v)"},{"line_number":96,"context_line":"                    elif (k \u003d\u003d \u0027string\u0027 or k \u003d\u003d \u0027integer\u0027 or k \u003d\u003d \u0027datetime\u0027"},{"line_number":97,"context_line":"                          or k \u003d\u003d \u0027float\u0027):"},{"line_number":98,"context_line":"                        dict_query.setdefault(\u0027trait_type\u0027, DTYPE_NAMES[k])"},{"line_number":99,"context_line":"                        if op \u003d\u003d \u0027eq\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_d5d63c53","line":96,"range":{"start_line":96,"start_character":20,"end_line":96,"end_character":24},"updated":"2014-06-23 08:52:34.000000000","message":"elif k in [\u0027string\u0027, \u0027integer\u0027, \u0027datetime\u0027, \u0027float\u0027] will look clearer","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"9e3107b4b5c93ddfb64da94b709b0033cb125308","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                    # we need to check if they are in the query or no."},{"line_number":94,"context_line":"                    if k \u003d\u003d \u0027key\u0027:"},{"line_number":95,"context_line":"                        dict_query.setdefault(\u0027trait_name\u0027, v)"},{"line_number":96,"context_line":"                    elif (k \u003d\u003d \u0027string\u0027 or k \u003d\u003d \u0027integer\u0027 or k \u003d\u003d \u0027datetime\u0027"},{"line_number":97,"context_line":"                          or k \u003d\u003d \u0027float\u0027):"},{"line_number":98,"context_line":"                        dict_query.setdefault(\u0027trait_type\u0027, DTYPE_NAMES[k])"},{"line_number":99,"context_line":"                        if op \u003d\u003d \u0027eq\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_c4212fb7","line":96,"in_reply_to":"1ae5cdf2_d5d63c53","updated":"2014-06-23 10:37:13.000000000","message":"Done","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"7fd579c6e1665b4d3894333a42725eaaa7d1bce4","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                    elif (k \u003d\u003d \u0027string\u0027 or k \u003d\u003d \u0027integer\u0027 or k \u003d\u003d \u0027datetime\u0027"},{"line_number":97,"context_line":"                          or k \u003d\u003d \u0027float\u0027):"},{"line_number":98,"context_line":"                        dict_query.setdefault(\u0027trait_type\u0027, DTYPE_NAMES[k])"},{"line_number":99,"context_line":"                        if op \u003d\u003d \u0027eq\u0027:"},{"line_number":100,"context_line":"                            dict_query.setdefault(\u0027trait_value\u0027, v)"},{"line_number":101,"context_line":"                        else:"},{"line_number":102,"context_line":"                            dict_query.setdefault(\u0027trait_value\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_95ccb4bd","line":99,"updated":"2014-06-23 08:52:34.000000000","message":"are you sure this if should be processed in the \u0027elif ...\u0027 section? I\u0027m not sure, so please correct me if I\u0027m wrong here :)","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"1c22e3f5e8856b715ab0ae82932694f10db0377b","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                    elif (k \u003d\u003d \u0027string\u0027 or k \u003d\u003d \u0027integer\u0027 or k \u003d\u003d \u0027datetime\u0027"},{"line_number":97,"context_line":"                          or k \u003d\u003d \u0027float\u0027):"},{"line_number":98,"context_line":"                        dict_query.setdefault(\u0027trait_type\u0027, DTYPE_NAMES[k])"},{"line_number":99,"context_line":"                        if op \u003d\u003d \u0027eq\u0027:"},{"line_number":100,"context_line":"                            dict_query.setdefault(\u0027trait_value\u0027, v)"},{"line_number":101,"context_line":"                        else:"},{"line_number":102,"context_line":"                            dict_query.setdefault(\u0027trait_value\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_ade4ffe0","line":99,"in_reply_to":"1ae5cdf2_870f2939","updated":"2014-06-23 13:41:25.000000000","message":"Oh, thanks for the clarification!","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"9e3107b4b5c93ddfb64da94b709b0033cb125308","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                    elif (k \u003d\u003d \u0027string\u0027 or k \u003d\u003d \u0027integer\u0027 or k \u003d\u003d \u0027datetime\u0027"},{"line_number":97,"context_line":"                          or k \u003d\u003d \u0027float\u0027):"},{"line_number":98,"context_line":"                        dict_query.setdefault(\u0027trait_type\u0027, DTYPE_NAMES[k])"},{"line_number":99,"context_line":"                        if op \u003d\u003d \u0027eq\u0027:"},{"line_number":100,"context_line":"                            dict_query.setdefault(\u0027trait_value\u0027, v)"},{"line_number":101,"context_line":"                        else:"},{"line_number":102,"context_line":"                            dict_query.setdefault(\u0027trait_value\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_870f2939","line":99,"in_reply_to":"1ae5cdf2_95ccb4bd","updated":"2014-06-23 10:37:13.000000000","message":"Yep, I am sure. Here we work with the pair key-value and if key is in [\u0027string\u0027, ...], we continue work with the value to construct the query.","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"35163d23204bf2a5412edf2831ad0c2926d11c72","unresolved":false,"context_lines":[{"line_number":36,"context_line":"cfg.CONF.import_opt(\u0027retry_interval\u0027, \u0027ceilometer.openstack.common.db.options\u0027,"},{"line_number":37,"context_line":"                    group\u003d\"database\")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"DTYPE_NAMES \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027float\u0027: 3, \u0027datetime\u0027: 4}"},{"line_number":40,"context_line":"OP_SIGN \u003d {\u0027lt\u0027: \u0027$lt\u0027, \u0027le\u0027: \u0027$lte\u0027, \u0027ne\u0027: \u0027$ne\u0027, \u0027gt\u0027: \u0027$gt\u0027, \u0027ge\u0027: \u0027$gte\u0027}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_df020f09","line":39,"updated":"2014-07-06 16:48:02.000000000","message":"Is the purpose of storing DTYPE_NAME instead of the literal value purely to save storage space?\n\nShould it be named to make the relevance to events traits explicit? (e.g. EVENT_TRAIT_TYPES)","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4953466964dec6f33e556bbfa14badab412aaaf9","unresolved":false,"context_lines":[{"line_number":36,"context_line":"cfg.CONF.import_opt(\u0027retry_interval\u0027, \u0027ceilometer.openstack.common.db.options\u0027,"},{"line_number":37,"context_line":"                    group\u003d\"database\")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"DTYPE_NAMES \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027float\u0027: 3, \u0027datetime\u0027: 4}"},{"line_number":40,"context_line":"OP_SIGN \u003d {\u0027lt\u0027: \u0027$lt\u0027, \u0027le\u0027: \u0027$lte\u0027, \u0027ne\u0027: \u0027$ne\u0027, \u0027gt\u0027: \u0027$gt\u0027, \u0027ge\u0027: \u0027$gte\u0027}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_4b5c774b","line":39,"in_reply_to":"baada198_df020f09","updated":"2014-07-07 12:02:14.000000000","message":"yep! I think you mentioned the right purpose of storing DTYPE_NAME.\n\nAnd I agree that it should be named in explicit way. \n\nIt is done in next patch.","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"35163d23204bf2a5412edf2831ad0c2926d11c72","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                    group\u003d\"database\")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"DTYPE_NAMES \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027float\u0027: 3, \u0027datetime\u0027: 4}"},{"line_number":40,"context_line":"OP_SIGN \u003d {\u0027lt\u0027: \u0027$lt\u0027, \u0027le\u0027: \u0027$lte\u0027, \u0027ne\u0027: \u0027$ne\u0027, \u0027gt\u0027: \u0027$gt\u0027, \u0027ge\u0027: \u0027$gte\u0027}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def make_timestamp_range(start, end,"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_a4055215","line":40,"updated":"2014-07-06 16:48:02.000000000","message":"We already have a similar mapping in the complex query logic:\n\n  https://github.com/openstack/ceilometer/blob/master/ceilometer/storage/mongo/utils.py#L158\n\nexcept in that case mapping from say \u0027\u003e\u003d\u0027 instead of \u0027gte\u0027.\n\nWould it make sense to use a common representation for this through the API?","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"583b9c63d5cc03a9ec8ac621bfec8290b9153eb3","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                    group\u003d\"database\")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"DTYPE_NAMES \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027float\u0027: 3, \u0027datetime\u0027: 4}"},{"line_number":40,"context_line":"OP_SIGN \u003d {\u0027lt\u0027: \u0027$lt\u0027, \u0027le\u0027: \u0027$lte\u0027, \u0027ne\u0027: \u0027$ne\u0027, \u0027gt\u0027: \u0027$gt\u0027, \u0027ge\u0027: \u0027$gte\u0027}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def make_timestamp_range(start, end,"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_4cb96dca","line":40,"in_reply_to":"baada198_3ce5c708","updated":"2014-07-10 10:04:17.000000000","message":"Yeah, thinking about this some more I think we\u0027re stuck with the inconsistency between the forms of operator used in the complex query and the events API, for backward compatability reasons.\n\nHowever, it would still be good to factor out the common code as you say. A subsequent patch is fine for that.","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4953466964dec6f33e556bbfa14badab412aaaf9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                    group\u003d\"database\")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"DTYPE_NAMES \u003d {\u0027none\u0027: 0, \u0027string\u0027: 1, \u0027integer\u0027: 2, \u0027float\u0027: 3, \u0027datetime\u0027: 4}"},{"line_number":40,"context_line":"OP_SIGN \u003d {\u0027lt\u0027: \u0027$lt\u0027, \u0027le\u0027: \u0027$lte\u0027, \u0027ne\u0027: \u0027$ne\u0027, \u0027gt\u0027: \u0027$gt\u0027, \u0027ge\u0027: \u0027$gte\u0027}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def make_timestamp_range(start, end,"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_3ce5c708","line":40,"in_reply_to":"baada198_a4055215","updated":"2014-07-07 12:02:14.000000000","message":"Yes we have. But here we have to do another mapping because of trait filter request:\nhttps://github.com/openstack/ceilometer/blob/master/ceilometer/storage/__init__.py#L135\n\nFrom my point of view it could be done in a common way, but it probably should be another patch with changes in trait filters operations request, and simultaneously make it common representation in other backends. What do you think about it?","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"35163d23204bf2a5412edf2831ad0c2926d11c72","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                            dict_query.setdefault(\u0027trait_value\u0027, v)"},{"line_number":100,"context_line":"                        else:"},{"line_number":101,"context_line":"                            dict_query.setdefault(\u0027trait_value\u0027,"},{"line_number":102,"context_line":"                                                  {OP_SIGN[op]: v})"},{"line_number":103,"context_line":"            dict_query \u003d {\u0027$elemMatch\u0027: dict_query}"},{"line_number":104,"context_line":"            if q[\u0027traits\u0027] is None:"},{"line_number":105,"context_line":"                q[\u0027traits\u0027] \u003d dict_query"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_44155647","line":102,"updated":"2014-07-06 16:48:02.000000000","message":"Clearer as:\n\n  dict_query.setdefault(\u0027trait_value\u0027,\n                        v if op \u003d\u003d \u0027eq\u0027 else {OP_SIGN[op]: v})","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4953466964dec6f33e556bbfa14badab412aaaf9","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                            dict_query.setdefault(\u0027trait_value\u0027, v)"},{"line_number":100,"context_line":"                        else:"},{"line_number":101,"context_line":"                            dict_query.setdefault(\u0027trait_value\u0027,"},{"line_number":102,"context_line":"                                                  {OP_SIGN[op]: v})"},{"line_number":103,"context_line":"            dict_query \u003d {\u0027$elemMatch\u0027: dict_query}"},{"line_number":104,"context_line":"            if q[\u0027traits\u0027] is None:"},{"line_number":105,"context_line":"                q[\u0027traits\u0027] \u003d dict_query"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_5cac3b8c","line":102,"in_reply_to":"baada198_44155647","updated":"2014-07-07 12:02:14.000000000","message":"Done","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"0f9766b9de2580f7ea5fd3efc2e7aafc378e77c8","unresolved":false,"context_lines":[{"line_number":70,"context_line":"def make_events_query_from_filter(event_filter):"},{"line_number":71,"context_line":"    \"\"\"Return start and stop row for filtering and a query."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    Query is based on the selected parameter."},{"line_number":74,"context_line":"    :param event_filter: storage.EventFilter object."},{"line_number":75,"context_line":"    \"\"\""},{"line_number":76,"context_line":"    q \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_6bfd0db1","line":73,"updated":"2014-07-11 08:22:09.000000000","message":"An empty line is needed before \u0027:param...\u0027","commit_id":"969acb20bd75708f931d1aa7b2d09997c0684269"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"3d1f2500e7b604c5010392311575b463d9ae875a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"def make_events_query_from_filter(event_filter):"},{"line_number":71,"context_line":"    \"\"\"Return start and stop row for filtering and a query."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    Query is based on the selected parameter."},{"line_number":74,"context_line":"    :param event_filter: storage.EventFilter object."},{"line_number":75,"context_line":"    \"\"\""},{"line_number":76,"context_line":"    q \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_ae9bb316","line":73,"in_reply_to":"baada198_6bfd0db1","updated":"2014-07-15 10:43:42.000000000","message":"Done","commit_id":"969acb20bd75708f931d1aa7b2d09997c0684269"}],"ceilometer/storage/pymongo_base.py":[{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"f312e995178e817a7d9112e677e54c0cca963a10","unresolved":false,"context_lines":[{"line_number":240,"context_line":"            if event_model.traits:"},{"line_number":241,"context_line":"                for trait in event_model.traits:"},{"line_number":242,"context_line":"                    traits.append({\u0027trait_name\u0027: trait.name,"},{"line_number":243,"context_line":"                                  \u0027trait_type\u0027: trait.dtype,"},{"line_number":244,"context_line":"                                  \u0027trait_value\u0027: trait.value})"},{"line_number":245,"context_line":"            try:"},{"line_number":246,"context_line":"                self.db.event.insert("}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_670ce793","line":243,"updated":"2014-06-23 04:14:09.000000000","message":"nit: the align seems not right. Not sure if it is gerrit\u0027s prblem. And why pep8 succeed?","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"7fd579c6e1665b4d3894333a42725eaaa7d1bce4","unresolved":false,"context_lines":[{"line_number":240,"context_line":"            if event_model.traits:"},{"line_number":241,"context_line":"                for trait in event_model.traits:"},{"line_number":242,"context_line":"                    traits.append({\u0027trait_name\u0027: trait.name,"},{"line_number":243,"context_line":"                                  \u0027trait_type\u0027: trait.dtype,"},{"line_number":244,"context_line":"                                  \u0027trait_value\u0027: trait.value})"},{"line_number":245,"context_line":"            try:"},{"line_number":246,"context_line":"                self.db.event.insert("}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_f568988a","line":243,"in_reply_to":"1ae5cdf2_670ce793","updated":"2014-06-23 08:52:34.000000000","message":"yes, that\u0027s not the Gerrit issue.... Really dunno why did pep8 was ok, but still... Irog, please, add one more space on the lines 243 and 244/","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"1a1e5792b7b907925b29b8ce8bb683dca75dc30c","unresolved":false,"context_lines":[{"line_number":240,"context_line":"            if event_model.traits:"},{"line_number":241,"context_line":"                for trait in event_model.traits:"},{"line_number":242,"context_line":"                    traits.append({\u0027trait_name\u0027: trait.name,"},{"line_number":243,"context_line":"                                  \u0027trait_type\u0027: trait.dtype,"},{"line_number":244,"context_line":"                                  \u0027trait_value\u0027: trait.value})"},{"line_number":245,"context_line":"            try:"},{"line_number":246,"context_line":"                self.db.event.insert("}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_b0d9be86","line":243,"in_reply_to":"1ae5cdf2_f568988a","updated":"2014-06-23 09:58:05.000000000","message":"Done","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"f312e995178e817a7d9112e677e54c0cca963a10","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                problem_events.append((models.Event.DUPLICATE,"},{"line_number":253,"context_line":"                                       event_model))"},{"line_number":254,"context_line":"            except Exception as ex:"},{"line_number":255,"context_line":"                LOG.exception(_(\"Failed to record event: %s\") % ex)"},{"line_number":256,"context_line":"                problem_events.append((models.Event.UNKNOWN_PROBLEM,"},{"line_number":257,"context_line":"                                       event_model))"},{"line_number":258,"context_line":"        return problem_events"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_476a8bed","line":255,"updated":"2014-06-23 04:14:09.000000000","message":"-1: use gettextutils but not imported","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"1a1e5792b7b907925b29b8ce8bb683dca75dc30c","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                problem_events.append((models.Event.DUPLICATE,"},{"line_number":253,"context_line":"                                       event_model))"},{"line_number":254,"context_line":"            except Exception as ex:"},{"line_number":255,"context_line":"                LOG.exception(_(\"Failed to record event: %s\") % ex)"},{"line_number":256,"context_line":"                problem_events.append((models.Event.UNKNOWN_PROBLEM,"},{"line_number":257,"context_line":"                                       event_model))"},{"line_number":258,"context_line":"        return problem_events"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_90f5a2ef","line":255,"in_reply_to":"1ae5cdf2_476a8bed","updated":"2014-06-23 09:58:05.000000000","message":"Done","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"f312e995178e817a7d9112e677e54c0cca963a10","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                                           event_type\u003devent[\u0027event_type\u0027],"},{"line_number":277,"context_line":"                                           generated\u003devent[\u0027timestamp\u0027],"},{"line_number":278,"context_line":"                                           traits\u003dtraits))"},{"line_number":279,"context_line":"        return res_events"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def get_event_types(self):"},{"line_number":282,"context_line":"        \"\"\"Return all event types as an iterable of strings.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_4780cbbe","line":279,"updated":"2014-06-23 04:14:09.000000000","message":"I think yield may be better, since the res_events has no special process (like sort)","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"1a1e5792b7b907925b29b8ce8bb683dca75dc30c","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                                           event_type\u003devent[\u0027event_type\u0027],"},{"line_number":277,"context_line":"                                           generated\u003devent[\u0027timestamp\u0027],"},{"line_number":278,"context_line":"                                           traits\u003dtraits))"},{"line_number":279,"context_line":"        return res_events"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def get_event_types(self):"},{"line_number":282,"context_line":"        \"\"\"Return all event types as an iterable of strings.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_5514ec9e","line":279,"in_reply_to":"1ae5cdf2_4780cbbe","updated":"2014-06-23 09:58:05.000000000","message":"I think the same, but I rely on SQL implementation of events and tests. \nTests require an iterator (not generator) from get_events.\n\nMay be we need to discuss method get_events and change its implementation in all backends, and improve some tests in tests.storage.test_storage_scenarios","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"f312e995178e817a7d9112e677e54c0cca963a10","unresolved":false,"context_lines":[{"line_number":332,"context_line":"                traits.append(models.Trait(name\u003dtrait[\u0027trait_name\u0027],"},{"line_number":333,"context_line":"                                           dtype\u003dtrait[\u0027trait_type\u0027],"},{"line_number":334,"context_line":"                                           value\u003dtrait[\u0027trait_value\u0027]))"},{"line_number":335,"context_line":"        for trait in sorted(traits, key\u003doperator.attrgetter(\u0027dtype\u0027)):"},{"line_number":336,"context_line":"            yield trait"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def query_samples(self, filter_expr\u003dNone, orderby\u003dNone, limit\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_27f2df6e","line":335,"updated":"2014-06-23 04:14:09.000000000","message":"so the result will be sorted, I\u0027m wondering is this the explicit behavior defined in interface, or not but consistent in all backends? It seems sqla doesn\u0027t sort the result: https://github.com/openstack/ceilometer/blob/master/ceilometer/storage/impl_sqlalchemy.py#L1129","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"1a1e5792b7b907925b29b8ce8bb683dca75dc30c","unresolved":false,"context_lines":[{"line_number":332,"context_line":"                traits.append(models.Trait(name\u003dtrait[\u0027trait_name\u0027],"},{"line_number":333,"context_line":"                                           dtype\u003dtrait[\u0027trait_type\u0027],"},{"line_number":334,"context_line":"                                           value\u003dtrait[\u0027trait_value\u0027]))"},{"line_number":335,"context_line":"        for trait in sorted(traits, key\u003doperator.attrgetter(\u0027dtype\u0027)):"},{"line_number":336,"context_line":"            yield trait"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def query_samples(self, filter_expr\u003dNone, orderby\u003dNone, limit\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ae5cdf2_04a79751","line":335,"in_reply_to":"1ae5cdf2_27f2df6e","updated":"2014-06-23 09:58:05.000000000","message":"It is good question :). Actually you are right, and such behavior is not defined in the interface. But we have to ordered our results because of tests requirements. Tests were written for sqla backend, sqla retrieves data in the  order of storing if other is not defined (in ex. traits are ordered by traits_types). In no-sql backends we have key-value dicts, and have to choose some orders to pass thru tests.\n\nSo I see next steps: we have to discuss this question and separate tests for sql and no-sql backends, or change existed tests in suitable case for both type of backends.\n\nFrom my point of view all additional changes should be done in individual patch.","commit_id":"9b02cf8ebfe760692ca681a4932fe527c248ebf4"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"35163d23204bf2a5412edf2831ad0c2926d11c72","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                problem_events.append((models.Event.DUPLICATE,"},{"line_number":252,"context_line":"                                       event_model))"},{"line_number":253,"context_line":"            except Exception as ex:"},{"line_number":254,"context_line":"                LOG.exception(_(\"Failed to record event: %s\") % ex)"},{"line_number":255,"context_line":"                problem_events.append((models.Event.UNKNOWN_PROBLEM,"},{"line_number":256,"context_line":"                                       event_model))"},{"line_number":257,"context_line":"        return problem_events"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_5f16ff4c","line":254,"updated":"2014-07-06 16:48:02.000000000","message":"Why no similar logging message in the duplicate case, i.e. after line 250?","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4953466964dec6f33e556bbfa14badab412aaaf9","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                problem_events.append((models.Event.DUPLICATE,"},{"line_number":252,"context_line":"                                       event_model))"},{"line_number":253,"context_line":"            except Exception as ex:"},{"line_number":254,"context_line":"                LOG.exception(_(\"Failed to record event: %s\") % ex)"},{"line_number":255,"context_line":"                problem_events.append((models.Event.UNKNOWN_PROBLEM,"},{"line_number":256,"context_line":"                                       event_model))"},{"line_number":257,"context_line":"        return problem_events"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_fc6fcff9","line":254,"in_reply_to":"baada198_5f16ff4c","updated":"2014-07-07 12:02:14.000000000","message":"Good question. Actually I have done implementation of events in MongoDB in the similar way like it was done in SQLAlchemy and HBase. And in SQLAlchemy there is  only one logging message for \u0027Failed recording\u0027. If it is not correct I can improve it in this patch, should I do the same improvements in impl_sqlalchemy and impl_hbase or it should be done in other patch?","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"48807b7f55bb3ff8f8654e794b096d4d5d3645c1","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                problem_events.append((models.Event.DUPLICATE,"},{"line_number":252,"context_line":"                                       event_model))"},{"line_number":253,"context_line":"            except Exception as ex:"},{"line_number":254,"context_line":"                LOG.exception(_(\"Failed to record event: %s\") % ex)"},{"line_number":255,"context_line":"                problem_events.append((models.Event.UNKNOWN_PROBLEM,"},{"line_number":256,"context_line":"                                       event_model))"},{"line_number":257,"context_line":"        return problem_events"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_f9903e98","line":254,"in_reply_to":"baada198_ac712979","updated":"2014-07-15 10:43:35.000000000","message":"Ok! I have registered a bug https://bugs.launchpad.net/ceilometer/+bug/1339626 to improve events in all backends in the way we have discussed here and in IRC","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"583b9c63d5cc03a9ec8ac621bfec8290b9153eb3","unresolved":false,"context_lines":[{"line_number":251,"context_line":"                problem_events.append((models.Event.DUPLICATE,"},{"line_number":252,"context_line":"                                       event_model))"},{"line_number":253,"context_line":"            except Exception as ex:"},{"line_number":254,"context_line":"                LOG.exception(_(\"Failed to record event: %s\") % ex)"},{"line_number":255,"context_line":"                problem_events.append((models.Event.UNKNOWN_PROBLEM,"},{"line_number":256,"context_line":"                                       event_model))"},{"line_number":257,"context_line":"        return problem_events"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_ac712979","line":254,"in_reply_to":"baada198_fc6fcff9","updated":"2014-07-10 10:04:17.000000000","message":"OK, yeah, punt the change to sqla and hbase to another patch.","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"35163d23204bf2a5412edf2831ad0c2926d11c72","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        q \u003d pymongo_utils.make_events_query_from_filter(event_filter)"},{"line_number":266,"context_line":"        res_events \u003d []"},{"line_number":267,"context_line":"        events \u003d self.db.event.find(q)"},{"line_number":268,"context_line":"        for event in events:"},{"line_number":269,"context_line":"            traits \u003d []"},{"line_number":270,"context_line":"            for trait in event[\u0027traits\u0027]:"},{"line_number":271,"context_line":"                traits.append(models.Trait(name\u003dtrait[\u0027trait_name\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_3f230ba8","line":268,"updated":"2014-07-06 16:48:02.000000000","message":"Clearer as:\n\n  for event in self.db.event.find(q)","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4953466964dec6f33e556bbfa14badab412aaaf9","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        q \u003d pymongo_utils.make_events_query_from_filter(event_filter)"},{"line_number":266,"context_line":"        res_events \u003d []"},{"line_number":267,"context_line":"        events \u003d self.db.event.find(q)"},{"line_number":268,"context_line":"        for event in events:"},{"line_number":269,"context_line":"            traits \u003d []"},{"line_number":270,"context_line":"            for trait in event[\u0027traits\u0027]:"},{"line_number":271,"context_line":"                traits.append(models.Trait(name\u003dtrait[\u0027trait_name\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_9c4df39c","line":268,"in_reply_to":"baada198_3f230ba8","updated":"2014-07-07 12:02:14.000000000","message":"Done","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"35163d23204bf2a5412edf2831ad0c2926d11c72","unresolved":false,"context_lines":[{"line_number":271,"context_line":"                traits.append(models.Trait(name\u003dtrait[\u0027trait_name\u0027],"},{"line_number":272,"context_line":"                                           dtype\u003dint(trait[\u0027trait_type\u0027]),"},{"line_number":273,"context_line":"                                           value\u003dtrait[\u0027trait_value\u0027]))"},{"line_number":274,"context_line":"            res_events.append(models.Event(message_id\u003devent[\u0027_id\u0027],"},{"line_number":275,"context_line":"                                           event_type\u003devent[\u0027event_type\u0027],"},{"line_number":276,"context_line":"                                           generated\u003devent[\u0027timestamp\u0027],"},{"line_number":277,"context_line":"                                           traits\u003dtraits))"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_5f3d1fc3","line":274,"updated":"2014-07-06 16:48:02.000000000","message":"Should we be yielding here so that queries returning large numbers of events can be handled in generator-style?\n\ni.e. lines 274-277 become:\n\n  yield models.Event(message_id\u003devent[\u0027_id\u0027],\n                     event_type\u003devent[\u0027event_type\u0027],\n                     generated\u003devent[\u0027timestamp\u0027],\n                     traits\u003dtraits)\n\nand remove the references to res_events.","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4953466964dec6f33e556bbfa14badab412aaaf9","unresolved":false,"context_lines":[{"line_number":271,"context_line":"                traits.append(models.Trait(name\u003dtrait[\u0027trait_name\u0027],"},{"line_number":272,"context_line":"                                           dtype\u003dint(trait[\u0027trait_type\u0027]),"},{"line_number":273,"context_line":"                                           value\u003dtrait[\u0027trait_value\u0027]))"},{"line_number":274,"context_line":"            res_events.append(models.Event(message_id\u003devent[\u0027_id\u0027],"},{"line_number":275,"context_line":"                                           event_type\u003devent[\u0027event_type\u0027],"},{"line_number":276,"context_line":"                                           generated\u003devent[\u0027timestamp\u0027],"},{"line_number":277,"context_line":"                                           traits\u003dtraits))"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_979eacb7","line":274,"in_reply_to":"baada198_5f3d1fc3","updated":"2014-07-07 12:02:14.000000000","message":"Yes, you are right. Actually the same question was already raised by ZhiQiang Fan for patch 1, and the answer was: \n\n\"I think the same, but I rely on SQL implementation of events and tests. Tests require an iterator (not generator) from get_events.\n\nMay be we need to discuss method get_events and change its implementation in all backends, and improve some tests in tests.storage.test_storage_scenarios\"\n\nSo it seems that one more fix patch will be needed to improve this method. What do you think?","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"583b9c63d5cc03a9ec8ac621bfec8290b9153eb3","unresolved":false,"context_lines":[{"line_number":271,"context_line":"                traits.append(models.Trait(name\u003dtrait[\u0027trait_name\u0027],"},{"line_number":272,"context_line":"                                           dtype\u003dint(trait[\u0027trait_type\u0027]),"},{"line_number":273,"context_line":"                                           value\u003dtrait[\u0027trait_value\u0027]))"},{"line_number":274,"context_line":"            res_events.append(models.Event(message_id\u003devent[\u0027_id\u0027],"},{"line_number":275,"context_line":"                                           event_type\u003devent[\u0027event_type\u0027],"},{"line_number":276,"context_line":"                                           generated\u003devent[\u0027timestamp\u0027],"},{"line_number":277,"context_line":"                                           traits\u003dtraits))"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_ec196123","line":274,"in_reply_to":"baada198_979eacb7","updated":"2014-07-10 10:04:17.000000000","message":"Could the get_events call in the scenario test not simply be wrapped in a list comprehension or some such approach?","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"48807b7f55bb3ff8f8654e794b096d4d5d3645c1","unresolved":false,"context_lines":[{"line_number":271,"context_line":"                traits.append(models.Trait(name\u003dtrait[\u0027trait_name\u0027],"},{"line_number":272,"context_line":"                                           dtype\u003dint(trait[\u0027trait_type\u0027]),"},{"line_number":273,"context_line":"                                           value\u003dtrait[\u0027trait_value\u0027]))"},{"line_number":274,"context_line":"            res_events.append(models.Event(message_id\u003devent[\u0027_id\u0027],"},{"line_number":275,"context_line":"                                           event_type\u003devent[\u0027event_type\u0027],"},{"line_number":276,"context_line":"                                           generated\u003devent[\u0027timestamp\u0027],"},{"line_number":277,"context_line":"                                           traits\u003dtraits))"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_39ec76f3","line":274,"in_reply_to":"baada198_ec196123","updated":"2014-07-15 10:43:35.000000000","message":"I think it could! So I will try to improve in new patch for bug https://bugs.launchpad.net/ceilometer/+bug/1339626.","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"35163d23204bf2a5412edf2831ad0c2926d11c72","unresolved":false,"context_lines":[{"line_number":333,"context_line":"                traits.append(models.Trait(name\u003dtrait[\u0027trait_name\u0027],"},{"line_number":334,"context_line":"                                           dtype\u003dtrait[\u0027trait_type\u0027],"},{"line_number":335,"context_line":"                                           value\u003dtrait[\u0027trait_value\u0027]))"},{"line_number":336,"context_line":"        for trait in sorted(traits, key\u003doperator.attrgetter(\u0027dtype\u0027)):"},{"line_number":337,"context_line":"            yield trait"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def query_samples(self, filter_expr\u003dNone, orderby\u003dNone, limit\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_df504f0d","line":336,"updated":"2014-07-06 16:48:02.000000000","message":"Is the sorting really required here? (... otherwise you could simply yield directly from line 333)","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4953466964dec6f33e556bbfa14badab412aaaf9","unresolved":false,"context_lines":[{"line_number":333,"context_line":"                traits.append(models.Trait(name\u003dtrait[\u0027trait_name\u0027],"},{"line_number":334,"context_line":"                                           dtype\u003dtrait[\u0027trait_type\u0027],"},{"line_number":335,"context_line":"                                           value\u003dtrait[\u0027trait_value\u0027]))"},{"line_number":336,"context_line":"        for trait in sorted(traits, key\u003doperator.attrgetter(\u0027dtype\u0027)):"},{"line_number":337,"context_line":"            yield trait"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def query_samples(self, filter_expr\u003dNone, orderby\u003dNone, limit\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_f75a88f0","line":336,"in_reply_to":"baada198_df504f0d","updated":"2014-07-07 12:02:14.000000000","message":"The same question was also raised by ZhiQiang Fan in patch 1 discussion. So I will repeat an answer:\n\"It is good question :). Actually you are right, and such behavior is not defined in the interface. But we have to ordered our results because of tests requirements. Tests were written for sqla backend, sqla retrieves data in the order of storing if other is not defined (in ex. traits are ordered by traits_types). In no-sql backends we have key-value dicts, and have to choose some orders to pass thru tests.\n\nSo I see next steps: we have to discuss this question and separate tests for sql and no-sql backends, or change existed tests in suitable case for both type of backends.\n\nFrom my point of view all additional changes should be done in individual patch.\"\n\nWhat do you think?","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"35163d23204bf2a5412edf2831ad0c2926d11c72","unresolved":false,"context_lines":[{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    @classmethod"},{"line_number":422,"context_line":"    def _ensure_encapsulated_rule_format(cls, alarm):"},{"line_number":423,"context_line":"        \"\"\"Ensure the alarm returned by the storage have the correct format."},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        The previous format looks like:"},{"line_number":426,"context_line":"        {"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_ff535314","line":423,"updated":"2014-07-06 16:48:02.000000000","message":"Probably best to split out fixes to unrelated docstrings to a separate patch.","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"4953466964dec6f33e556bbfa14badab412aaaf9","unresolved":false,"context_lines":[{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    @classmethod"},{"line_number":422,"context_line":"    def _ensure_encapsulated_rule_format(cls, alarm):"},{"line_number":423,"context_line":"        \"\"\"Ensure the alarm returned by the storage have the correct format."},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"        The previous format looks like:"},{"line_number":426,"context_line":"        {"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_d7dca448","line":423,"in_reply_to":"baada198_ff535314","updated":"2014-07-07 12:02:14.000000000","message":"Actually this split is already done in patch https://review.openstack.org/#/c/103139/3 and after it will be merged these lines won\u0027t  seem like changes. \nSorry for my hurry. :)","commit_id":"3245f1a9e85ed0733e28489165efc2d60526258a"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"8f8ef5c0856b192ad43ac5a56756b8546baa2f0c","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        \"\"\"Write the events to database."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        :param event_models: a list of models.Event objects."},{"line_number":235,"context_line":"        \"\"\""},{"line_number":236,"context_line":"        problem_events \u003d []"},{"line_number":237,"context_line":"        for event_model in event_models:"},{"line_number":238,"context_line":"            traits \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_c6cb9c48","line":235,"updated":"2014-07-10 09:40:18.000000000","message":"nit: it is better to add a return explanation","commit_id":"21955c861bdc37064ec4ca7e5d4a692ae1b37eb8"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"5fe719f74cf3fe6f2e120b4422ec703d410dca05","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        \"\"\"Write the events to database."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        :param event_models: a list of models.Event objects."},{"line_number":235,"context_line":"        \"\"\""},{"line_number":236,"context_line":"        problem_events \u003d []"},{"line_number":237,"context_line":"        for event_model in event_models:"},{"line_number":238,"context_line":"            traits \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_0c44d5b5","line":235,"in_reply_to":"baada198_c6cb9c48","updated":"2014-07-10 11:08:42.000000000","message":"Done","commit_id":"21955c861bdc37064ec4ca7e5d4a692ae1b37eb8"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"8f8ef5c0856b192ad43ac5a56756b8546baa2f0c","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        return problem_events"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def get_events(self, event_filter):"},{"line_number":260,"context_line":"        \"\"\"Return an iterable of models.Event objects."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"        :param event_filter: storage.EventFilter object, consists of filters"},{"line_number":263,"context_line":"                             for events that are stored in database."}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_c6763c3f","line":260,"updated":"2014-07-10 09:40:18.000000000","message":"nit: \"iterable\"-\u003e\"list\"","commit_id":"21955c861bdc37064ec4ca7e5d4a692ae1b37eb8"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"5fe719f74cf3fe6f2e120b4422ec703d410dca05","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        return problem_events"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def get_events(self, event_filter):"},{"line_number":260,"context_line":"        \"\"\"Return an iterable of models.Event objects."},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"        :param event_filter: storage.EventFilter object, consists of filters"},{"line_number":263,"context_line":"                             for events that are stored in database."}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_8c5d457c","line":260,"in_reply_to":"baada198_c6763c3f","updated":"2014-07-10 11:08:42.000000000","message":"Done","commit_id":"21955c861bdc37064ec4ca7e5d4a692ae1b37eb8"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"8f8ef5c0856b192ad43ac5a56756b8546baa2f0c","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        return res_events"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def get_event_types(self):"},{"line_number":280,"context_line":"        \"\"\"Return all event types as an iterable of strings.\"\"\""},{"line_number":281,"context_line":"        event_types \u003d set()"},{"line_number":282,"context_line":"        events \u003d self.db.event.find()"},{"line_number":283,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_6699f06d","line":280,"updated":"2014-07-10 09:40:18.000000000","message":"nit: iterable-\u003eiter","commit_id":"21955c861bdc37064ec4ca7e5d4a692ae1b37eb8"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"5fe719f74cf3fe6f2e120b4422ec703d410dca05","unresolved":false,"context_lines":[{"line_number":277,"context_line":"        return res_events"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def get_event_types(self):"},{"line_number":280,"context_line":"        \"\"\"Return all event types as an iterable of strings.\"\"\""},{"line_number":281,"context_line":"        event_types \u003d set()"},{"line_number":282,"context_line":"        events \u003d self.db.event.find()"},{"line_number":283,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_cc4e5dc2","line":280,"in_reply_to":"baada198_6699f06d","updated":"2014-07-10 11:08:42.000000000","message":"Done","commit_id":"21955c861bdc37064ec4ca7e5d4a692ae1b37eb8"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"8f8ef5c0856b192ad43ac5a56756b8546baa2f0c","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        event_types \u003d set()"},{"line_number":282,"context_line":"        events \u003d self.db.event.find()"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        for event in events:"},{"line_number":285,"context_line":"            event_type \u003d event[\u0027event_type\u0027]"},{"line_number":286,"context_line":"            if event_type not in event_types:"},{"line_number":287,"context_line":"                event_types.add(event_type)"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_e676e005","line":284,"updated":"2014-07-10 09:40:18.000000000","message":"usually, we may have tens of thousands of events in operation scenario, this process get all events with no filter and traverse them to extract the event type,this may result a heavy time cost. can this process be optimize?","commit_id":"21955c861bdc37064ec4ca7e5d4a692ae1b37eb8"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"5fe719f74cf3fe6f2e120b4422ec703d410dca05","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        event_types \u003d set()"},{"line_number":282,"context_line":"        events \u003d self.db.event.find()"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        for event in events:"},{"line_number":285,"context_line":"            event_type \u003d event[\u0027event_type\u0027]"},{"line_number":286,"context_line":"            if event_type not in event_types:"},{"line_number":287,"context_line":"                event_types.add(event_type)"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_cc1f3d6f","line":284,"in_reply_to":"baada198_e676e005","updated":"2014-07-10 11:08:42.000000000","message":"It would be nice to propose any optimization. But method should return all event types that have been already stored in database, so we need to check event type in all events we have. If you have any idea about this question please feel free to propose it :)","commit_id":"21955c861bdc37064ec4ca7e5d4a692ae1b37eb8"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"8f8ef5c0856b192ad43ac5a56756b8546baa2f0c","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        :param event_type: the type of the Event to filter by"},{"line_number":317,"context_line":"        :param trait_name: the name of the Trait to filter by"},{"line_number":318,"context_line":"        \"\"\""},{"line_number":319,"context_line":"        if trait_name is None:"},{"line_number":320,"context_line":"            events \u003d self.db.event.find({\u0027event_type\u0027: event_type})"},{"line_number":321,"context_line":"        else:"},{"line_number":322,"context_line":"            # We choose events that simultaneously have event_type and certain"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_410856d9","line":319,"updated":"2014-07-10 09:40:18.000000000","message":"maybe it is better to use:\"if not trait_name:\"\nwe\u0027d better expect the trait_name from api layer isn\u0027t \"\" or others null value.","commit_id":"21955c861bdc37064ec4ca7e5d4a692ae1b37eb8"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"5fe719f74cf3fe6f2e120b4422ec703d410dca05","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        :param event_type: the type of the Event to filter by"},{"line_number":317,"context_line":"        :param trait_name: the name of the Trait to filter by"},{"line_number":318,"context_line":"        \"\"\""},{"line_number":319,"context_line":"        if trait_name is None:"},{"line_number":320,"context_line":"            events \u003d self.db.event.find({\u0027event_type\u0027: event_type})"},{"line_number":321,"context_line":"        else:"},{"line_number":322,"context_line":"            # We choose events that simultaneously have event_type and certain"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_0c2a1590","line":319,"in_reply_to":"baada198_410856d9","updated":"2014-07-10 11:08:42.000000000","message":"Done","commit_id":"21955c861bdc37064ec4ca7e5d4a692ae1b37eb8"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"0f9766b9de2580f7ea5fd3efc2e7aafc378e77c8","unresolved":false,"context_lines":[{"line_number":231,"context_line":"    def record_events(self, event_models):"},{"line_number":232,"context_line":"        \"\"\"Write the events to database."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        Return a list of problem events that are duplicated already existing"},{"line_number":235,"context_line":"        events or failed to record in database."},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        :param event_models: a list of models.Event objects."}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_cbc7f996","line":234,"updated":"2014-07-11 08:22:09.000000000","message":"What about writing something like this:\n\nReturn a list of events of type models.Event.DUPLICATE in case of trying to write an already existing event to the database, or models.Event.UNKONW_PROBLEM in case of any failures with recording the event in the database.","commit_id":"969acb20bd75708f931d1aa7b2d09997c0684269"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"3d1f2500e7b604c5010392311575b463d9ae875a","unresolved":false,"context_lines":[{"line_number":231,"context_line":"    def record_events(self, event_models):"},{"line_number":232,"context_line":"        \"\"\"Write the events to database."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        Return a list of problem events that are duplicated already existing"},{"line_number":235,"context_line":"        events or failed to record in database."},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        :param event_models: a list of models.Event objects."}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_ae501333","line":234,"in_reply_to":"baada198_cbc7f996","updated":"2014-07-15 10:43:42.000000000","message":"I like your prop.\n\nDone","commit_id":"969acb20bd75708f931d1aa7b2d09997c0684269"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"0f9766b9de2580f7ea5fd3efc2e7aafc378e77c8","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        return problem_events"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    def get_events(self, event_filter):"},{"line_number":263,"context_line":"        \"\"\"Return an list of models.Event objects."},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        :param event_filter: storage.EventFilter object, consists of filters"},{"line_number":266,"context_line":"                             for events that are stored in database."}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_8b5fc1e4","line":263,"updated":"2014-07-11 08:22:09.000000000","message":"s/an/a/","commit_id":"969acb20bd75708f931d1aa7b2d09997c0684269"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"3d1f2500e7b604c5010392311575b463d9ae875a","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        return problem_events"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    def get_events(self, event_filter):"},{"line_number":263,"context_line":"        \"\"\"Return an list of models.Event objects."},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        :param event_filter: storage.EventFilter object, consists of filters"},{"line_number":266,"context_line":"                             for events that are stored in database."}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_4e2cd7ac","line":263,"in_reply_to":"baada198_8b5fc1e4","updated":"2014-07-15 10:43:42.000000000","message":"Done","commit_id":"969acb20bd75708f931d1aa7b2d09997c0684269"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"0f9766b9de2580f7ea5fd3efc2e7aafc378e77c8","unresolved":false,"context_lines":[{"line_number":293,"context_line":"    def get_trait_types(self, event_type):"},{"line_number":294,"context_line":"        \"\"\"Return a dictionary containing the name and data type of the trait."},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        Only trait types for the provided event_type are returned."},{"line_number":297,"context_line":"        :param event_type: the type of the Event."},{"line_number":298,"context_line":"        \"\"\""},{"line_number":299,"context_line":"        trait_names \u003d set()"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_cb3e198b","line":296,"updated":"2014-07-11 08:22:09.000000000","message":"An empty line is needed before \u0027:param...\u0027","commit_id":"969acb20bd75708f931d1aa7b2d09997c0684269"},{"author":{"_account_id":10987,"name":"Igor Degtiarov","username":"tovstun","inactive":true},"change_message_id":"3d1f2500e7b604c5010392311575b463d9ae875a","unresolved":false,"context_lines":[{"line_number":293,"context_line":"    def get_trait_types(self, event_type):"},{"line_number":294,"context_line":"        \"\"\"Return a dictionary containing the name and data type of the trait."},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        Only trait types for the provided event_type are returned."},{"line_number":297,"context_line":"        :param event_type: the type of the Event."},{"line_number":298,"context_line":"        \"\"\""},{"line_number":299,"context_line":"        trait_names \u003d set()"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_6e299b9a","line":296,"in_reply_to":"baada198_cb3e198b","updated":"2014-07-15 10:43:42.000000000","message":"Done","commit_id":"969acb20bd75708f931d1aa7b2d09997c0684269"},{"author":{"_account_id":3012,"name":"Dina Belova","email":"dbelova@mirantis.com","username":"dbelova"},"change_message_id":"26d601d610ed037962473e3c074aa187baf343f8","unresolved":false,"context_lines":[{"line_number":295,"context_line":"    def get_trait_types(self, event_type):"},{"line_number":296,"context_line":"        \"\"\"Return a dictionary containing the name and data type of the trait."},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"        Only trait types for the provided event_type are returned."},{"line_number":299,"context_line":"        "},{"line_number":300,"context_line":"        :param event_type: the type of the Event."},{"line_number":301,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_11403ea4","line":298,"updated":"2014-07-11 09:05:10.000000000","message":"remove trailing spaces please :)","commit_id":"2e71fd914ff98d5c6dc4e38c25519cfca40fa23b"}]}
