)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c0225f930399000728ade9e37a32bf8c4c7e40fb","unresolved":false,"context_lines":[{"line_number":15,"context_line":"are already covered by UniqueConstraints, for the rest, new indexes have"},{"line_number":16,"context_line":"been created."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Some tables that were deprecated in Pike: cgsnapshots, consistencygroups"},{"line_number":19,"context_line":"therefore indexes referring to ids on those tables were not added (3"},{"line_number":20,"context_line":"indexes). This yields a total of 21 indexes being added."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Closes-Bug: #1666547"},{"line_number":23,"context_line":"Change-Id: I1437c3a1aa13142ee7a7e3e7bf9ff867b9d72652"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"5ff73747_3537a4b3","line":20,"range":{"start_line":18,"start_character":0,"end_line":20,"end_character":56},"updated":"2017-04-24 16:05:24.000000000","message":"You have added indexes for cgsnapshots and consistencygroups back in patch set 11 to avoid the unit test errors?  So this paragraph should be removed.\n\nI\u0027m fine for adding them now.  We can remove them when the cg tables are removed.","commit_id":"89532758904330fe83b1e3de6c61d9889c933603"}],"cinder/db/sqlalchemy/migrate_repo/versions/098_add_foreign_key_indexes.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"d88a15f0b440d44d701a91fc8368396ce9e1ec5a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":33,"context_line":"    for table_name, indexes in INDEXES_TO_CREATE.items():"},{"line_number":34,"context_line":"        for index_name, columns in indexes.items():"},{"line_number":35,"context_line":"            ensure_indexed(migrate_engine, table_name, index_name, columns)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"INDEXES_TO_CREATE \u003d {"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_429f3303","line":35,"range":{"start_line":35,"start_character":0,"end_line":35,"end_character":75},"updated":"2017-03-07 16:24:28.000000000","message":"I suspect you should actually only be doing these if the engine is in fact psql or sqlite?\n\nAlso should this be esure_index_exists vs ensure_indexed?","commit_id":"35b20f25ff1a4833aa93835f8cd0247dbab63ddb"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"aadb1d3ee62a035712cd98cc1a2e4d27f9440db9","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":33,"context_line":"    for table_name, indexes in INDEXES_TO_CREATE.items():"},{"line_number":34,"context_line":"        for index_name, columns in indexes.items():"},{"line_number":35,"context_line":"            ensure_indexed(migrate_engine, table_name, index_name, columns)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"INDEXES_TO_CREATE \u003d {"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_909b08c9","line":35,"range":{"start_line":35,"start_character":0,"end_line":35,"end_character":75},"in_reply_to":"9a30ddce_429f3303","updated":"2017-03-08 12:09:25.000000000","message":"I think it should be done regardless of the DB, as it is being done here, since the call to `index_exists_on_columns` will detect that mysql already has the index.","commit_id":"35b20f25ff1a4833aa93835f8cd0247dbab63ddb"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"d88a15f0b440d44d701a91fc8368396ce9e1ec5a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            ensure_indexed(migrate_engine, table_name, index_name, columns)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"INDEXES_TO_CREATE \u003d {"},{"line_number":39,"context_line":"    \u0027attachment_specs\u0027: {"},{"line_number":40,"context_line":"        \u0027attachment_specs_attachment_id_idx\u0027: ("},{"line_number":41,"context_line":"            \u0027attachment_id\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_0231bb0b","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":21},"updated":"2017-03-07 16:24:28.000000000","message":"Might be cleaner to move this to a list of tuples then you can get rid of the double loop","commit_id":"35b20f25ff1a4833aa93835f8cd0247dbab63ddb"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"aadb1d3ee62a035712cd98cc1a2e4d27f9440db9","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            ensure_indexed(migrate_engine, table_name, index_name, columns)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"INDEXES_TO_CREATE \u003d {"},{"line_number":39,"context_line":"    \u0027attachment_specs\u0027: {"},{"line_number":40,"context_line":"        \u0027attachment_specs_attachment_id_idx\u0027: ("},{"line_number":41,"context_line":"            \u0027attachment_id\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_904dc874","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":21},"in_reply_to":"9a30ddce_0231bb0b","updated":"2017-03-08 12:09:25.000000000","message":"+1  it will also be clearer to read, but I think this is a nit.","commit_id":"35b20f25ff1a4833aa93835f8cd0247dbab63ddb"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"07e84f48e867d4e2435c60a57588835c8749b658","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def ensure_index_exists(migrate_engine, table_name, column):"},{"line_number":23,"context_line":"    index_name \u003d \u0027_\u0027.join([table_name, column, \u0027idx\u0027])"},{"line_number":24,"context_line":"    columns \u003d [column]"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    if utils.index_exists_on_columns(migrate_engine, table_name, columns):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a30ddce_7870a40b","line":23,"updated":"2017-03-13 11:40:28.000000000","message":"nit: it\u0027s easier to read:\n\n index_name \u003d table_name + \u0027_\u0027 + column + \u0027_idx\u0027","commit_id":"820951ebfbc4f756dd2dab2368ccd915ae866d17"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2d2b91b960c4723c65529023fe095ebb28011c81","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"INDEXES_TO_CREATE \u003d ("},{"line_number":41,"context_line":"    (\u0027attachment_specs\u0027, \u0027attachment_id\u0027),"},{"line_number":42,"context_line":"    (\u0027cgsnapshots\u0027, \u0027consistencygroup_id\u0027),"},{"line_number":43,"context_line":"    (\u0027group_snapshots\u0027, \u0027group_id\u0027),"},{"line_number":44,"context_line":"    (\u0027group_type_specs\u0027, \u0027group_type_id\u0027),"},{"line_number":45,"context_line":"    (\u0027group_volume_type_mapping\u0027, \u0027group_id\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"bff0334d_c546bac0","line":42,"range":{"start_line":42,"start_character":5,"end_line":42,"end_character":41},"updated":"2017-04-12 16:55:34.000000000","message":"These should not be added any more.  In Pike, the cgsnapshots and consistencygroups tables will be empty.  Users are forced to migrate data from those old tables to the new groups and group_snapshots tables.  So there is no need to add indexes for cgsnapshots and consistencygroups any more.","commit_id":"2a7e845cf250aadb53f6f67acd0ed8d5c95dbd68"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2d2b91b960c4723c65529023fe095ebb28011c81","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    (\u0027reservations\u0027, \u0027allocated_id\u0027),"},{"line_number":49,"context_line":"    (\u0027reservations\u0027, \u0027usage_id\u0027),"},{"line_number":50,"context_line":"    (\u0027snapshot_metadata\u0027, \u0027snapshot_id\u0027),"},{"line_number":51,"context_line":"    (\u0027snapshots\u0027, \u0027cgsnapshot_id\u0027),"},{"line_number":52,"context_line":"    (\u0027snapshots\u0027, \u0027group_snapshot_id\u0027),"},{"line_number":53,"context_line":"    (\u0027snapshots\u0027, \u0027volume_id\u0027),"},{"line_number":54,"context_line":"    (\u0027transfers\u0027, \u0027volume_id\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"bff0334d_052a62d9","line":51,"range":{"start_line":51,"start_character":4,"end_line":51,"end_character":35},"updated":"2017-04-12 16:55:34.000000000","message":"Not needed.","commit_id":"2a7e845cf250aadb53f6f67acd0ed8d5c95dbd68"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"2d2b91b960c4723c65529023fe095ebb28011c81","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    (\u0027volume_metadata\u0027, \u0027volume_id\u0027),"},{"line_number":60,"context_line":"    (\u0027volume_type_extra_specs\u0027, \u0027volume_type_id\u0027),"},{"line_number":61,"context_line":"    (\u0027volume_types\u0027, \u0027qos_specs_id\u0027),"},{"line_number":62,"context_line":"    (\u0027volumes\u0027, \u0027consistencygroup_id\u0027),"},{"line_number":63,"context_line":"    (\u0027volumes\u0027, \u0027group_id\u0027),"},{"line_number":64,"context_line":"    (\u0027workers\u0027, \u0027service_id\u0027),"},{"line_number":65,"context_line":")"}],"source_content_type":"text/x-python","patch_set":8,"id":"bff0334d_857b12f3","line":62,"range":{"start_line":62,"start_character":3,"end_line":62,"end_character":39},"updated":"2017-04-12 16:55:34.000000000","message":"Not needed.","commit_id":"2a7e845cf250aadb53f6f67acd0ed8d5c95dbd68"}],"cinder/tests/unit/test_migrations.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"07e84f48e867d4e2435c60a57588835c8749b658","unresolved":false,"context_lines":[{"line_number":1102,"context_line":"    def assert_each_foreign_key_is_part_of_an_index(self):"},{"line_number":1103,"context_line":"        engine \u003d self.migrate_engine"},{"line_number":1104,"context_line":""},{"line_number":1105,"context_line":"        # Skip the test for SQLite because SQLite does not list"},{"line_number":1106,"context_line":"        # UniqueConstraints as indexes, which makes this test fail."},{"line_number":1107,"context_line":"        # Given that SQLite is only for testing purposes, we skip this check."},{"line_number":1108,"context_line":"        if engine.dialect.name \u003d\u003d \u0027sqlite\u0027:"},{"line_number":1109,"context_line":"            return"},{"line_number":1110,"context_line":""},{"line_number":1111,"context_line":"        non_indexed_foreign_keys \u003d set()"},{"line_number":1112,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a30ddce_33080f28","line":1109,"range":{"start_line":1105,"start_character":0,"end_line":1109,"end_character":18},"updated":"2017-03-13 11:40:28.000000000","message":"-1: then why don\u0027t we just override the method in ``TestSqliteMigrations`` as:\n\n def assert_each_foreign_key_is_part_of_an_index(self):\n     pass","commit_id":"820951ebfbc4f756dd2dab2368ccd915ae866d17"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"07e84f48e867d4e2435c60a57588835c8749b658","unresolved":false,"context_lines":[{"line_number":1115,"context_line":"            foreign_key_columns \u003d get_foreign_key_columns(engine, table_name)"},{"line_number":1116,"context_line":"            for column_name in foreign_key_columns - indexed_columns:"},{"line_number":1117,"context_line":"                non_indexed_foreign_keys.add("},{"line_number":1118,"context_line":"                    \u0027{table_name}.{column_name}\u0027.format("},{"line_number":1119,"context_line":"                        table_name\u003dtable_name,"},{"line_number":1120,"context_line":"                        column_name\u003dcolumn_name"},{"line_number":1121,"context_line":"                    )"},{"line_number":1122,"context_line":"                )"},{"line_number":1123,"context_line":""},{"line_number":1124,"context_line":"        self.assertEqual(set(), non_indexed_foreign_keys)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a30ddce_f39d97bc","line":1121,"range":{"start_line":1118,"start_character":0,"end_line":1121,"end_character":21},"updated":"2017-03-13 11:40:28.000000000","message":"nit:\n\n table_name + \u0027.\u0027 + column_name","commit_id":"820951ebfbc4f756dd2dab2368ccd915ae866d17"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"07e84f48e867d4e2435c60a57588835c8749b658","unresolved":false,"context_lines":[{"line_number":1121,"context_line":"                    )"},{"line_number":1122,"context_line":"                )"},{"line_number":1123,"context_line":""},{"line_number":1124,"context_line":"        self.assertEqual(set(), non_indexed_foreign_keys)"},{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":"    def test_walk_versions(self):"},{"line_number":1127,"context_line":"        self.walk_versions(False, False)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a30ddce_f384b75e","line":1124,"range":{"start_line":1124,"start_character":13,"end_line":1124,"end_character":24},"updated":"2017-03-13 11:40:28.000000000","message":"nit: assertSetEqual","commit_id":"820951ebfbc4f756dd2dab2368ccd915ae866d17"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"07e84f48e867d4e2435c60a57588835c8749b658","unresolved":false,"context_lines":[{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":"    def test_walk_versions(self):"},{"line_number":1127,"context_line":"        self.walk_versions(False, False)"},{"line_number":1128,"context_line":"        self.assertEqual("},{"line_number":1129,"context_line":"            self.REPOSITORY.latest,"},{"line_number":1130,"context_line":"            self.migration_api.db_version("},{"line_number":1131,"context_line":"                self.migrate_engine,"},{"line_number":1132,"context_line":"                self.REPOSITORY"},{"line_number":1133,"context_line":"            )"},{"line_number":1134,"context_line":"        )"},{"line_number":1135,"context_line":"        self.assert_each_foreign_key_is_part_of_an_index()"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a30ddce_583da0db","line":1134,"range":{"start_line":1128,"start_character":0,"end_line":1134,"end_character":9},"updated":"2017-03-13 11:40:28.000000000","message":"nit: I don\u0027t think this is necessary","commit_id":"820951ebfbc4f756dd2dab2368ccd915ae866d17"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"07e84f48e867d4e2435c60a57588835c8749b658","unresolved":false,"context_lines":[{"line_number":1175,"context_line":"    TIME_TYPE \u003d sqlalchemy.types.TIMESTAMP"},{"line_number":1176,"context_line":""},{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"def get_foreign_key_columns(engine, table_name):"},{"line_number":1179,"context_line":"    foreign_keys \u003d set()"},{"line_number":1180,"context_line":"    table \u003d db_utils.get_table(engine, table_name)"},{"line_number":1181,"context_line":"    inspector \u003d reflection.Inspector.from_engine(engine)"},{"line_number":1182,"context_line":"    for column_dict in inspector.get_columns(table_name):"},{"line_number":1183,"context_line":"        column_name \u003d column_dict[\u0027name\u0027]"},{"line_number":1184,"context_line":"        column \u003d getattr(table.c, column_name)"},{"line_number":1185,"context_line":"        if column.foreign_keys:"},{"line_number":1186,"context_line":"            foreign_keys.add(column_name)"},{"line_number":1187,"context_line":"    return foreign_keys"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":""},{"line_number":1190,"context_line":"def get_indexed_columns(engine, table_name):"},{"line_number":1191,"context_line":"    indexed_columns \u003d set()"},{"line_number":1192,"context_line":"    for index in db_utils.get_indexes(engine, table_name):"},{"line_number":1193,"context_line":"        for column_name in index[\u0027column_names\u0027]:"},{"line_number":1194,"context_line":"            indexed_columns.add(column_name)"},{"line_number":1195,"context_line":"    return indexed_columns"},{"line_number":1196,"context_line":""},{"line_number":1197,"context_line":""},{"line_number":1198,"context_line":"def get_table_names(engine):"},{"line_number":1199,"context_line":"    inspector \u003d reflection.Inspector.from_engine(engine)"},{"line_number":1200,"context_line":"    return inspector.get_table_names()"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a30ddce_53f583ea","line":1200,"range":{"start_line":1178,"start_character":0,"end_line":1200,"end_character":38},"updated":"2017-03-13 11:40:28.000000000","message":"-1: These look awesome!!  But they should go in the MigrationsMixin class.","commit_id":"820951ebfbc4f756dd2dab2368ccd915ae866d17"}]}
