diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2017-03-21 14:45:43 +0100 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2017-03-23 17:14:59 +0100 |
commit | c5eb8cdb70c6c2da5f4b5bcd72460a48e1c06e59 (patch) | |
tree | aefeb6711a5bb48a986f5d1020f57ba1107ff324 /server/sonar-db-dao | |
parent | 43a8901abae57754aa949673e666687cc7f9c98e (diff) | |
download | sonarqube-c5eb8cdb70c6c2da5f4b5bcd72460a48e1c06e59.tar.gz sonarqube-c5eb8cdb70c6c2da5f4b5bcd72460a48e1c06e59.zip |
SONAR-8962 Return sub views in api/measures/search
Diffstat (limited to 'server/sonar-db-dao')
5 files changed, 74 insertions, 2 deletions
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/measure/MeasureDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/measure/MeasureDao.java index 5fe987e31fd..6da95912528 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/measure/MeasureDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/measure/MeasureDao.java @@ -115,6 +115,10 @@ public class MeasureDao implements Dao { ids -> mapper(dbSession).selectProjectMeasuresOfDeveloper(developerId, metricIds)); } + public List<MeasureDto> selectByComponentsAndMetrics(DbSession dbSession, List<String> componentUuids, List<Integer> metricIds) { + return executeLargeInputs(componentUuids, partitionComponentUuids -> mapper(dbSession).selectByComponentsAndMetrics(partitionComponentUuids, metricIds)); + } + public void insert(DbSession session, MeasureDto measureDto) { mapper(session).insert(measureDto); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/measure/MeasureMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/measure/MeasureMapper.java index ecc0a306bea..33e1a0b36cd 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/measure/MeasureMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/measure/MeasureMapper.java @@ -40,5 +40,7 @@ public interface MeasureMapper { List<MeasureDto> selectProjectMeasuresOfDeveloper(@Param("developerId") long developerId, @Param("metricIds") Collection<Integer> metricIds); + List<MeasureDto> selectByComponentsAndMetrics(@Param("componentUuids") List<String> componentUuids, @Param("metricIds") Collection<Integer> metricIds); + void insert(MeasureDto measureDto); } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/MeasureMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/MeasureMapper.xml index 7db0a207c83..9654e0c514f 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/MeasureMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/MeasureMapper.xml @@ -170,6 +170,18 @@ and p.qualifier='TRK' </select> + <select id="selectByComponentsAndMetrics" parameterType="map" resultType="Measure"> + select <include refid="measureColumns"/> + from project_measures pm + inner join snapshots analysis on analysis.uuid = pm.analysis_uuid and analysis.islast=${_true} + inner join projects p on p.project_uuid=analysis.component_uuid and p.uuid=pm.component_uuid + <where> + and p.uuid in <foreach item="componentUuid" collection="componentUuids" open="(" separator="," close=")">#{componentUuid,jdbcType=VARCHAR}</foreach> + and pm.metric_id in <foreach item="metricId" collection="metricIds" open="(" separator="," close=")">#{metricId,jdbcType=INTEGER}</foreach> + and pm.person_id is null + </where> + </select> + <insert id="insert" parameterType="Measure" useGeneratedKeys="false"> insert into project_measures ( value, diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentTesting.java b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentTesting.java index 0f7b8b901a6..cd9d9d20275 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentTesting.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentTesting.java @@ -75,6 +75,11 @@ public class ComponentTesting { .setQualifier(Qualifiers.SUBVIEW); } + public static ComponentDto newSubView(ComponentDto viewOrSubView) { + String uuid = Uuids.createFast(); + return newSubView(viewOrSubView, uuid, "KEY_" + uuid); + } + public static ComponentDto newModuleDto(String uuid, ComponentDto parentModuleOrProject) { return newChildComponent(uuid, parentModuleOrProject, parentModuleOrProject) .setModuleUuidPath(parentModuleOrProject.moduleUuidPath() + uuid + UUID_PATH_SEPARATOR) diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/measure/MeasureDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/measure/MeasureDaoTest.java index a96f93de453..805ae709c1a 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/measure/MeasureDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/measure/MeasureDaoTest.java @@ -20,6 +20,7 @@ package org.sonar.db.measure; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Optional; import javax.annotation.Nullable; @@ -123,7 +124,7 @@ public class MeasureDaoTest { // project 1 insertMeasure("P1_M1", LAST_ANALYSIS_UUID, project1.uuid(), NCLOC_METRIC_ID); - insertMeasure("P1_M1", LAST_ANALYSIS_UUID, project1.uuid(), COVERAGE_METRIC_ID); + insertMeasure("P1_M2", LAST_ANALYSIS_UUID, project1.uuid(), COVERAGE_METRIC_ID); insertMeasure("P1_M3", OTHER_ANALYSIS_UUID, project1.uuid(), NCLOC_METRIC_ID); // project 2 insertMeasure("P2_M1", project2LastAnalysisUuid, project2.uuid(), NCLOC_METRIC_ID); @@ -195,7 +196,7 @@ public class MeasureDaoTest { // projects measures of last analysis verifyMeasures(MeasureQuery.builder().setProjectUuids(singletonList(project1.uuid())).setMetricId(NCLOC_METRIC_ID), "P1_M1"); verifyMeasures(MeasureQuery.builder().setProjectUuids(asList(project1.uuid(), project2.uuid())).setMetricIds(asList(NCLOC_METRIC_ID, COVERAGE_METRIC_ID)), - "P1_M1", "P2_M1", "P2_M2", "P2_M2"); + "P1_M1", "P1_M2", "P2_M1", "P2_M2", "P2_M2"); verifyMeasures(MeasureQuery.builder().setProjectUuids(asList(project1.uuid(), project2.uuid(), "UNKNOWN")).setMetricId(NCLOC_METRIC_ID), "P1_M1", "P2_M1"); // projects measures of none last analysis @@ -372,6 +373,54 @@ public class MeasureDaoTest { assertThat(result).hasSize(2).extracting(MeasureDto::getData).containsOnly("PROJECT_M1", "PROJECT_M2"); } + @Test + public void selectByComponentsAndMetrics() { + ComponentDto project1 = db.components().insertProject(db.getDefaultOrganization(), "P1"); + ComponentDto module = db.components().insertComponent(newModuleDto(project1)); + db.components().insertComponent(newFileDto(module).setUuid("C1")); + db.components().insertComponent(newFileDto(module).setUuid("C2")); + insertAnalysis(LAST_ANALYSIS_UUID, project1.uuid(), true); + insertAnalysis(OTHER_ANALYSIS_UUID, project1.uuid(), false); + + String project2LastAnalysisUuid = "P2_LAST_ANALYSIS"; + ComponentDto project2 = db.components().insertProject(db.getDefaultOrganization(), "P2"); + insertAnalysis(project2LastAnalysisUuid, project2.uuid(), true); + + // project 1 + insertMeasure("P1_M1", LAST_ANALYSIS_UUID, project1.uuid(), NCLOC_METRIC_ID); + insertMeasure("P1_M2", LAST_ANALYSIS_UUID, project1.uuid(), COVERAGE_METRIC_ID); + insertMeasure("P1_M3", OTHER_ANALYSIS_UUID, project1.uuid(), NCLOC_METRIC_ID); + // project 2 + insertMeasure("P2_M1", project2LastAnalysisUuid, project2.uuid(), NCLOC_METRIC_ID); + insertMeasure("P2_M2", project2LastAnalysisUuid, project2.uuid(), COVERAGE_METRIC_ID); + // component C1 + insertMeasure("M1", OTHER_ANALYSIS_UUID, "C1", NCLOC_METRIC_ID); + insertMeasure("M2", LAST_ANALYSIS_UUID, "C1", NCLOC_METRIC_ID); + insertMeasure("M3", LAST_ANALYSIS_UUID, "C1", COVERAGE_METRIC_ID); + insertMeasureOnPerson("M4", LAST_ANALYSIS_UUID, "C1", NCLOC_METRIC_ID, A_PERSON_ID); + insertMeasureOnPerson("M5", OTHER_ANALYSIS_UUID, "C1", NCLOC_METRIC_ID, 123L); + // component C2 + insertMeasure("M6", LAST_ANALYSIS_UUID, "C2", NCLOC_METRIC_ID); + db.commit(); + + assertThat(underTest.selectByComponentsAndMetrics(db.getSession(), Collections.emptyList(), Collections.emptyList())).isEmpty(); + + // Measures of component C1 + assertThat(underTest.selectByComponentsAndMetrics(db.getSession(), singletonList("C1"), singletonList(NCLOC_METRIC_ID))).extracting(MeasureDto::getData).containsOnly("M2"); + assertThat(underTest.selectByComponentsAndMetrics(db.getSession(), singletonList("C1"), asList(NCLOC_METRIC_ID, COVERAGE_METRIC_ID))).extracting(MeasureDto::getData) + .containsOnly("M2", "M3"); + + // ncloc measures of components C1, C2 + assertThat(underTest.selectByComponentsAndMetrics(db.getSession(), asList("C1", "C2"), asList(NCLOC_METRIC_ID, COVERAGE_METRIC_ID))).extracting(MeasureDto::getData) + .containsOnly("M2", "M3", "M6"); + + // projects measures of last analysis + assertThat(underTest.selectByComponentsAndMetrics(db.getSession(), singletonList("P1"), singletonList(NCLOC_METRIC_ID))).extracting(MeasureDto::getData) + .containsOnly("P1_M1"); + assertThat(underTest.selectByComponentsAndMetrics(db.getSession(), asList("P1", "P2"), asList(NCLOC_METRIC_ID, COVERAGE_METRIC_ID))).extracting(MeasureDto::getData) + .containsOnly("P1_M1", "P1_M2", "P2_M1", "P2_M2"); + } + private Optional<MeasureDto> selectSingle(MeasureQuery.Builder query) { return underTest.selectSingle(db.getSession(), query.build()); } |