)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"31e4777ff9929397280ce406f4a120c0f4d1dbc3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Victor Sergeyev \u003cvsergeyev@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-06-13 15:09:07 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fixed coluns list in indexes."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Migration 152 change type of `deleted` column from Boolean to table.id.type"},{"line_number":10,"context_line":"for all tables. Also (as side effect) this migration removed column `deleted`"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAPX%2F%2Fpwk%3D","line":7,"updated":"2013-06-13 12:58:16.000000000","message":"\"columns\" is misspelled.","commit_id":"22f1cffd7b2ce1277a76a2e377eb9057e46982e8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"4395d82ec87693db3f50cd1e7801c56f50100629","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Victor Sergeyev \u003cvsergeyev@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-06-13 15:09:07 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fixed coluns list in indexes."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Migration 152 change type of `deleted` column from Boolean to table.id.type"},{"line_number":10,"context_line":"for all tables. Also (as side effect) this migration removed column `deleted`"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAPX%2F%2Fpq8%3D","line":7,"in_reply_to":"AAAAPX%2F%2Fpwk%3D","updated":"2013-06-13 13:35:22.000000000","message":"Done","commit_id":"22f1cffd7b2ce1277a76a2e377eb9057e46982e8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"31e4777ff9929397280ce406f4a120c0f4d1dbc3","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fixed coluns list in indexes."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Migration 152 change type of `deleted` column from Boolean to table.id.type"},{"line_number":10,"context_line":"for all tables. Also (as side effect) this migration removed column `deleted`"},{"line_number":11,"context_line":"from indexes. Current migration returns this column to indexes."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAPX%2F%2Fpwc%3D","line":9,"updated":"2013-06-13 12:58:16.000000000","message":"s/change/changed the/","commit_id":"22f1cffd7b2ce1277a76a2e377eb9057e46982e8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"4395d82ec87693db3f50cd1e7801c56f50100629","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fixed coluns list in indexes."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Migration 152 change type of `deleted` column from Boolean to table.id.type"},{"line_number":10,"context_line":"for all tables. Also (as side effect) this migration removed column `deleted`"},{"line_number":11,"context_line":"from indexes. Current migration returns this column to indexes."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAPX%2F%2Fpq4%3D","line":9,"in_reply_to":"AAAAPX%2F%2Fpwc%3D","updated":"2013-06-13 13:35:22.000000000","message":"Done","commit_id":"22f1cffd7b2ce1277a76a2e377eb9057e46982e8"}],"nova/db/sqlalchemy/migrate_repo/versions/190_fix_152_migration_indexes.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"dd6b77542fca426312119c02e968c0a9c85d8a20","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    meta \u003d MetaData()"},{"line_number":97,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    for table_name in data:"},{"line_number":100,"context_line":"        table \u003d Table(table_name, meta, autoload\u003dTrue)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        for index_name, columns in data[table_name]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F24g%3D","line":99,"updated":"2013-06-19 17:15:21.000000000","message":"for table_name, datum in data.iteritems() to save the lookup later.","commit_id":"c7db882fbf32061bb865e7a7f913c9fd97d7948d"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"b621dd988f86ed3dfd3cef726f6d099f2127c200","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    meta \u003d MetaData()"},{"line_number":97,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    for table_name in data:"},{"line_number":100,"context_line":"        table \u003d Table(table_name, meta, autoload\u003dTrue)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        for index_name, columns in data[table_name]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F1ac%3D","line":99,"in_reply_to":"AAAAPn%2F%2F24g%3D","updated":"2013-06-20 05:54:10.000000000","message":"agree with David, it will be cleaner. to have\ntable_name, indexes instead of getting data[table_name] at 102 line","commit_id":"c7db882fbf32061bb865e7a7f913c9fd97d7948d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c1c6524ca2b58800a106904af3d53f07d893d368","unresolved":false,"context_lines":[{"line_number":55,"context_line":"}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"# some indexes are missed in sqlite (bug 1191838)"},{"line_number":58,"context_line":"missing_sqlite_indexes \u003d ("},{"line_number":59,"context_line":"    \u0027floating_ips_pool_deleted_fixed_ip_id_project_id_idx\u0027,"},{"line_number":60,"context_line":"    \u0027instance_faults_instance_uuid_deleted_created_at_idx\u0027,"},{"line_number":61,"context_line":"    \u0027certificates_project_id_deleted_idx\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FryE%3D","line":58,"updated":"2013-06-25 10:58:40.000000000","message":"AFAIK, this has little to do with indexes issues caused by migration 152. Consider creating these indexes in a separate patch.","commit_id":"15f15cd6f60ae1a02f72c87363bad1f08d775bd8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"afd642b1d8998c6e655ba07119513a61714a64bb","unresolved":false,"context_lines":[{"line_number":55,"context_line":"}"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"# some indexes are missed in sqlite (bug 1191838)"},{"line_number":58,"context_line":"missing_sqlite_indexes \u003d ("},{"line_number":59,"context_line":"    \u0027floating_ips_pool_deleted_fixed_ip_id_project_id_idx\u0027,"},{"line_number":60,"context_line":"    \u0027instance_faults_instance_uuid_deleted_created_at_idx\u0027,"},{"line_number":61,"context_line":"    \u0027certificates_project_id_deleted_idx\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FrCY%3D","line":58,"in_reply_to":"AAAAPn%2F%2FryE%3D","updated":"2013-06-27 07:25:05.000000000","message":"Done","commit_id":"15f15cd6f60ae1a02f72c87363bad1f08d775bd8"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c1c6524ca2b58800a106904af3d53f07d893d368","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    index \u003d Index("},{"line_number":77,"context_line":"        index_name, *[getattr(table.c, col) for col in idx_columns]"},{"line_number":78,"context_line":"    )"},{"line_number":79,"context_line":"    index.create() if upgrade else index.drop()"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def _change_columns(migrate_engine, table, index_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2Fryo%3D","line":79,"updated":"2013-06-25 10:58:40.000000000","message":"nit: I would rather you used if/else statements rather than inline if/else expression.\n\nif/else expression (as well as list comprehensions) is an entity from functional programming world. Calling functions with side effects here can confuse people reading the code.","commit_id":"15f15cd6f60ae1a02f72c87363bad1f08d775bd8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"afd642b1d8998c6e655ba07119513a61714a64bb","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    index \u003d Index("},{"line_number":77,"context_line":"        index_name, *[getattr(table.c, col) for col in idx_columns]"},{"line_number":78,"context_line":"    )"},{"line_number":79,"context_line":"    index.create() if upgrade else index.drop()"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def _change_columns(migrate_engine, table, index_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FrCM%3D","line":79,"in_reply_to":"AAAAPn%2F%2Fryo%3D","updated":"2013-06-27 07:25:05.000000000","message":"Done","commit_id":"15f15cd6f60ae1a02f72c87363bad1f08d775bd8"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"d7d8ff5916ef4f841d03c2f17d162f0c16a01504","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from sqlalchemy import Index, MetaData, Table"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"data \u003d {"},{"line_number":22,"context_line":"    # table_name: ((index_name_1, (*old_columns), (*new_columns)), ...)"},{"line_number":23,"context_line":"    \"certificates\": ("},{"line_number":24,"context_line":"        (\"certificates_project_id_deleted_idx\","}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FkSY%3D","line":21,"updated":"2013-06-27 16:55:47.000000000","message":"instead of defining a hard to understand set of tupples, can you make dictionaries or something so it\u0027s easier to review?","commit_id":"aaa08afcd0f97c24f91b4e01cc16b03b48f1c0eb"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c495bd5c898f1601c16327b489d696fb3398679a","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def _add_new_index(migrate_engine, table, index_name,"},{"line_number":71,"context_line":"                   new_columns, old_columns, upgrade):"},{"line_number":72,"context_line":"    idx_columns \u003d new_columns if upgrade else old_columns"},{"line_number":73,"context_line":"    index \u003d Index("},{"line_number":74,"context_line":"        index_name, *[getattr(table.c, col) for col in idx_columns]"},{"line_number":75,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2Flto%3D","line":72,"updated":"2013-06-27 08:19:32.000000000","message":"This is confusing, because we swap columns at line 107 too. Maybe it\u0027s worth to split this method into two (one for dropping of indexes, and another for creation)? It will be more code, but perhaps, the code will be easier to understand","commit_id":"aaa08afcd0f97c24f91b4e01cc16b03b48f1c0eb"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c495bd5c898f1601c16327b489d696fb3398679a","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def _change_columns(migrate_engine, table, index_name,"},{"line_number":83,"context_line":"                    new_columns, old_columns, upgrade):"},{"line_number":84,"context_line":"    Index("},{"line_number":85,"context_line":"        index_name,"},{"line_number":86,"context_line":"        *[getattr(table.c, col) for col in old_columns]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2Flus%3D","line":83,"updated":"2013-06-27 08:19:32.000000000","message":"nit: upgrade argument seems to be unused here","commit_id":"aaa08afcd0f97c24f91b4e01cc16b03b48f1c0eb"}],"nova/tests/db/test_migrations.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"dd6b77542fca426312119c02e968c0a9c85d8a20","unresolved":false,"context_lines":[{"line_number":1715,"context_line":"            ),"},{"line_number":1716,"context_line":"        }"},{"line_number":1717,"context_line":""},{"line_number":1718,"context_line":"        for table_name in test_data.keys():"},{"line_number":1719,"context_line":"            meta \u003d sqlalchemy.MetaData()"},{"line_number":1720,"context_line":"            meta.bind \u003d engine"},{"line_number":1721,"context_line":"            table \u003d sqlalchemy.Table(table_name, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F24s%3D","line":1718,"updated":"2013-06-19 17:15:21.000000000","message":"for table_name, indexes in test_data.iteritems()\n\nand then for index in indexes\n\nSaves creating a list and an extra dict lookup.","commit_id":"c7db882fbf32061bb865e7a7f913c9fd97d7948d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c1c6524ca2b58800a106904af3d53f07d893d368","unresolved":false,"context_lines":[{"line_number":1720,"context_line":"            meta.bind \u003d engine"},{"line_number":1721,"context_line":"            table \u003d sqlalchemy.Table(table_name, meta, autoload\u003dTrue)"},{"line_number":1722,"context_line":""},{"line_number":1723,"context_line":"            index_data \u003d [(idx.name, set(idx.columns.keys()))"},{"line_number":1724,"context_line":"                          for idx in table.indexes]"},{"line_number":1725,"context_line":""},{"line_number":1726,"context_line":"            for name, columns in indexes:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2Frxw%3D","line":1723,"updated":"2013-06-25 10:58:40.000000000","message":"The order of columns in index definition does matter. Consider using of tuples/lists instead of sets here.","commit_id":"15f15cd6f60ae1a02f72c87363bad1f08d775bd8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"afd642b1d8998c6e655ba07119513a61714a64bb","unresolved":false,"context_lines":[{"line_number":1720,"context_line":"            meta.bind \u003d engine"},{"line_number":1721,"context_line":"            table \u003d sqlalchemy.Table(table_name, meta, autoload\u003dTrue)"},{"line_number":1722,"context_line":""},{"line_number":1723,"context_line":"            index_data \u003d [(idx.name, set(idx.columns.keys()))"},{"line_number":1724,"context_line":"                          for idx in table.indexes]"},{"line_number":1725,"context_line":""},{"line_number":1726,"context_line":"            for name, columns in indexes:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FrBk%3D","line":1723,"in_reply_to":"AAAAPn%2F%2Frxw%3D","updated":"2013-06-27 07:25:05.000000000","message":"Fixed in mysql.","commit_id":"15f15cd6f60ae1a02f72c87363bad1f08d775bd8"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c1c6524ca2b58800a106904af3d53f07d893d368","unresolved":false,"context_lines":[{"line_number":1724,"context_line":"                          for idx in table.indexes]"},{"line_number":1725,"context_line":""},{"line_number":1726,"context_line":"            for name, columns in indexes:"},{"line_number":1727,"context_line":"                self.assertIn((name, set(columns)), index_data)"},{"line_number":1728,"context_line":""},{"line_number":1729,"context_line":""},{"line_number":1730,"context_line":"class TestBaremetalMigrations(BaseMigrationTestCase, CommonTestsMixIn):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2Frxs%3D","line":1727,"updated":"2013-06-25 10:58:40.000000000","message":"ditto","commit_id":"15f15cd6f60ae1a02f72c87363bad1f08d775bd8"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"afd642b1d8998c6e655ba07119513a61714a64bb","unresolved":false,"context_lines":[{"line_number":1724,"context_line":"                          for idx in table.indexes]"},{"line_number":1725,"context_line":""},{"line_number":1726,"context_line":"            for name, columns in indexes:"},{"line_number":1727,"context_line":"                self.assertIn((name, set(columns)), index_data)"},{"line_number":1728,"context_line":""},{"line_number":1729,"context_line":""},{"line_number":1730,"context_line":"class TestBaremetalMigrations(BaseMigrationTestCase, CommonTestsMixIn):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FrBg%3D","line":1727,"in_reply_to":"AAAAPn%2F%2Frxs%3D","updated":"2013-06-27 07:25:05.000000000","message":"Done","commit_id":"15f15cd6f60ae1a02f72c87363bad1f08d775bd8"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c495bd5c898f1601c16327b489d696fb3398679a","unresolved":false,"context_lines":[{"line_number":1728,"context_line":""},{"line_number":1729,"context_line":"            for name, columns in indexes:"},{"line_number":1730,"context_line":"                if engine.name \u003d\u003d \"postgresql\":"},{"line_number":1731,"context_line":"                    # we can not get correct order of columns in index"},{"line_number":1732,"context_line":"                    # definition to postgresql using sqlalchemy. So we sortind"},{"line_number":1733,"context_line":"                    # columns list before compare"},{"line_number":1734,"context_line":"                    self.assertIn("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FloQ%3D","line":1731,"updated":"2013-06-27 08:19:32.000000000","message":"nit: you could provide a link to SQLAlchemy bug here (http://www.sqlalchemy.org/trac/ticket/2767)","commit_id":"aaa08afcd0f97c24f91b4e01cc16b03b48f1c0eb"}]}
