]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-11037 Return linked projects in list_repositories for BBC
authorJulien HENRY <julien.henry@sonarsource.com>
Thu, 26 Jul 2018 16:48:53 +0000 (18:48 +0200)
committerSonarTech <sonartech@sonarsource.com>
Fri, 10 Aug 2018 18:21:29 +0000 (20:21 +0200)
server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java
server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingDto.java [new file with mode: 0644]
server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingsDao.java
server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingsMapper.java
server/sonar-db-dao/src/main/resources/org/sonar/db/alm/AlmProjectMappingsMapper.xml
server/sonar-db-dao/src/test/java/org/sonar/db/alm/AlmProjectMappingsDaoTest.java

index e6faa27aff4c363debb082ff45803eb9c083b209..74a37144ac9ac401805dfde41ead076f32b9f446 100644 (file)
@@ -31,6 +31,7 @@ import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 import org.apache.ibatis.session.TransactionIsolationLevel;
 import org.sonar.api.Startable;
 import org.sonar.db.alm.AlmAppInstallMapper;
+import org.sonar.db.alm.AlmProjectMappingDto;
 import org.sonar.db.alm.AlmProjectMappingsMapper;
 import org.sonar.db.ce.CeActivityMapper;
 import org.sonar.db.ce.CeQueueMapper;
@@ -151,6 +152,7 @@ public class MyBatis implements Startable {
     // DTO aliases, keep them sorted alphabetically
     confBuilder.loadAlias("ActiveRule", ActiveRuleDto.class);
     confBuilder.loadAlias("ActiveRuleParam", ActiveRuleParamDto.class);
+    confBuilder.loadAlias("AlmProjectMapping", AlmProjectMappingDto.class);
     confBuilder.loadAlias("CeTaskCharacteristic", CeTaskCharacteristicDto.class);
     confBuilder.loadAlias("Component", ComponentDto.class);
     confBuilder.loadAlias("ComponentWithSnapshot", ComponentDtoWithSnapshotId.class);
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/alm/AlmProjectMappingDto.java
new file mode 100644 (file)
index 0000000..7c2fcf4
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2018 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.db.alm;
+
+public class AlmProjectMappingDto {
+  private String uuid;
+  private String almId;
+  private String repoId;
+  private String projectUuid;
+  private String githubSlug;
+  private String url;
+
+  public String getAlmId() {
+    return almId;
+  }
+
+  public AlmProjectMappingDto setAlmId(String almId) {
+    this.almId = almId;
+    return this;
+  }
+
+  public String getRepoId() {
+    return repoId;
+  }
+
+  public AlmProjectMappingDto setRepoId(String repoId) {
+    this.repoId = repoId;
+    return this;
+  }
+
+  public String getProjectUuid() {
+    return projectUuid;
+  }
+
+  public AlmProjectMappingDto setProjectUuid(String projectUuid) {
+    this.projectUuid = projectUuid;
+    return this;
+  }
+
+  public String getGithubSlug() {
+    return githubSlug;
+  }
+
+  public AlmProjectMappingDto setGithubSlug(String githubSlug) {
+    this.githubSlug = githubSlug;
+    return this;
+  }
+
+  public String getUrl() {
+    return url;
+  }
+
+  public AlmProjectMappingDto setUrl(String url) {
+    this.url = url;
+    return this;
+  }
+
+  public String getUuid() {
+    return uuid;
+  }
+
+  public AlmProjectMappingDto setUuid(String uuid) {
+    this.uuid = uuid;
+    return this;
+  }
+}
index 992e8f1f2bfec3b8318d74ab7eb70aa5ba819437..6e7a3b2639c4affa6b9fe7c5a00f439321fd6d59 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.db.alm;
 
+import java.util.Collection;
+import java.util.List;
 import java.util.Objects;
 import javax.annotation.Nullable;
 import org.sonar.api.utils.System2;
@@ -28,6 +30,7 @@ import org.sonar.db.DbSession;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static org.apache.commons.lang.StringUtils.isNotEmpty;
+import static org.sonar.db.DatabaseUtils.executeLargeInputs;
 
 public class AlmProjectMappingsDao implements Dao {
 
@@ -60,6 +63,15 @@ public class AlmProjectMappingsDao implements Dao {
     return getMapper(dbSession).mappingCount(alm.getId(), repoId) == 1;
   }
 
+  /**
+   * Gets a list or mappings by their repo_id. The result does NOT contain {@code null} values for mappings not found, so
+   * the size of result may be less than the number of ids.
+   * <p>Results may be in a different order as input ids.</p>
+   */
+  public List<AlmProjectMappingDto> selectByRepoIds(final DbSession session, ALM alm, Collection<String> repoIds) {
+    return executeLargeInputs(repoIds, partionnedIds -> getMapper(session).selectByRepoIds(alm.getId(), partionnedIds));
+  }
+
   private static void checkAlm(@Nullable ALM alm) {
     Objects.requireNonNull(alm, "alm can't be null");
   }
index 250f588ddae7851652ef776fd6629c97a435d236..5baeafc91e2b9e7e9efd5b86b7ab44ebcc95830a 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.db.alm;
 
+import java.util.List;
 import javax.annotation.Nullable;
 import org.apache.ibatis.annotations.Param;
 
@@ -31,4 +32,6 @@ public interface AlmProjectMappingsMapper {
 
   int update(@Param("almId") String almId, @Param("repoId") String repoId, @Param("projectUuid") String projectUuid,
     @Nullable @Param("githubSlug") String githubSlug, @Param("url") String url, @Param("now") long now);
+
+  List<AlmProjectMappingDto> selectByRepoIds(@Param("almId") String almId, @Param("repoIds") List<String> repoIds);
 }
index 0f6be2489e697801c180e0709267a873f1526949..6797a87ec5636d310692206c00a873fd02bfa73b 100644 (file)
       and repo_id = #{repoId, jdbcType=VARCHAR}
   </update>
 
+  <select id="selectByRepoIds" parameterType="map" resultType="AlmProjectMapping">
+    select
+      uuid,
+      alm_id as almId,
+      repo_id as repoId,
+      project_uuid as projectUuid,
+      github_slug as githubSlug,
+      url
+    from alm_project_mappings
+    where
+      alm_id =#{almId, jdbcType=VARCHAR}
+      and repo_id in
+    <foreach collection="repoIds" open="(" close=")" item="repoId" separator=",">
+      #{repoId,jdbcType=VARCHAR}
+    </foreach>
+  </select>
+
 </mapper>
index 12c4616e6628083251aadd759a2067390ab43a71..e8fba5bc38a9ef412fdfe8e4e3d4a2e41381fc8b 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.db.alm;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -33,8 +34,10 @@ import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.tuple;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
+import static org.sonar.db.alm.ALM.BITBUCKETCLOUD;
 import static org.sonar.db.alm.ALM.GITHUB;
 
 public class AlmProjectMappingsDaoTest {
@@ -204,6 +207,24 @@ public class AlmProjectMappingsDaoTest {
     assertThat(underTest.mappingExists(dbSession, GITHUB, A_REPO)).isTrue();
   }
 
+  @Test
+  public void select_by_repo_ids() {
+    when(system2.now()).thenReturn(DATE);
+    when(uuidFactory.create())
+      .thenReturn("uuid1")
+      .thenReturn("uuid2")
+      .thenReturn("uuid3");
+    underTest.insertOrUpdate(dbSession, GITHUB, A_REPO, A_UUID, A_GITHUB_SLUG, A_URL);
+    underTest.insertOrUpdate(dbSession, GITHUB, ANOTHER_REPO, ANOTHER_UUID, null, ANOTHER_URL);
+    underTest.insertOrUpdate(dbSession, BITBUCKETCLOUD, ANOTHER_REPO, "foo", null, "http://foo");
+
+    assertThat(underTest.selectByRepoIds(dbSession, GITHUB, Arrays.asList(A_REPO, ANOTHER_REPO, "foo")))
+      .extracting(AlmProjectMappingDto::getUuid, AlmProjectMappingDto::getAlmId, AlmProjectMappingDto::getRepoId, AlmProjectMappingDto::getProjectUuid, AlmProjectMappingDto::getUrl, AlmProjectMappingDto::getGithubSlug)
+      .containsExactlyInAnyOrder(
+        tuple("uuid1", GITHUB.getId(), A_REPO, A_UUID, A_URL, A_GITHUB_SLUG),
+        tuple("uuid2", GITHUB.getId(), ANOTHER_REPO, ANOTHER_UUID, ANOTHER_URL, null));
+  }
+
   private void expectAlmNPE() {
     expectedException.expect(NullPointerException.class);
     expectedException.expectMessage("alm can't be null");