From e58da285fd128f71ad8ac8c4a31890a25d64bc36 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Tue, 21 Apr 2015 17:30:16 +0200 Subject: [PATCH] SONAR-6256 Drop dependencies.from_resource_id and dependencies.to_resource_id --- .../server/db/migrations/MigrationSteps.java | 4 +- .../AddDependenciesComponentUuidColumns.java | 6 +- .../v52/DropDependenciesComponentColumns.java | 55 +++++++++++++++++++ .../DropDependenciesComponentColumnsTest.java | 52 ++++++++++++++++++ .../api/dependency_tree_controller.rb | 2 +- .../webapp/WEB-INF/app/models/dependency.rb | 4 +- .../911_remove_dependencies_component_ids.rb | 31 +++++++++++ .../batch/index/DependencyPersister.java | 4 +- .../core/persistence/DatabaseVersion.java | 2 +- .../org/sonar/core/persistence/rows-h2.sql | 1 + .../org/sonar/core/persistence/schema-h2.ddl | 2 - .../core/dependency/DependencyMapperTest.java | 46 ++++++++++------ .../DependencyMapperTest/fixture.xml | 6 +- .../shouldDeleteSnapshot-result.xml | 2 +- .../shouldDeleteSnapshot.xml | 6 +- .../shouldPurgeSnapshot-result.xml | 4 +- .../PurgeCommandsTest/shouldPurgeSnapshot.xml | 8 +-- .../org/sonar/api/design/DependencyDto.java | 30 +++++----- 18 files changed, 212 insertions(+), 53 deletions(-) create mode 100644 server/sonar-server/src/main/java/org/sonar/server/db/migrations/v52/DropDependenciesComponentColumns.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/db/migrations/v52/DropDependenciesComponentColumnsTest.java create mode 100644 server/sonar-web/src/main/webapp/WEB-INF/db/migrate/911_remove_dependencies_component_ids.rb diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/MigrationSteps.java b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/MigrationSteps.java index 127709ccafdd..2da008de6de2 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/MigrationSteps.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/MigrationSteps.java @@ -65,6 +65,7 @@ import org.sonar.server.db.migrations.v51.RenameComponentRelatedParamsInIssueFilters; import org.sonar.server.db.migrations.v51.UpdateProjectsModuleUuidPath; import org.sonar.server.db.migrations.v52.AddDependenciesComponentUuidColumns; +import org.sonar.server.db.migrations.v52.DropDependenciesComponentColumns; import org.sonar.server.db.migrations.v52.FeedDependenciesComponentUuids; import org.sonar.server.db.migrations.v52.FeedEventsComponentUuid; import org.sonar.server.db.migrations.v52.FeedProjectLinksComponentUuid; @@ -139,6 +140,7 @@ public interface MigrationSteps { FeedEventsComponentUuid.class, MoveProjectProfileAssociation.class, AddDependenciesComponentUuidColumns.class, - FeedDependenciesComponentUuids.class + FeedDependenciesComponentUuids.class, + DropDependenciesComponentColumns.class ); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v52/AddDependenciesComponentUuidColumns.java b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v52/AddDependenciesComponentUuidColumns.java index 276cc572ab96..e4f6d31c0618 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v52/AddDependenciesComponentUuidColumns.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v52/AddDependenciesComponentUuidColumns.java @@ -26,6 +26,8 @@ import java.sql.SQLException; +import static org.sonar.server.db.migrations.AddColumnsBuilder.ColumnDef.Type.STRING; + /** * Add the following columns to the dependencies table : * - from_component_uuid @@ -50,14 +52,14 @@ private String generateSql() { .addColumn( new AddColumnsBuilder.ColumnDef() .setName("from_component_uuid") - .setType(AddColumnsBuilder.ColumnDef.Type.STRING) + .setType(STRING) .setLimit(50) .setNullable(true) ) .addColumn( new AddColumnsBuilder.ColumnDef() .setName("to_component_uuid") - .setType(AddColumnsBuilder.ColumnDef.Type.STRING) + .setType(STRING) .setLimit(50) .setNullable(true) ) diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v52/DropDependenciesComponentColumns.java b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v52/DropDependenciesComponentColumns.java new file mode 100644 index 000000000000..973d38aa53e6 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/db/migrations/v52/DropDependenciesComponentColumns.java @@ -0,0 +1,55 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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. + * + * SonarQube 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.server.db.migrations.v52; + +import com.google.common.annotations.VisibleForTesting; +import org.sonar.core.persistence.Database; +import org.sonar.server.db.migrations.DdlChange; +import org.sonar.server.db.migrations.DropColumnsBuilder; + +import java.sql.SQLException; + +/** + * Remove the following columns from the dependencies table : + * - from_resource_id + * - to_resource_id + */ +public class DropDependenciesComponentColumns extends DdlChange { + + private final Database db; + + public DropDependenciesComponentColumns(Database db) { + super(db); + this.db = db; + } + + @Override + public void execute(Context context) throws SQLException { + context.execute(generateSql()); + } + + @VisibleForTesting + String generateSql() { + return new DropColumnsBuilder(db.getDialect(), "dependencies", "from_resource_id", "to_resource_id") + .build(); + } + +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/db/migrations/v52/DropDependenciesComponentColumnsTest.java b/server/sonar-server/src/test/java/org/sonar/server/db/migrations/v52/DropDependenciesComponentColumnsTest.java new file mode 100644 index 000000000000..3147195b99cd --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/db/migrations/v52/DropDependenciesComponentColumnsTest.java @@ -0,0 +1,52 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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. + * + * SonarQube 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.server.db.migrations.v52; + +import org.junit.Before; +import org.junit.Test; +import org.sonar.core.persistence.Database; +import org.sonar.core.persistence.dialect.PostgreSql; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class DropDependenciesComponentColumnsTest { + + DropDependenciesComponentColumns migration; + + Database database; + + @Before + public void setUp() throws Exception { + database = mock(Database.class); + migration = new DropDependenciesComponentColumns(database); + } + + @Test + public void generate_sql_on_postgresql() throws Exception { + when(database.getDialect()).thenReturn(new PostgreSql()); + assertThat(migration.generateSql()).isEqualTo( + "ALTER TABLE dependencies DROP COLUMN from_resource_id, DROP COLUMN to_resource_id" + ); + } + +} diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/api/dependency_tree_controller.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/api/dependency_tree_controller.rb index 0d93e544c186..12222ce82fc7 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/api/dependency_tree_controller.rb +++ b/server/sonar-web/src/main/webapp/WEB-INF/app/controllers/api/dependency_tree_controller.rb @@ -66,7 +66,7 @@ def to_json(dependencies_by_from, from_sid) dependencies.each do |dep| hash={ :did => dep.id.to_s, - :rid => dep.to_resource_id.to_s, + :rid => dep.to.id.to_s, :w => dep.weight, :u => dep.usage, :s => dep.to_scope, diff --git a/server/sonar-web/src/main/webapp/WEB-INF/app/models/dependency.rb b/server/sonar-web/src/main/webapp/WEB-INF/app/models/dependency.rb index c6ff4617d0f4..7505640f1ca8 100644 --- a/server/sonar-web/src/main/webapp/WEB-INF/app/models/dependency.rb +++ b/server/sonar-web/src/main/webapp/WEB-INF/app/models/dependency.rb @@ -18,10 +18,10 @@ # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # class Dependency < ActiveRecord::Base - belongs_to :from, :class_name => 'Project', :foreign_key => 'from_resource_id' + belongs_to :from, :class_name => 'Project', :foreign_key => 'from_component_uuid', :primary_key => 'uuid' belongs_to :from_snapshot, :class_name => 'Snapshot', :foreign_key => 'from_snapshot_id' - belongs_to :to, :class_name => 'Project', :foreign_key => 'to_resource_id' + belongs_to :to, :class_name => 'Project', :foreign_key => 'to_component_uuid', :primary_key => 'uuid' belongs_to :to_snapshot, :class_name => 'Snapshot', :foreign_key => 'to_snapshot_id' belongs_to :project, :class_name => 'Project', :foreign_key => 'project_id' diff --git a/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/911_remove_dependencies_component_ids.rb b/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/911_remove_dependencies_component_ids.rb new file mode 100644 index 000000000000..623c6e367093 --- /dev/null +++ b/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/911_remove_dependencies_component_ids.rb @@ -0,0 +1,31 @@ +# +# SonarQube, open source software quality management tool. +# Copyright (C) 2008-2014 SonarSource +# mailto:contact AT sonarsource DOT com +# +# SonarQube 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. +# +# SonarQube 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. +# + +# +# SonarQube 5.2 +# SONAR-6256 +# +class RemoveDependenciesComponentIds < ActiveRecord::Migration + + def self.up + execute_java_migration('org.sonar.server.db.migrations.v52.DropDependenciesComponentColumns') + end + +end diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/DependencyPersister.java b/sonar-batch/src/main/java/org/sonar/batch/index/DependencyPersister.java index 13c73e278f5b..c882eb9ef68b 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/index/DependencyPersister.java +++ b/sonar-batch/src/main/java/org/sonar/batch/index/DependencyPersister.java @@ -64,11 +64,11 @@ private void saveInDB(Project project, Dependency dependency, BatchResource from model.setUsage(dependency.getUsage()); model.setWeight(dependency.getWeight()); - model.setFromResourceId(fromResource.resource().getId()); + model.setFromComponentUuid(fromResource.resource().getUuid()); model.setFromScope(fromResource.resource().getScope()); model.setFromSnapshotId(fromResource.snapshotId()); - model.setToResourceId(toResource.resource().getId()); + model.setToComponentUuid(toResource.resource().getUuid()); model.setToScope(toResource.resource().getScope()); model.setToSnapshotId(toResource.snapshotId()); diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java b/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java index 87410d7a8cb7..531a662b6bff 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java @@ -33,7 +33,7 @@ */ public class DatabaseVersion implements BatchComponent, ServerComponent { - public static final int LAST_VERSION = 910; + public static final int LAST_VERSION = 911; /** * List of all the tables.n diff --git a/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql b/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql index 1f19a2ff695a..97fa66aea45b 100644 --- a/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql +++ b/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql @@ -334,6 +334,7 @@ INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('907'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('908'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('909'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('910'); +INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('911'); INSERT INTO USERS(ID, LOGIN, NAME, EMAIL, CRYPTED_PASSWORD, SALT, CREATED_AT, UPDATED_AT, REMEMBER_TOKEN, REMEMBER_TOKEN_EXPIRES_AT) VALUES (1, 'admin', 'Administrator', '', 'a373a0e667abb2604c1fd571eb4ad47fe8cc0878', '48bc4b0d93179b5103fd3885ea9119498e9d161b', '1418215735482', '1418215735482', null, null); ALTER TABLE USERS ALTER COLUMN ID RESTART WITH 2; diff --git a/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl b/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl index 78b7586205d5..77e26efde371 100644 --- a/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl +++ b/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl @@ -6,10 +6,8 @@ CREATE TABLE "GROUPS_USERS" ( CREATE TABLE "DEPENDENCIES" ( "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), "FROM_SNAPSHOT_ID" INTEGER, - "FROM_RESOURCE_ID" INTEGER, "FROM_COMPONENT_UUID" VARCHAR(50), "TO_SNAPSHOT_ID" INTEGER, - "TO_RESOURCE_ID" INTEGER, "TO_COMPONENT_UUID" VARCHAR(50), "DEP_USAGE" VARCHAR(30), "DEP_WEIGHT" INTEGER, diff --git a/sonar-core/src/test/java/org/sonar/core/dependency/DependencyMapperTest.java b/sonar-core/src/test/java/org/sonar/core/dependency/DependencyMapperTest.java index 5c16ce4108e5..e42fa5ff68d9 100644 --- a/sonar-core/src/test/java/org/sonar/core/dependency/DependencyMapperTest.java +++ b/sonar-core/src/test/java/org/sonar/core/dependency/DependencyMapperTest.java @@ -22,32 +22,46 @@ import com.google.common.collect.Lists; import org.apache.ibatis.session.ResultContext; import org.apache.ibatis.session.ResultHandler; -import org.apache.ibatis.session.SqlSession; +import org.junit.After; +import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; -import org.sonar.core.persistence.AbstractDaoTestCase; -import org.sonar.core.persistence.MyBatis; +import org.sonar.core.persistence.DbSession; +import org.sonar.core.persistence.DbTester; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -public class DependencyMapperTest extends AbstractDaoTestCase { +public class DependencyMapperTest { + + @ClassRule + public static DbTester dbtester = new DbTester(); + + DbSession session; + + @Before + public void setUp() throws Exception { + dbtester.truncateTables(); + session = dbtester.myBatis().openSession(false); + } + + @After + public void tearDown() throws Exception { + session.close(); + } + @Test - public void should_find_all() { - setupData("fixture"); + public void select_all_dependencies() { + dbtester.prepareDbUnit(getClass(), "fixture.xml"); final List dependencies = Lists.newArrayList(); - SqlSession session = getMyBatis().openSession(); - try { - session.getMapper(DependencyMapper.class).selectAll(new ResultHandler() { - public void handleResult(ResultContext context) { - dependencies.add((DependencyDto) context.getResultObject()); - } - }); - } finally { - MyBatis.closeQuietly(session); - } + session.getMapper(DependencyMapper.class).selectAll(new ResultHandler() { + public void handleResult(ResultContext context) { + dependencies.add((DependencyDto) context.getResultObject()); + } + }); assertThat(dependencies).hasSize(2); diff --git a/sonar-core/src/test/resources/org/sonar/core/dependency/DependencyMapperTest/fixture.xml b/sonar-core/src/test/resources/org/sonar/core/dependency/DependencyMapperTest/fixture.xml index 7e8a8e9f677d..f190e3a42215 100644 --- a/sonar-core/src/test/resources/org/sonar/core/dependency/DependencyMapperTest/fixture.xml +++ b/sonar-core/src/test/resources/org/sonar/core/dependency/DependencyMapperTest/fixture.xml @@ -1,4 +1,4 @@ - - - \ No newline at end of file + + + diff --git a/sonar-core/src/test/resources/org/sonar/core/purge/PurgeCommandsTest/shouldDeleteSnapshot-result.xml b/sonar-core/src/test/resources/org/sonar/core/purge/PurgeCommandsTest/shouldDeleteSnapshot-result.xml index 9a0a675bc242..286d4dd8447f 100644 --- a/sonar-core/src/test/resources/org/sonar/core/purge/PurgeCommandsTest/shouldDeleteSnapshot-result.xml +++ b/sonar-core/src/test/resources/org/sonar/core/purge/PurgeCommandsTest/shouldDeleteSnapshot-result.xml @@ -22,7 +22,7 @@ person_id="[null]" text_value="[null]" tendency="[null]" measure_date="[null]" project_id="[null]" alert_status="[null]" description="[null]" measure_data="[null]"/> - - - - - - diff --git a/sonar-core/src/test/resources/org/sonar/core/purge/PurgeCommandsTest/shouldPurgeSnapshot.xml b/sonar-core/src/test/resources/org/sonar/core/purge/PurgeCommandsTest/shouldPurgeSnapshot.xml index 7881def58d33..2aa70e077c01 100644 --- a/sonar-core/src/test/resources/org/sonar/core/purge/PurgeCommandsTest/shouldPurgeSnapshot.xml +++ b/sonar-core/src/test/resources/org/sonar/core/purge/PurgeCommandsTest/shouldPurgeSnapshot.xml @@ -18,11 +18,11 @@ tendency="[null]" measure_date="[null]" alert_status="[null]" description="[null]" measure_data="[null]"/> - - @@ -56,11 +56,11 @@ text_value="[null]" tendency="[null]" measure_date="[null]" alert_status="[null]" description="[null]" measure_data="[null]"/> - - diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/design/DependencyDto.java b/sonar-plugin-api/src/main/java/org/sonar/api/design/DependencyDto.java index 80075f7ee0c7..5e575bc09e29 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/design/DependencyDto.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/design/DependencyDto.java @@ -24,7 +24,11 @@ import org.apache.commons.lang.builder.ReflectionToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; @Entity @Table(name = "dependencies") @@ -38,8 +42,8 @@ public class DependencyDto { @Column(name = "from_snapshot_id", updatable = true, nullable = false) private Integer fromSnapshotId; - @Column(name = "from_resource_id", updatable = true, nullable = false) - private Integer fromResourceId; + @Column(name = "from_component_uuid", updatable = true, nullable = false) + private String fromComponentUuid; @Column(name = "from_scope", updatable = true, nullable = true) private String fromScope; @@ -47,8 +51,8 @@ public class DependencyDto { @Column(name = "to_snapshot_id", updatable = true, nullable = false) private Integer toSnapshotId; - @Column(name = "to_resource_id", updatable = true, nullable = false) - private Integer toResourceId; + @Column(name = "to_component_uuid", updatable = true, nullable = false) + private String toComponentUuid; @Column(name = "to_scope", updatable = true, nullable = true) private String toScope; @@ -82,12 +86,12 @@ public DependencyDto setFromSnapshotId(Integer fromSnapshotId) { return this; } - public Integer getFromResourceId() { - return fromResourceId; + public String getFromComponentUuid() { + return fromComponentUuid; } - public DependencyDto setFromResourceId(Integer fromResourceId) { - this.fromResourceId = fromResourceId; + public DependencyDto setFromComponentUuid(String fromComponentUuid) { + this.fromComponentUuid = fromComponentUuid; return this; } @@ -100,12 +104,12 @@ public DependencyDto setToSnapshotId(Integer toSnapshotId) { return this; } - public Integer getToResourceId() { - return toResourceId; + public String getToComponentUuid() { + return toComponentUuid; } - public DependencyDto setToResourceId(Integer toResourceId) { - this.toResourceId = toResourceId; + public DependencyDto setToComponentUuid(String toComponentUuid) { + this.toComponentUuid = toComponentUuid; return this; }