)]}'
{"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"e290f8f2fb874f74a4ea9b2c48c2d923cbb5c202","unresolved":false,"context_lines":[{"line_number":2216,"context_line":"            filter_dict[key] \u003d value"},{"line_number":2217,"context_line":""},{"line_number":2218,"context_line":"    # Apply simple exact matches"},{"line_number":2219,"context_line":"    if filter_dict:"},{"line_number":2220,"context_line":"        query \u003d query.filter(*[getattr(models.Instance, k) \u003d\u003d v for"},{"line_number":2221,"context_line":"                               k, v in filter_dict.items()])"},{"line_number":2222,"context_line":"    return query"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba8a016a_ea878b10","line":2219,"updated":"2015-11-16 11:03:38.000000000","message":"Good catch! \n\nChecked the docs\n\nhttp://docs.sqlalchemy.org/en/rel_1_0/orm/query.html#sqlalchemy.orm.query.Query.filter_by\n\nand filter() seems to be a better choice for complex queries with joins","commit_id":"af08996bde868a6f1aa5e56b84c56c203a50f70c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"e290f8f2fb874f74a4ea9b2c48c2d923cbb5c202","unresolved":false,"context_lines":[{"line_number":2217,"context_line":""},{"line_number":2218,"context_line":"    # Apply simple exact matches"},{"line_number":2219,"context_line":"    if filter_dict:"},{"line_number":2220,"context_line":"        query \u003d query.filter(*[getattr(models.Instance, k) \u003d\u003d v for"},{"line_number":2221,"context_line":"                               k, v in filter_dict.items()])"},{"line_number":2222,"context_line":"    return query"},{"line_number":2223,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba8a016a_79861bbb","line":2220,"updated":"2015-11-16 11:03:38.000000000","message":"nit: I\u0027d rather have this formatted like\n\nquery \u003d query.filter(*[getattr(models.Instance, k) \u003d\u003d v\n                     for k, v in filter_dict.items()])\n\nbut it does not really matter","commit_id":"af08996bde868a6f1aa5e56b84c56c203a50f70c"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"540833e678c7a7fefeb1e1f2d4f8873a50e91301","unresolved":false,"context_lines":[{"line_number":2222,"context_line":"    # Apply simple exact matches"},{"line_number":2223,"context_line":"    if filter_dict:"},{"line_number":2224,"context_line":"        query \u003d query.filter(*[getattr(models.Instance, k) \u003d\u003d v"},{"line_number":2225,"context_line":"                               for k, v in filter_dict.items()])"},{"line_number":2226,"context_line":"    return query"},{"line_number":2227,"context_line":""},{"line_number":2228,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3a7e1126_5fb85fc8","line":2225,"updated":"2015-12-18 12:55:33.000000000","message":"this is a dense enough piece of function it should probably be turned into a dedicated method. It also feels like we should error if the filter is wrong because typos could slip through. Being defensive here is good.","commit_id":"35fb3a6a77a20352700b287d87e99836f5418c2d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c8f0e10528b39bde6ad34dbea2c561ca6007f3d5","unresolved":false,"context_lines":[{"line_number":2222,"context_line":"    # Apply simple exact matches"},{"line_number":2223,"context_line":"    if filter_dict:"},{"line_number":2224,"context_line":"        query \u003d query.filter(*[getattr(models.Instance, k) \u003d\u003d v"},{"line_number":2225,"context_line":"                               for k, v in filter_dict.items()])"},{"line_number":2226,"context_line":"    return query"},{"line_number":2227,"context_line":""},{"line_number":2228,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa69d971_37ae91e6","line":2225,"in_reply_to":"3a7e1126_5fb85fc8","updated":"2016-01-06 15:28:49.000000000","message":"I believe, it\u0027s fine: one will get an AttributeError in case of a typo, and this is probable something we would raise, if we decided to add an explicit check here and define a list of allowed values of a filter.","commit_id":"35fb3a6a77a20352700b287d87e99836f5418c2d"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"3c337d114f842e861282f165f7ea0e78572b4cef","unresolved":false,"context_lines":[{"line_number":2222,"context_line":"    # Apply simple exact matches"},{"line_number":2223,"context_line":"    if filter_dict:"},{"line_number":2224,"context_line":"        query \u003d query.filter(*[getattr(models.Instance, k) \u003d\u003d v"},{"line_number":2225,"context_line":"                               for k, v in filter_dict.items()])"},{"line_number":2226,"context_line":"    return query"},{"line_number":2227,"context_line":""},{"line_number":2228,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3a7e1126_967b0c8c","line":2225,"in_reply_to":"3a7e1126_5fb85fc8","updated":"2015-12-18 14:10:40.000000000","message":"What typos? Keys in filter_dict are legal because they taken from \"legal_keys\". These keys are hardcoded in line 2039. Or you mean typos in values?\n\nAnd what part of code do you want to move to the separate method? creating query with these filters?","commit_id":"35fb3a6a77a20352700b287d87e99836f5418c2d"}],"nova/tests/unit/db/test_db_api.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"e290f8f2fb874f74a4ea9b2c48c2d923cbb5c202","unresolved":false,"context_lines":[{"line_number":2516,"context_line":"        db.instance_tag_set(context2, inst3.uuid, [t1, t2, t3, t4])"},{"line_number":2517,"context_line":""},{"line_number":2518,"context_line":"        result \u003d db.instance_get_all_by_filters(self.ctxt,"},{"line_number":2519,"context_line":"                                                {\u0027tag\u0027: [t1, t2],"},{"line_number":2520,"context_line":"                                                 \u0027tag-any\u0027: [t3, t4],"},{"line_number":2521,"context_line":"                                                 \u0027project_id\u0027: \u0027p1\u0027})"},{"line_number":2522,"context_line":"        self._assertEqualListsOfObjects([inst2], result,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba8a016a_5fce9784","line":2519,"updated":"2015-11-16 11:03:38.000000000","message":"Do tag and tag-any filters make sense together? This looks a bit confusing, still, inst2 seems to be a correct return value for tag and tag-any combined with AND boolean function","commit_id":"af08996bde868a6f1aa5e56b84c56c203a50f70c"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"cc23409186e01535c3a78ea66beea8dab2029f43","unresolved":false,"context_lines":[{"line_number":2516,"context_line":"        db.instance_tag_set(context2, inst3.uuid, [t1, t2, t3, t4])"},{"line_number":2517,"context_line":""},{"line_number":2518,"context_line":"        result \u003d db.instance_get_all_by_filters(self.ctxt,"},{"line_number":2519,"context_line":"                                                {\u0027tag\u0027: [t1, t2],"},{"line_number":2520,"context_line":"                                                 \u0027tag-any\u0027: [t3, t4],"},{"line_number":2521,"context_line":"                                                 \u0027project_id\u0027: \u0027p1\u0027})"},{"line_number":2522,"context_line":"        self._assertEqualListsOfObjects([inst2], result,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba8a016a_57f99b4c","line":2519,"in_reply_to":"ba8a016a_5fce9784","updated":"2015-11-16 11:57:40.000000000","message":"Combination of tag and tag-any filters is possible:\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/mitaka/approved/tag-instances.html#rest-api-impact","commit_id":"af08996bde868a6f1aa5e56b84c56c203a50f70c"}]}
