aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-db-dao
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2017-03-21 14:45:43 +0100
committerJulien Lancelot <julien.lancelot@sonarsource.com>2017-03-23 17:14:59 +0100
commitc5eb8cdb70c6c2da5f4b5bcd72460a48e1c06e59 (patch)
treeaefeb6711a5bb48a986f5d1020f57ba1107ff324 /server/sonar-db-dao
parent43a8901abae57754aa949673e666687cc7f9c98e (diff)
downloadsonarqube-c5eb8cdb70c6c2da5f4b5bcd72460a48e1c06e59.tar.gz
sonarqube-c5eb8cdb70c6c2da5f4b5bcd72460a48e1c06e59.zip
SONAR-8962 Return sub views in api/measures/search
Diffstat (limited to 'server/sonar-db-dao')
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/measure/MeasureDao.java4
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/measure/MeasureMapper.java2
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/measure/MeasureMapper.xml12
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentTesting.java5
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/measure/MeasureDaoTest.java53
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());
}