diff options
author | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2016-07-08 17:31:24 +0200 |
---|---|---|
committer | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2016-07-11 19:07:36 +0200 |
commit | fb0566655d40dc4cd95852acc039896e1dc189fa (patch) | |
tree | 77f5553518d7a271311f9119faa3dd0c33f5ab3a /sonar-db | |
parent | 1d9115c677cb97dcb3433916b556d3f63da6de33 (diff) | |
download | sonarqube-fb0566655d40dc4cd95852acc039896e1dc189fa.tar.gz sonarqube-fb0566655d40dc4cd95852acc039896e1dc189fa.zip |
SONAR-7786 compress DUPLICATIONS_INDEX migrations
Diffstat (limited to 'sonar-db')
16 files changed, 127 insertions, 267 deletions
diff --git a/sonar-db/src/main/java/org/sonar/db/version/MigrationStepModule.java b/sonar-db/src/main/java/org/sonar/db/version/MigrationStepModule.java index 72d947d5e85..2c3be5b7f11 100644 --- a/sonar-db/src/main/java/org/sonar/db/version/MigrationStepModule.java +++ b/sonar-db/src/main/java/org/sonar/db/version/MigrationStepModule.java @@ -84,11 +84,10 @@ import org.sonar.db.version.v55.FeedRulesTypes; import org.sonar.db.version.v56.FixLengthOfIssuesMessageOnOracle; import org.sonar.db.version.v56.FixTypeOfRuleTypeOnMysql; import org.sonar.db.version.v60.AddAnalysisUuidColumnToCeActivity; -import org.sonar.db.version.v60.AddAnalysisUuidColumnToDuplicationsIndex; import org.sonar.db.version.v60.AddAnalysisUuidColumnToEvents; import org.sonar.db.version.v60.AddAnalysisUuidColumnToMeasures; import org.sonar.db.version.v60.AddBColumnsToProjects; -import org.sonar.db.version.v60.AddComponentUuidColumnToDuplicationsIndex; +import org.sonar.db.version.v60.AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndex; import org.sonar.db.version.v60.AddComponentUuidColumnToMeasures; import org.sonar.db.version.v60.AddComponentUuidColumnsToSnapshots; import org.sonar.db.version.v60.AddLastUsedColumnToRulesProfiles; @@ -105,8 +104,7 @@ import org.sonar.db.version.v60.CleanOrphanRowsInProjects; import org.sonar.db.version.v60.CleanOrphanRowsInResourceIndex; import org.sonar.db.version.v60.CleanOrphanRowsInSnapshots; import org.sonar.db.version.v60.CleanUsurperRootComponents; -import org.sonar.db.version.v60.DeleteOrphanDuplicationsIndexRowsWithoutAnalysis; -import org.sonar.db.version.v60.DeleteOrphanDuplicationsIndexRowsWithoutComponent; +import org.sonar.db.version.v60.DeleteOrphanDuplicationsIndexRowsWithoutComponentOrAnalysis; import org.sonar.db.version.v60.DeleteOrphanMeasuresWithoutComponent; import org.sonar.db.version.v60.DropIdColumnsFromProjects; import org.sonar.db.version.v60.DropIdColumnsFromResourceIndex; @@ -121,11 +119,10 @@ import org.sonar.db.version.v60.DropTreeColumnsFromSnapshots; import org.sonar.db.version.v60.DropTreesOfSnapshots; import org.sonar.db.version.v60.DropUnusedMeasuresColumns; import org.sonar.db.version.v60.FixProjectUuidOfDeveloperProjects; -import org.sonar.db.version.v60.MakeAnalysisUuidNotNullOnDuplicationsIndex; import org.sonar.db.version.v60.MakeAnalysisUuidNotNullOnEvents; import org.sonar.db.version.v60.MakeAnalysisUuidNotNullOnMeasures; +import org.sonar.db.version.v60.MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndex; import org.sonar.db.version.v60.MakeComponentUuidColumnsNotNullOnSnapshots; -import org.sonar.db.version.v60.MakeComponentUuidNotNullOnDuplicationsIndex; import org.sonar.db.version.v60.MakeComponentUuidNotNullOnMeasures; import org.sonar.db.version.v60.MakeProfileKeyNotNullOnActivities; import org.sonar.db.version.v60.MakeUuidColumnNotNullOnSnapshots; @@ -133,11 +130,10 @@ import org.sonar.db.version.v60.MakeUuidColumnsNotNullOnProjects; import org.sonar.db.version.v60.MakeUuidColumnsNotNullOnResourceIndex; import org.sonar.db.version.v60.MakeUuidPathColumnNotNullOnProjects; import org.sonar.db.version.v60.PopulateAnalysisUuidColumnOnCeActivity; -import org.sonar.db.version.v60.PopulateAnalysisUuidOfDuplicationsIndex; import org.sonar.db.version.v60.PopulateAnalysisUuidOnEvents; import org.sonar.db.version.v60.PopulateAnalysisUuidOnMeasures; +import org.sonar.db.version.v60.PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndex; import org.sonar.db.version.v60.PopulateComponentUuidColumnsOfSnapshots; -import org.sonar.db.version.v60.PopulateComponentUuidOfDuplicationsIndex; import org.sonar.db.version.v60.PopulateComponentUuidOfMeasures; import org.sonar.db.version.v60.PopulateLastUsedColumnOfRulesProfiles; import org.sonar.db.version.v60.PopulateProfileKeyOfActivities; @@ -273,16 +269,10 @@ public class MigrationStepModule extends Module { DropSnapshotIdColumnFromCeActivity.class, // UUID columns of DUPLICATION_INDEX - AddComponentUuidColumnToDuplicationsIndex.class, - PopulateComponentUuidOfDuplicationsIndex.class, - DeleteOrphanDuplicationsIndexRowsWithoutComponent.class, - MakeComponentUuidNotNullOnDuplicationsIndex.class, - - // analysis_uuid in duplications_index - AddAnalysisUuidColumnToDuplicationsIndex.class, - PopulateAnalysisUuidOfDuplicationsIndex.class, - DeleteOrphanDuplicationsIndexRowsWithoutAnalysis.class, - MakeAnalysisUuidNotNullOnDuplicationsIndex.class, + AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndex.class, + PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndex.class, + DeleteOrphanDuplicationsIndexRowsWithoutComponentOrAnalysis.class, + MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndex.class, DropSnapshotIdColumnsFromDuplicationsIndex.class, // EVENTS.ANALYSIS_UUID diff --git a/sonar-db/src/main/java/org/sonar/db/version/v60/AddAnalysisUuidColumnToDuplicationsIndex.java b/sonar-db/src/main/java/org/sonar/db/version/v60/AddAnalysisUuidColumnToDuplicationsIndex.java deleted file mode 100644 index c4c47ef3f6b..00000000000 --- a/sonar-db/src/main/java/org/sonar/db/version/v60/AddAnalysisUuidColumnToDuplicationsIndex.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.db.version.v60; - -import java.sql.SQLException; -import org.sonar.db.Database; -import org.sonar.db.version.AddColumnsBuilder; -import org.sonar.db.version.DdlChange; - -import static org.sonar.db.version.VarcharColumnDef.UUID_VARCHAR_SIZE; -import static org.sonar.db.version.VarcharColumnDef.newVarcharColumnDefBuilder; - -public class AddAnalysisUuidColumnToDuplicationsIndex extends DdlChange { - - private static final String TABLE_DUPLICATIONS_INDEX = "duplications_index"; - - public AddAnalysisUuidColumnToDuplicationsIndex(Database db) { - super(db); - } - - @Override - public void execute(Context context) throws SQLException { - context.execute(new AddColumnsBuilder(getDatabase().getDialect(), TABLE_DUPLICATIONS_INDEX) - .addColumn(newVarcharColumnDefBuilder().setColumnName("analysis_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build()) - .build()); - } - -} diff --git a/sonar-db/src/main/java/org/sonar/db/version/v60/AddComponentUuidColumnToDuplicationsIndex.java b/sonar-db/src/main/java/org/sonar/db/version/v60/AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndex.java index 62c3b757881..f421c1222bd 100644 --- a/sonar-db/src/main/java/org/sonar/db/version/v60/AddComponentUuidColumnToDuplicationsIndex.java +++ b/sonar-db/src/main/java/org/sonar/db/version/v60/AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndex.java @@ -27,11 +27,11 @@ import org.sonar.db.version.DdlChange; import static org.sonar.db.version.VarcharColumnDef.UUID_VARCHAR_SIZE; import static org.sonar.db.version.VarcharColumnDef.newVarcharColumnDefBuilder; -public class AddComponentUuidColumnToDuplicationsIndex extends DdlChange { +public class AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndex extends DdlChange { private static final String TABLE_PUBLICATIONS_INDEX = "duplications_index"; - public AddComponentUuidColumnToDuplicationsIndex(Database db) { + public AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndex(Database db) { super(db); } @@ -39,6 +39,7 @@ public class AddComponentUuidColumnToDuplicationsIndex extends DdlChange { public void execute(Context context) throws SQLException { context.execute(new AddColumnsBuilder(getDatabase().getDialect(), TABLE_PUBLICATIONS_INDEX) .addColumn(newVarcharColumnDefBuilder().setColumnName("component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build()) + .addColumn(newVarcharColumnDefBuilder().setColumnName("analysis_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(true).build()) .build()); } diff --git a/sonar-db/src/main/java/org/sonar/db/version/v60/DeleteOrphanDuplicationsIndexRowsWithoutComponent.java b/sonar-db/src/main/java/org/sonar/db/version/v60/DeleteOrphanDuplicationsIndexRowsWithoutComponent.java deleted file mode 100644 index b04cf1be58f..00000000000 --- a/sonar-db/src/main/java/org/sonar/db/version/v60/DeleteOrphanDuplicationsIndexRowsWithoutComponent.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.db.version.v60; - -import java.sql.SQLException; -import org.sonar.db.Database; -import org.sonar.db.version.BaseDataChange; -import org.sonar.db.version.MassUpdate; - -public class DeleteOrphanDuplicationsIndexRowsWithoutComponent extends BaseDataChange { - - public DeleteOrphanDuplicationsIndexRowsWithoutComponent(Database db) { - super(db); - } - - @Override - public void execute(Context context) throws SQLException { - MassUpdate massUpdate = context.prepareMassUpdate(); - massUpdate.select("SELECT id from duplications_index where component_uuid is null"); - massUpdate.update("DELETE from duplications_index WHERE id=?"); - massUpdate.rowPluralName("resources_index entries"); - massUpdate.execute((row, update) -> { - update.setLong(1, row.getLong(1)); - return true; - }); - } - -} diff --git a/sonar-db/src/main/java/org/sonar/db/version/v60/DeleteOrphanDuplicationsIndexRowsWithoutAnalysis.java b/sonar-db/src/main/java/org/sonar/db/version/v60/DeleteOrphanDuplicationsIndexRowsWithoutComponentOrAnalysis.java index ae7858ce55b..93722082829 100644 --- a/sonar-db/src/main/java/org/sonar/db/version/v60/DeleteOrphanDuplicationsIndexRowsWithoutAnalysis.java +++ b/sonar-db/src/main/java/org/sonar/db/version/v60/DeleteOrphanDuplicationsIndexRowsWithoutComponentOrAnalysis.java @@ -24,18 +24,34 @@ import org.sonar.db.Database; import org.sonar.db.version.BaseDataChange; import org.sonar.db.version.MassUpdate; -public class DeleteOrphanDuplicationsIndexRowsWithoutAnalysis extends BaseDataChange { +public class DeleteOrphanDuplicationsIndexRowsWithoutComponentOrAnalysis extends BaseDataChange { - public DeleteOrphanDuplicationsIndexRowsWithoutAnalysis(Database db) { + public DeleteOrphanDuplicationsIndexRowsWithoutComponentOrAnalysis(Database db) { super(db); } @Override public void execute(Context context) throws SQLException { + deleteRowsWithoutComponentUuid(context); + deleteRowsWithoutAnalysisUuid(context); + } + + private static void deleteRowsWithoutComponentUuid(Context context) throws SQLException { + MassUpdate massUpdate = context.prepareMassUpdate(); + massUpdate.select("SELECT id from duplications_index where component_uuid is null"); + massUpdate.update("DELETE from duplications_index WHERE id=?"); + massUpdate.rowPluralName("duplications index rows without component"); + massUpdate.execute((row, update) -> { + update.setLong(1, row.getLong(1)); + return true; + }); + } + + private static void deleteRowsWithoutAnalysisUuid(Context context) throws SQLException { MassUpdate massUpdate = context.prepareMassUpdate(); massUpdate.select("SELECT distinct project_snapshot_id from duplications_index where analysis_uuid is null"); massUpdate.update("DELETE from duplications_index WHERE project_snapshot_id=?"); - massUpdate.rowPluralName("no analysis duplication index entries"); + massUpdate.rowPluralName("duplications index rows without analysis"); massUpdate.execute((row, update) -> { update.setLong(1, row.getLong(1)); return true; diff --git a/sonar-db/src/main/java/org/sonar/db/version/v60/MakeAnalysisUuidNotNullOnDuplicationsIndex.java b/sonar-db/src/main/java/org/sonar/db/version/v60/MakeAnalysisUuidNotNullOnDuplicationsIndex.java deleted file mode 100644 index 2de7e9615fb..00000000000 --- a/sonar-db/src/main/java/org/sonar/db/version/v60/MakeAnalysisUuidNotNullOnDuplicationsIndex.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.db.version.v60; - -import java.sql.SQLException; -import org.sonar.db.Database; -import org.sonar.db.version.AlterColumnsBuilder; -import org.sonar.db.version.DdlChange; - -import static org.sonar.db.version.VarcharColumnDef.UUID_VARCHAR_SIZE; -import static org.sonar.db.version.VarcharColumnDef.newVarcharColumnDefBuilder; - -public class MakeAnalysisUuidNotNullOnDuplicationsIndex extends DdlChange { - - private static final String TABLE_DUPLICATIONS_INDEX = "duplications_index"; - - public MakeAnalysisUuidNotNullOnDuplicationsIndex(Database db) { - super(db); - } - - @Override - public void execute(Context context) throws SQLException { - context.execute(new AlterColumnsBuilder(getDatabase().getDialect(), TABLE_DUPLICATIONS_INDEX) - .updateColumn(newVarcharColumnDefBuilder().setColumnName("analysis_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build()) - .build()); - } - -} diff --git a/sonar-db/src/main/java/org/sonar/db/version/v60/MakeComponentUuidNotNullOnDuplicationsIndex.java b/sonar-db/src/main/java/org/sonar/db/version/v60/MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndex.java index 6198db90e84..8d486634406 100644 --- a/sonar-db/src/main/java/org/sonar/db/version/v60/MakeComponentUuidNotNullOnDuplicationsIndex.java +++ b/sonar-db/src/main/java/org/sonar/db/version/v60/MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndex.java @@ -27,11 +27,11 @@ import org.sonar.db.version.DdlChange; import static org.sonar.db.version.VarcharColumnDef.UUID_VARCHAR_SIZE; import static org.sonar.db.version.VarcharColumnDef.newVarcharColumnDefBuilder; -public class MakeComponentUuidNotNullOnDuplicationsIndex extends DdlChange { +public class MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndex extends DdlChange { private static final String TABLE_DUPLICATIONS_INDEX = "duplications_index"; - public MakeComponentUuidNotNullOnDuplicationsIndex(Database db) { + public MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndex(Database db) { super(db); } @@ -39,6 +39,7 @@ public class MakeComponentUuidNotNullOnDuplicationsIndex extends DdlChange { public void execute(Context context) throws SQLException { context.execute(new AlterColumnsBuilder(getDatabase().getDialect(), TABLE_DUPLICATIONS_INDEX) .updateColumn(newVarcharColumnDefBuilder().setColumnName("component_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build()) + .updateColumn(newVarcharColumnDefBuilder().setColumnName("analysis_uuid").setLimit(UUID_VARCHAR_SIZE).setIsNullable(false).build()) .build()); } diff --git a/sonar-db/src/main/java/org/sonar/db/version/v60/PopulateAnalysisUuidOfDuplicationsIndex.java b/sonar-db/src/main/java/org/sonar/db/version/v60/PopulateAnalysisUuidOfDuplicationsIndex.java deleted file mode 100644 index e3df430ee9b..00000000000 --- a/sonar-db/src/main/java/org/sonar/db/version/v60/PopulateAnalysisUuidOfDuplicationsIndex.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2016 SonarSource SA - * mailto:contact AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.db.version.v60; - -import java.sql.SQLException; -import org.sonar.db.Database; -import org.sonar.db.version.BaseDataChange; -import org.sonar.db.version.MassUpdate; -import org.sonar.db.version.Select; -import org.sonar.db.version.SqlStatement; - -public class PopulateAnalysisUuidOfDuplicationsIndex extends BaseDataChange { - - public PopulateAnalysisUuidOfDuplicationsIndex(Database db) { - super(db); - } - - @Override - public void execute(Context context) throws SQLException { - MassUpdate massUpdate = context.prepareMassUpdate(); - massUpdate.select("select distinct di.project_snapshot_id, s.uuid from duplications_index di" + - " inner join snapshots s on s.id=di.project_snapshot_id" + - " where di.analysis_uuid is null"); - massUpdate.update("UPDATE duplications_index SET analysis_uuid=? WHERE project_snapshot_id=? and analysis_uuid is null"); - massUpdate.rowPluralName("analysis uuid of duplications_index entries"); - massUpdate.execute(PopulateAnalysisUuidOfDuplicationsIndex::handle); - } - - public static boolean handle(Select.Row row, SqlStatement update) throws SQLException { - long projectSnapshotId = row.getLong(1); - String snapshotUuid = row.getString(2); - - update.setString(1, snapshotUuid); - update.setLong(2, projectSnapshotId); - - return true; - } - -} diff --git a/sonar-db/src/main/java/org/sonar/db/version/v60/PopulateComponentUuidOfDuplicationsIndex.java b/sonar-db/src/main/java/org/sonar/db/version/v60/PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndex.java index a5f433d52a7..dc26fdd1d26 100644 --- a/sonar-db/src/main/java/org/sonar/db/version/v60/PopulateComponentUuidOfDuplicationsIndex.java +++ b/sonar-db/src/main/java/org/sonar/db/version/v60/PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndex.java @@ -26,24 +26,29 @@ import org.sonar.db.version.MassUpdate; import org.sonar.db.version.Select; import org.sonar.db.version.SqlStatement; -public class PopulateComponentUuidOfDuplicationsIndex extends BaseDataChange { +public class PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndex extends BaseDataChange { - public PopulateComponentUuidOfDuplicationsIndex(Database db) { + public PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndex(Database db) { super(db); } @Override public void execute(Context context) throws SQLException { + populateComponentUuid(context); + populateAnalysisUuid(context); + } + + private void populateComponentUuid(Context context) throws SQLException { MassUpdate massUpdate = context.prepareMassUpdate(); massUpdate.select("select distinct di.snapshot_id, s.component_uuid from duplications_index di" + " inner join snapshots s on s.id=di.snapshot_id" + " where di.component_uuid is null"); massUpdate.update("UPDATE duplications_index SET component_uuid=? WHERE snapshot_id=? and component_uuid is null"); massUpdate.rowPluralName("component uuid of duplications_index entries"); - massUpdate.execute(PopulateComponentUuidOfDuplicationsIndex::handle); + massUpdate.execute(PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndex::handleComponentUuid); } - public static boolean handle(Select.Row row, SqlStatement update) throws SQLException { + private static boolean handleComponentUuid(Select.Row row, SqlStatement update) throws SQLException { long snapshotId = row.getLong(1); String componentUuid = row.getString(2); @@ -52,5 +57,25 @@ public class PopulateComponentUuidOfDuplicationsIndex extends BaseDataChange { return true; } + + public void populateAnalysisUuid(Context context) throws SQLException { + MassUpdate massUpdate = context.prepareMassUpdate(); + massUpdate.select("select distinct di.project_snapshot_id, s.uuid from duplications_index di" + + " inner join snapshots s on s.id=di.project_snapshot_id" + + " where di.analysis_uuid is null"); + massUpdate.update("UPDATE duplications_index SET analysis_uuid=? WHERE project_snapshot_id=? and analysis_uuid is null"); + massUpdate.rowPluralName("analysis uuid of duplications_index entries"); + massUpdate.execute(PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndex::handleAnalysisUuid); + } + + private static boolean handleAnalysisUuid(Select.Row row, SqlStatement update) throws SQLException { + long projectSnapshotId = row.getLong(1); + String snapshotUuid = row.getString(2); + + update.setString(1, snapshotUuid); + update.setLong(2, projectSnapshotId); + + return true; + } } diff --git a/sonar-db/src/test/java/org/sonar/db/version/MigrationStepModuleTest.java b/sonar-db/src/test/java/org/sonar/db/version/MigrationStepModuleTest.java index cd190a68543..b10eba51a6f 100644 --- a/sonar-db/src/test/java/org/sonar/db/version/MigrationStepModuleTest.java +++ b/sonar-db/src/test/java/org/sonar/db/version/MigrationStepModuleTest.java @@ -29,6 +29,6 @@ public class MigrationStepModuleTest { public void verify_count_of_added_MigrationStep_types() { ComponentContainer container = new ComponentContainer(); new MigrationStepModule().configure(container); - assertThat(container.size()).isEqualTo(129); + assertThat(container.size()).isEqualTo(125); } } diff --git a/sonar-db/src/test/java/org/sonar/db/version/v60/AddComponentUuidColumnToDuplicationsIndexTest.java b/sonar-db/src/test/java/org/sonar/db/version/v60/AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndexTest.java index 4ba3a6551d9..fa75f76a520 100644 --- a/sonar-db/src/test/java/org/sonar/db/version/v60/AddComponentUuidColumnToDuplicationsIndexTest.java +++ b/sonar-db/src/test/java/org/sonar/db/version/v60/AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndexTest.java @@ -19,8 +19,6 @@ */ package org.sonar.db.version.v60; -import static java.lang.String.valueOf; - import java.sql.SQLException; import java.sql.Types; import org.junit.Rule; @@ -29,17 +27,19 @@ import org.junit.rules.ExpectedException; import org.sonar.api.utils.System2; import org.sonar.db.DbTester; -public class AddComponentUuidColumnToDuplicationsIndexTest { +import static java.lang.String.valueOf; + +public class AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndexTest { private static final String TABLE = "duplications_index"; @Rule - public DbTester db = DbTester.createForSchema(System2.INSTANCE, AddComponentUuidColumnToDuplicationsIndexTest.class, + public DbTester db = DbTester.createForSchema(System2.INSTANCE, AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndexTest.class, "duplications_index_5.6.sql"); @Rule public ExpectedException expectedException = ExpectedException.none(); - private AddComponentUuidColumnToDuplicationsIndex underTest = new AddComponentUuidColumnToDuplicationsIndex(db.database()); + private AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndex underTest = new AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndex(db.database()); @Test public void migration_adds_column_to_empty_table() throws SQLException { @@ -79,6 +79,7 @@ public class AddComponentUuidColumnToDuplicationsIndexTest { private void verifyAddedColumns() { db.assertColumnDefinition(TABLE, "component_uuid", Types.VARCHAR, 50, true); + db.assertColumnDefinition(TABLE, "analysis_uuid", Types.VARCHAR, 50, true); } } diff --git a/sonar-db/src/test/java/org/sonar/db/version/v60/MakeComponentUuidNotNullOnDuplicationsIndexTest.java b/sonar-db/src/test/java/org/sonar/db/version/v60/MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndexTest.java index ec32c46d528..203c2f578f6 100644 --- a/sonar-db/src/test/java/org/sonar/db/version/v60/MakeComponentUuidNotNullOnDuplicationsIndexTest.java +++ b/sonar-db/src/test/java/org/sonar/db/version/v60/MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndexTest.java @@ -32,15 +32,15 @@ import org.sonar.db.DbTester; import static java.lang.String.valueOf; import static org.assertj.core.api.Assertions.assertThat; -public class MakeComponentUuidNotNullOnDuplicationsIndexTest { +public class MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndexTest { @Rule - public DbTester db = DbTester.createForSchema(System2.INSTANCE, MakeComponentUuidNotNullOnDuplicationsIndexTest.class, + public DbTester db = DbTester.createForSchema(System2.INSTANCE, MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndexTest.class, "in_progress_duplications_index.sql"); @Rule public ExpectedException expectedException = ExpectedException.none(); - private MakeComponentUuidNotNullOnDuplicationsIndex underTest = new MakeComponentUuidNotNullOnDuplicationsIndex(db.database()); + private MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndex underTest = new MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndex(db.database()); @Test public void migration_sets_uuid_columns_not_nullable_on_empty_table() throws SQLException { @@ -51,8 +51,8 @@ public class MakeComponentUuidNotNullOnDuplicationsIndexTest { @Test public void migration_sets_uuid_columns_not_nullable_on_populated_table() throws SQLException { - insertDuplicationIndex(1L, true); - insertDuplicationIndex(2L, true); + insertDuplicationIndex(1L, true, true); + insertDuplicationIndex(2L, true, true); underTest.execute(); @@ -61,8 +61,18 @@ public class MakeComponentUuidNotNullOnDuplicationsIndexTest { } @Test - public void migration_fails_if_some_uuid_columns_are_null() throws SQLException { - insertDuplicationIndex(1L, false); + public void migration_fails_if_some_component_uuid_columns_are_null() throws SQLException { + insertDuplicationIndex(1L, false, true); + + expectedException.expect(IllegalStateException.class); + expectedException.expectMessage("Fail to execute"); + + underTest.execute(); + } + + @Test + public void migration_fails_if_some_analysis_uuid_columns_are_null() throws SQLException { + insertDuplicationIndex(1L, true, false); expectedException.expect(IllegalStateException.class); expectedException.expectMessage("Fail to execute"); @@ -72,20 +82,22 @@ public class MakeComponentUuidNotNullOnDuplicationsIndexTest { private void verifyColumnDefinitions() { db.assertColumnDefinition("duplications_index", "component_uuid", Types.VARCHAR, 50, false); + db.assertColumnDefinition("duplications_index", "analysis_uuid", Types.VARCHAR, 50, false); } private List<Long> idsOfRowsInDuplicationsIndex() { return db.select("select ID from duplications_index").stream().map(map -> (Long) map.get("ID")).collect(Collectors.toList()); } - private void insertDuplicationIndex(long id, boolean hasComponentUuid) { + private void insertDuplicationIndex(long id, boolean hasComponentUuid, boolean hasAnalysisUuid) { db.executeInsert( "duplications_index", "ID", valueOf(id), "PROJECT_SNAPSHOT_ID", valueOf(10 + id), "SNAPSHOT_ID", valueOf(20 + id), - "COMPONENT_UUID", hasComponentUuid ? valueOf(30 + id) : null, - "HASH", "some_hash_" + id, + "ANALYSIS_UUID", hasAnalysisUuid ? valueOf(30 + id) : null, + "COMPONENT_UUID", hasComponentUuid ? valueOf(40 + id) : null, + "HASH", "some_hash_" + id, "INDEX_IN_FILE", "2", "START_LINE", "3", "END_LINE", "4"); diff --git a/sonar-db/src/test/java/org/sonar/db/version/v60/PopulateComponentUuidOfDuplicationsIndexTest.java b/sonar-db/src/test/java/org/sonar/db/version/v60/PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndexTest.java index acd4a75936a..33ec71b94e4 100644 --- a/sonar-db/src/test/java/org/sonar/db/version/v60/PopulateComponentUuidOfDuplicationsIndexTest.java +++ b/sonar-db/src/test/java/org/sonar/db/version/v60/PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndexTest.java @@ -31,13 +31,13 @@ import org.sonar.db.DbTester; import static java.lang.String.valueOf; import static org.assertj.core.api.Assertions.assertThat; -public class PopulateComponentUuidOfDuplicationsIndexTest { +public class PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndexTest { @Rule - public DbTester db = DbTester.createForSchema(System2.INSTANCE, PopulateComponentUuidOfDuplicationsIndexTest.class, + public DbTester db = DbTester.createForSchema(System2.INSTANCE, PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndexTest.class, "in_progress_measures_with_snapshots.sql"); - private PopulateComponentUuidOfDuplicationsIndex underTest = new PopulateComponentUuidOfDuplicationsIndex(db.database()); + private PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndex underTest = new PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndex(db.database()); @Test public void migration_has_no_effect_on_empty_tables() throws SQLException { @@ -49,66 +49,68 @@ public class PopulateComponentUuidOfDuplicationsIndexTest { @Test public void migration_updates_component_uuid_with_values_from_table_snapshots_when_they_exist() throws SQLException { - String uuid1 = insertSnapshot(40); - insertSnapshot(50); - String uuid3 = insertSnapshot(60); - insertSnapshot(70); - - insertDuplicationIndex(1, 40); - insertDuplicationIndex(2, 40); - insertDuplicationIndex(3, 40); - insertDuplicationIndex(4, 60); - insertDuplicationIndex(5, 90); // 90 does not exist - insertDuplicationIndex(6, 100); // 100 does not exist + insertSnapshot(40, "cpt1"); + String rootUuid1 = insertSnapshot(50, "cpt2"); + insertSnapshot(60, "cpt3"); + String rootUuid2 = insertSnapshot(70, "cpt4"); + + insertDuplicationIndex(1, 40, 50); + insertDuplicationIndex(2, 40, 50); + insertDuplicationIndex(3, 40, 70); + insertDuplicationIndex(4, 60, 110); // 110 doesn't exist + insertDuplicationIndex(5, 90, 120); // 90 and 120 does not exist + insertDuplicationIndex(6, 100, 70); // 100 does not exist db.commit(); underTest.execute(); - verifyDuplicationsIndex(1, 40, uuid1); - verifyDuplicationsIndex(2, 40, uuid1); - verifyDuplicationsIndex(3, 40, uuid1); - verifyDuplicationsIndex(4, 60, uuid3); - verifyDuplicationsIndex(5, 90, null); - verifyDuplicationsIndex(6, 100, null); + verifyDuplicationsIndex(1, 40, "cpt1", rootUuid1); + verifyDuplicationsIndex(2, 40, "cpt1", rootUuid1); + verifyDuplicationsIndex(3, 40, "cpt1", rootUuid2); + verifyDuplicationsIndex(4, 60, "cpt3", null); + verifyDuplicationsIndex(5, 90, null, null); + verifyDuplicationsIndex(6, 100, null, rootUuid2); } @Test public void migration_is_reentrant() throws SQLException { - String uuid1 = insertSnapshot(40); - insertSnapshot(50); - insertDuplicationIndex(1, 40); + insertSnapshot(40, "cpt1"); + String rootUuid = insertSnapshot(50, "cp2"); + insertDuplicationIndex(1, 40, 50); underTest.execute(); - verifyDuplicationsIndex(1, 40, uuid1); + verifyDuplicationsIndex(1, 40, "cpt1", rootUuid); underTest.execute(); - verifyDuplicationsIndex(1, 40, uuid1); + verifyDuplicationsIndex(1, 40, "cpt1", rootUuid); } - private void verifyDuplicationsIndex(long id, long snapshotId, @Nullable String componentUuid) { - List<Map<String, Object>> rows = db.select("select SNAPSHOT_ID, COMPONENT_UUID from duplications_index where ID=" + id); + private void verifyDuplicationsIndex(long id, long snapshotId, @Nullable String componentUuid, @Nullable String analysisUuid) { + List<Map<String, Object>> rows = db.select("select SNAPSHOT_ID, COMPONENT_UUID,ANALYSIS_UUID from duplications_index where ID=" + id); assertThat(rows).hasSize(1); Map<String, Object> row = rows.get(0); assertThat(row.get("SNAPSHOT_ID")).isEqualTo(snapshotId); assertThat(row.get("COMPONENT_UUID")).isEqualTo(componentUuid); + assertThat(row.get("ANALYSIS_UUID")).isEqualTo(analysisUuid); } - private String insertSnapshot(long id) { + private String insertSnapshot(long id, String componentUuid) { String uuid = "uuid_" + id; db.executeInsert( "snapshots", + "uuid", uuid, "id", valueOf(id), - "component_uuid", uuid, + "component_uuid", componentUuid, "root_component_uuid", valueOf(id + 100)); return uuid; } - private void insertDuplicationIndex(long id, long snapshotId) { + private void insertDuplicationIndex(long id, long snapshotId, long projectSnapshotId) { db.executeInsert( "duplications_index", "ID", valueOf(id), - "PROJECT_SNAPSHOT_ID", valueOf(10 + id), + "PROJECT_SNAPSHOT_ID", valueOf(projectSnapshotId), "SNAPSHOT_ID", valueOf(snapshotId), "HASH", "some_hash_" + id, "INDEX_IN_FILE", "2", diff --git a/sonar-db/src/test/resources/org/sonar/db/version/v60/AddComponentUuidColumnToDuplicationsIndexTest/duplications_index_5.6.sql b/sonar-db/src/test/resources/org/sonar/db/version/v60/AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndexTest/duplications_index_5.6.sql index 6ac3885a261..6ac3885a261 100644 --- a/sonar-db/src/test/resources/org/sonar/db/version/v60/AddComponentUuidColumnToDuplicationsIndexTest/duplications_index_5.6.sql +++ b/sonar-db/src/test/resources/org/sonar/db/version/v60/AddComponentUuidAndAnalysisUuidColumnToDuplicationsIndexTest/duplications_index_5.6.sql diff --git a/sonar-db/src/test/resources/org/sonar/db/version/v60/MakeComponentUuidNotNullOnDuplicationsIndexTest/in_progress_duplications_index.sql b/sonar-db/src/test/resources/org/sonar/db/version/v60/MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndexTest/in_progress_duplications_index.sql index df0cc072b65..5bd4e10d8de 100644 --- a/sonar-db/src/test/resources/org/sonar/db/version/v60/MakeComponentUuidNotNullOnDuplicationsIndexTest/in_progress_duplications_index.sql +++ b/sonar-db/src/test/resources/org/sonar/db/version/v60/MakeComponentUuidAndAnalysisUuidNotNullOnDuplicationsIndexTest/in_progress_duplications_index.sql @@ -2,6 +2,7 @@ CREATE TABLE "DUPLICATIONS_INDEX" ( "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), "PROJECT_SNAPSHOT_ID" INTEGER NOT NULL, "SNAPSHOT_ID" INTEGER NOT NULL, + "ANALYSIS_UUID" VARCHAR(50), "COMPONENT_UUID" VARCHAR(50), "HASH" VARCHAR(50) NOT NULL, "INDEX_IN_FILE" INTEGER NOT NULL, diff --git a/sonar-db/src/test/resources/org/sonar/db/version/v60/PopulateComponentUuidOfDuplicationsIndexTest/in_progress_measures_with_snapshots.sql b/sonar-db/src/test/resources/org/sonar/db/version/v60/PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndexTest/in_progress_measures_with_snapshots.sql index 94a2041748c..526a759d76d 100644 --- a/sonar-db/src/test/resources/org/sonar/db/version/v60/PopulateComponentUuidOfDuplicationsIndexTest/in_progress_measures_with_snapshots.sql +++ b/sonar-db/src/test/resources/org/sonar/db/version/v60/PopulateComponentUuidAndAnalysisUuidOfDuplicationsIndexTest/in_progress_measures_with_snapshots.sql @@ -2,6 +2,7 @@ CREATE TABLE "DUPLICATIONS_INDEX" ( "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), "PROJECT_SNAPSHOT_ID" INTEGER NOT NULL, "SNAPSHOT_ID" INTEGER NOT NULL, + "ANALYSIS_UUID" VARCHAR(50), "COMPONENT_UUID" VARCHAR(50), "HASH" VARCHAR(50) NOT NULL, "INDEX_IN_FILE" INTEGER NOT NULL, @@ -11,6 +12,7 @@ CREATE TABLE "DUPLICATIONS_INDEX" ( CREATE TABLE "SNAPSHOTS" ( "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), + "UUID" VARCHAR(50) NOT NULL, "CREATED_AT" BIGINT, "BUILD_DATE" BIGINT, "COMPONENT_UUID" VARCHAR(50) NOT NULL, |