diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2017-06-29 11:22:29 +0200 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2017-07-04 16:29:36 +0200 |
commit | 597f139942a1f27d5e6f519388851a8fe37b0881 (patch) | |
tree | d20797bed0fcacb59df2b28125ffa7efb63012a5 /server | |
parent | 744a413b6c0f540117da5cc0ace02c72e81926f3 (diff) | |
download | sonarqube-597f139942a1f27d5e6f519388851a8fe37b0881.tar.gz sonarqube-597f139942a1f27d5e6f519388851a8fe37b0881.zip |
SONAR-9482 Count projects associated to quality profiles
Diffstat (limited to 'server')
6 files changed, 20 insertions, 6 deletions
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java index 494d623402e..600be7ac278 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileDao.java @@ -28,6 +28,7 @@ import java.util.Map; import javax.annotation.CheckForNull; import javax.annotation.Nullable; import org.sonar.api.utils.System2; +import org.sonar.core.util.stream.MoreCollectors; import org.sonar.db.Dao; import org.sonar.db.DatabaseUtils; import org.sonar.db.DbSession; @@ -167,8 +168,9 @@ public class QualityProfileDao implements Dao { return mapper(dbSession).selectByNameAndLanguages(organization.getUuid(), name, languages); } - public Map<String, Long> countProjectsByProfileUuid(DbSession dbSession, OrganizationDto organization) { - return KeyLongValue.toMap(mapper(dbSession).countProjectsByProfileUuid(organization.getUuid())); + public Map<String, Long> countProjectsByOrganizationAndProfiles(DbSession dbSession, OrganizationDto organization, List<QProfileDto> profiles) { + List<String> profileUuids = profiles.stream().map(QProfileDto::getKee).collect(MoreCollectors.toList()); + return KeyLongValue.toMap(executeLargeInputs(profileUuids, partition -> mapper(dbSession).countProjectsByOrganizationAndProfiles(organization.getUuid(), partition))); } public void insertProjectProfileAssociation(DbSession dbSession, ComponentDto project, QProfileDto profile) { diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileMapper.java index 758786dc15c..04def0160fd 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileMapper.java @@ -77,7 +77,7 @@ public interface QualityProfileMapper { // PROJECTS - List<KeyLongValue> countProjectsByProfileUuid(@Param("organizationUuid") String organizationUuid); + List<KeyLongValue> countProjectsByOrganizationAndProfiles(@Param("organizationUuid") String organizationUuid, @Param("profileUuids") List<String> profiles); @CheckForNull QProfileDto selectAssociatedToProjectUuidAndLanguage( diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml index 1f8add3639b..3f85132f1d4 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml @@ -205,7 +205,7 @@ ORDER BY rp.name </select> - <select id="countProjectsByProfileUuid" resultType="KeyLongValue" parameterType="map"> + <select id="countProjectsByOrganizationAndProfiles" resultType="KeyLongValue" parameterType="map"> select pqp.profile_key as "key", count(pj.uuid) as "value" from projects pj inner join project_qprofiles pqp on pqp.project_uuid = pj.uuid @@ -214,6 +214,9 @@ pj.enabled = ${_true} and pj.organization_uuid = #{organizationUuid, jdbcType=VARCHAR} and oqp.organization_uuid = pj.organization_uuid + and <foreach collection="profileUuids" item="profileUuid" open="(" separator=" or " close=")"> + oqp.uuid = #{profileUuid, jdbcType=VARCHAR} + </foreach> group by pqp.profile_key </select> diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QualityProfileDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QualityProfileDaoTest.java index 48ae7bd63ef..d254c2b412c 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QualityProfileDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QualityProfileDaoTest.java @@ -488,8 +488,10 @@ public class QualityProfileDaoTest { ComponentDto projectInOtherOrg = db.components().insertPrivateProject(otherOrg); db.qualityProfiles().associateWithProject(projectInOtherOrg, profileInOtherOrg); - assertThat(underTest.countProjectsByProfileUuid(dbSession, organization)).containsOnly( + assertThat(underTest.countProjectsByOrganizationAndProfiles(dbSession, organization, asList(profileWithoutProjects, profileWithProjects, profileInOtherOrg))).containsOnly( MapEntry.entry(profileWithProjects.getKee(), 2L)); + assertThat(underTest.countProjectsByOrganizationAndProfiles(dbSession, otherOrg, singletonList(profileWithoutProjects))).isEmpty(); + assertThat(underTest.countProjectsByOrganizationAndProfiles(dbSession, organization, Collections.emptyList())).isEmpty(); } @Test diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/SearchAction.java index 0600bd45062..e8b28c8ccad 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/SearchAction.java @@ -162,7 +162,7 @@ public class SearchAction implements QProfileWsAction { dbClient.activeRuleDao().countActiveRulesByQuery(dbSession, builder.setProfiles(profiles).build())) .setActiveDeprecatedRuleCountByProfileKey( dbClient.activeRuleDao().countActiveRulesByQuery(dbSession, builder.setProfiles(profiles).setRuleStatus(DEPRECATED).build())) - .setProjectCountByProfileKey(dbClient.qualityProfileDao().countProjectsByProfileUuid(dbSession, organization)) + .setProjectCountByProfileKey(dbClient.qualityProfileDao().countProjectsByOrganizationAndProfiles(dbSession, organization, profiles)) .setDefaultProfileKeys(defaultProfiles); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/SearchActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/SearchActionTest.java index c5764d1fb0c..ab8c20e38e7 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/SearchActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/SearchActionTest.java @@ -357,6 +357,13 @@ public class SearchActionTest { } @Test + public void no_profile() { + SearchWsResponse result = call(ws.newRequest()); + + assertThat(result.getProfilesList()).isEmpty(); + } + + @Test public void map_dates() { long time = DateUtils.parseDateTime("2016-12-22T19:10:03+0100").getTime(); qualityProfileDb.insert(newQualityProfileDto() |