diff options
13 files changed, 193 insertions, 8 deletions
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmAppInstallDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmAppInstallDao.java index 570de28f18b..a5630c417c2 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmAppInstallDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmAppInstallDao.java @@ -73,7 +73,7 @@ public class AlmAppInstallDao implements Dao { public List<AlmAppInstallDto> selectByOrganizations(DbSession dbSession, List<OrganizationDto> organizations) { Set<String> organizationUuids = organizations.stream().map(OrganizationDto::getUuid).collect(Collectors.toSet()); - return executeLargeInputs(organizationUuids, uuids -> getMapper(dbSession).selectByOrganizationUuids(organizationUuids)); + return executeLargeInputs(organizationUuids, uuids -> getMapper(dbSession).selectByOrganizationUuids(uuids)); } public List<AlmAppInstallDto> selectUnboundByUserExternalId(DbSession dbSession, String userExternalId) { diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/setting/ProjectAlmSettingDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/setting/ProjectAlmSettingDao.java index d93d544c12d..a3d1b0e941d 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/setting/ProjectAlmSettingDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/setting/ProjectAlmSettingDao.java @@ -19,13 +19,20 @@ */ package org.sonar.db.alm.setting; +import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; import org.sonar.api.utils.System2; import org.sonar.core.util.UuidFactory; import org.sonar.db.Dao; import org.sonar.db.DbSession; +import org.sonar.db.alm.AlmAppInstallDto; +import org.sonar.db.organization.OrganizationDto; import org.sonar.db.project.ProjectDto; +import static org.sonar.db.DatabaseUtils.executeLargeInputs; + public class ProjectAlmSettingDao implements Dao { private final System2 system2; @@ -73,4 +80,7 @@ public class ProjectAlmSettingDao implements Dao { return dbSession.getMapper(ProjectAlmSettingMapper.class); } + public List<ProjectAlmSettingDto> selectByAlmSettingAndSlugs(DbSession dbSession, AlmSettingDto almSettingDto, Set<String> almSlugs) { + return executeLargeInputs(almSlugs, slugs -> getMapper(dbSession).selectByAlmSettingAndSlugs(almSettingDto.getUuid(), slugs)); + } } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/setting/ProjectAlmSettingMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/setting/ProjectAlmSettingMapper.java index 248756e81a1..a880721c126 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/setting/ProjectAlmSettingMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/setting/ProjectAlmSettingMapper.java @@ -19,6 +19,8 @@ */ package org.sonar.db.alm.setting; +import java.util.List; +import java.util.Set; import javax.annotation.CheckForNull; import org.apache.ibatis.annotations.Param; @@ -36,4 +38,5 @@ public interface ProjectAlmSettingMapper { void deleteByProjectUuid(@Param("projectUuid") String projectUuid); void deleteByAlmSettingUuid(@Param("almSettingUuid") String almSettingUuid); + List<ProjectAlmSettingDto> selectByAlmSettingAndSlugs(@Param("almSettingUuid") String almSettingUuid, @Param("slugs") List<String> slugs); } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/setting/ProjectAlmSettingMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/setting/ProjectAlmSettingMapper.xml index 87848bac606..7b6a7f86262 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/setting/ProjectAlmSettingMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/alm/setting/ProjectAlmSettingMapper.xml @@ -21,6 +21,18 @@ p.project_uuid = #{projectUuid, jdbcType=VARCHAR} </select> + <select id="selectByAlmSettingAndSlugs" parameterType="string" resultType="org.sonar.db.alm.setting.ProjectAlmSettingDto"> + select <include refid="sqlColumns"/> + from + project_alm_settings p + where + alm_setting_uuid=#{almSettingUuid, jdbcType=VARCHAR} + and alm_slug in + <foreach collection="slugs" open="(" close=")" item="slug" separator=","> + #{slug, jdbcType=VARCHAR} + </foreach> + </select> + <insert id="insert" parameterType="Map" useGeneratedKeys="false"> INSERT INTO project_alm_settings ( diff --git a/server/sonar-db-dao/src/schema/schema-sq.ddl b/server/sonar-db-dao/src/schema/schema-sq.ddl index eb922de2031..17a3cd04dc3 100644 --- a/server/sonar-db-dao/src/schema/schema-sq.ddl +++ b/server/sonar-db-dao/src/schema/schema-sq.ddl @@ -636,6 +636,7 @@ CREATE TABLE "PROJECT_ALM_SETTINGS"( ALTER TABLE "PROJECT_ALM_SETTINGS" ADD CONSTRAINT "PK_PROJECT_ALM_SETTINGS" PRIMARY KEY("UUID"); CREATE UNIQUE INDEX "UNIQ_PROJECT_ALM_SETTINGS" ON "PROJECT_ALM_SETTINGS"("PROJECT_UUID"); CREATE INDEX "PROJECT_ALM_SETTINGS_ALM" ON "PROJECT_ALM_SETTINGS"("ALM_SETTING_UUID"); +CREATE INDEX "PROJECT_ALM_SETTINGS_SLUG" ON "PROJECT_ALM_SETTINGS"("ALM_SLUG"); CREATE TABLE "PROJECT_BRANCHES"( "UUID" VARCHAR(50) NOT NULL, diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/alm/setting/ProjectAlmSettingDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/alm/setting/ProjectAlmSettingDaoTest.java index 474ac89f68f..cdbfa161c5d 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/alm/setting/ProjectAlmSettingDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/alm/setting/ProjectAlmSettingDaoTest.java @@ -19,6 +19,8 @@ */ package org.sonar.db.alm.setting; +import java.util.HashSet; +import java.util.Set; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -31,6 +33,7 @@ import org.sonar.db.project.ProjectDto; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.sonar.db.almsettings.AlmSettingsTesting.newBitbucketProjectAlmSettingDto; import static org.sonar.db.almsettings.AlmSettingsTesting.newGithubProjectAlmSettingDto; public class ProjectAlmSettingDaoTest { @@ -50,7 +53,7 @@ public class ProjectAlmSettingDaoTest { private ProjectAlmSettingDao underTest = new ProjectAlmSettingDao(system2, uuidFactory); @Test - public void selectByProject() { + public void select_by_project() { when(uuidFactory.create()).thenReturn(A_UUID); when(system2.now()).thenReturn(A_DATE); AlmSettingDto githubAlmSettingDto = db.almSettings().insertGitHubAlmSetting(); @@ -71,6 +74,36 @@ public class ProjectAlmSettingDaoTest { } @Test + public void select_by_alm_setting_and_slugs() { + when(uuidFactory.create()).thenReturn(A_UUID); + when(system2.now()).thenReturn(A_DATE); + AlmSettingDto almSettingsDto = db.almSettings().insertBitbucketAlmSetting(); + ProjectDto project = db.components().insertPrivateProjectDto(); + ProjectAlmSettingDto githubProjectAlmSettingDto = newBitbucketProjectAlmSettingDto(almSettingsDto, project); + githubProjectAlmSettingDto.setAlmSlug("slug1"); + underTest.insertOrUpdate(dbSession, githubProjectAlmSettingDto); + ProjectAlmSettingDto githubProjectAlmSettingDto2 = newBitbucketProjectAlmSettingDto(almSettingsDto, db.components().insertPrivateProjectDto()); + githubProjectAlmSettingDto2.setAlmSlug("slug2"); + when(uuidFactory.create()).thenReturn(A_UUID + 1); + underTest.insertOrUpdate(dbSession, githubProjectAlmSettingDto2); + + Set<String> slugs = new HashSet<>(); + slugs.add("slug1"); + assertThat(underTest.selectByAlmSettingAndSlugs(dbSession, almSettingsDto, slugs)) + .extracting(ProjectAlmSettingDto::getProjectUuid) + .containsExactly(project.getUuid()); + } + + @Test + public void select_with_no_slugs_return_empty() { + when(uuidFactory.create()).thenReturn(A_UUID); + when(system2.now()).thenReturn(A_DATE); + AlmSettingDto almSettingsDto = db.almSettings().insertBitbucketAlmSetting(); + + assertThat(underTest.selectByAlmSettingAndSlugs(dbSession, almSettingsDto, new HashSet<>())).isEmpty(); + } + + @Test public void update_existing_binding() { when(uuidFactory.create()).thenReturn(A_UUID); when(system2.now()).thenReturn(A_DATE); diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v82/AddIndexOnSlugOfProjectAlmSettings.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v82/AddIndexOnSlugOfProjectAlmSettings.java new file mode 100644 index 00000000000..974a0eb69d9 --- /dev/null +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v82/AddIndexOnSlugOfProjectAlmSettings.java @@ -0,0 +1,65 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 SonarSource SA + * mailto:info 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.server.platform.db.migration.version.v82; + +import java.sql.Connection; +import java.sql.SQLException; +import org.sonar.db.Database; +import org.sonar.db.DatabaseUtils; +import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder; +import org.sonar.server.platform.db.migration.step.DdlChange; + +import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder; + +public class AddIndexOnSlugOfProjectAlmSettings extends DdlChange { + + private static final String TABLE_NAME = "project_alm_settings"; + private static final String INDEX_NAME = "project_alm_settings_slug"; + + public AddIndexOnSlugOfProjectAlmSettings(Database db) { + super(db); + } + + @Override + public void execute(Context context) throws SQLException { + if (indexExists()) { + return; + } + + CreateIndexBuilder builder = new CreateIndexBuilder() + .setTable(TABLE_NAME) + .addColumn(newVarcharColumnDefBuilder() + .setColumnName("alm_slug") + .setIsNullable(true) + .setLimit(256) + .build()) + .setName(INDEX_NAME) + .setUnique(false); + + context.execute(builder.build()); + } + + private boolean indexExists() throws SQLException { + try (Connection connection = getDatabase().getDataSource().getConnection()) { + return DatabaseUtils.indexExists(TABLE_NAME, INDEX_NAME, connection); + } + } + +} diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v82/DbVersion82.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v82/DbVersion82.java index 6cb35a8f7c7..cda4abb3e96 100644 --- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v82/DbVersion82.java +++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v82/DbVersion82.java @@ -35,6 +35,7 @@ public class DbVersion82 implements DbVersion { .add(3206, "Populate PROJECTS table", PopulateProjectsTable.class) .add(3207, "Drop 'TAGS' column from COMPONENTS table", DropTagsColumnFromComponentsTable.class) .add(3208, "Remove old Security Review Rating measures", DeleteSecurityReviewRatingMeasures.class) - .add(3209, "Create ALM_PATS table", CreateAlmPatsTable.class); + .add(3209, "Create ALM_PATS table", CreateAlmPatsTable.class) + .add(3210, "Add index on ALM_slug", AddIndexOnSlugOfProjectAlmSettings.class); } } diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v82/AddIndexOnSlugOfProjectAlmSettingsTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v82/AddIndexOnSlugOfProjectAlmSettingsTest.java new file mode 100644 index 00000000000..1e82b381543 --- /dev/null +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v82/AddIndexOnSlugOfProjectAlmSettingsTest.java @@ -0,0 +1,50 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 SonarSource SA + * mailto:info 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.server.platform.db.migration.version.v82; + +import java.sql.SQLException; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.sonar.db.CoreDbTester; + +public class AddIndexOnSlugOfProjectAlmSettingsTest { + + private static final String TABLE_NAME = "project_alm_settings"; + + @Rule + public CoreDbTester dbTester = CoreDbTester.createForSchema(AddIndexOnSlugOfProjectAlmSettingsTest.class, "schema.sql"); + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + private AddIndexOnSlugOfProjectAlmSettings underTest = new AddIndexOnSlugOfProjectAlmSettings(dbTester.database()); + + @Test + public void index_has_been_created() throws SQLException { + underTest.execute(); + + dbTester.assertTableExists(TABLE_NAME); + dbTester.assertIndex(TABLE_NAME, "project_alm_settings_slug", "alm_slug"); + + // script should not fail if executed twice + underTest.execute(); + } +} diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v82/CreateAlmPATsTableTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v82/CreateAlmPATsTableTest.java index 464f86a19fa..cbc1001a1fa 100644 --- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v82/CreateAlmPATsTableTest.java +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v82/CreateAlmPATsTableTest.java @@ -24,7 +24,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.sonar.db.CoreDbTester; -import org.sonar.server.platform.db.migration.version.v81.CreateAlmSettingsTable; import static java.sql.Types.BIGINT; import static java.sql.Types.VARCHAR; diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v82/DbVersion82Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v82/DbVersion82Test.java index a8fb4920537..ccac28b2c85 100644 --- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v82/DbVersion82Test.java +++ b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v82/DbVersion82Test.java @@ -36,7 +36,7 @@ public class DbVersion82Test { @Test public void verify_migration_count() { - verifyMigrationCount(underTest, 10); + verifyMigrationCount(underTest, 11); } } diff --git a/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v82/AddIndexOnSlugOfProjectAlmSettingsTest/schema.sql b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v82/AddIndexOnSlugOfProjectAlmSettingsTest/schema.sql new file mode 100644 index 00000000000..137b8c43e8c --- /dev/null +++ b/server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v82/AddIndexOnSlugOfProjectAlmSettingsTest/schema.sql @@ -0,0 +1,12 @@ +CREATE TABLE "PROJECT_ALM_SETTINGS"( + "UUID" VARCHAR(40) NOT NULL, + "ALM_SETTING_UUID" VARCHAR(40) NOT NULL, + "PROJECT_UUID" VARCHAR(50) NOT NULL, + "ALM_REPO" VARCHAR(256), + "ALM_SLUG" VARCHAR(256), + "UPDATED_AT" BIGINT NOT NULL, + "CREATED_AT" BIGINT NOT NULL +); +ALTER TABLE "PROJECT_ALM_SETTINGS" ADD CONSTRAINT "PK_PROJECT_ALM_SETTINGS" PRIMARY KEY("UUID"); +CREATE UNIQUE INDEX "UNIQ_PROJECT_ALM_SETTINGS" ON "PROJECT_ALM_SETTINGS"("PROJECT_UUID"); +CREATE INDEX "PROJECT_ALM_SETTINGS_ALM" ON "PROJECT_ALM_SETTINGS"("ALM_SETTING_UUID"); diff --git a/sonar-ws/src/main/protobuf/ws-alm_integrations.proto b/sonar-ws/src/main/protobuf/ws-alm_integrations.proto index 010bcb30a40..6a0e7667703 100644 --- a/sonar-ws/src/main/protobuf/ws-alm_integrations.proto +++ b/sonar-ws/src/main/protobuf/ws-alm_integrations.proto @@ -39,9 +39,8 @@ message BBSRepo { optional string slug = 1; optional int64 id = 2; optional string name = 3; - optional string url = 4; - optional string sqProjectKey = 5; - optional string projectKey = 6; + optional string sqProjectKey = 4; + optional string projectKey = 5; } message BBSProject { |