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;
// 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);
--- /dev/null
+/*
+ * 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;
+ }
+}
*/
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;
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 {
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");
}
*/
package org.sonar.db.alm;
+import java.util.List;
import javax.annotation.Nullable;
import org.apache.ibatis.annotations.Param;
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);
}
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>
*/
package org.sonar.db.alm;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
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 {
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");