diff options
author | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2015-11-24 09:44:04 +0100 |
---|---|---|
committer | Sébastien Lesaint <sebastien.lesaint@sonarsource.com> | 2015-11-25 15:33:07 +0100 |
commit | 63bd0008b7563283652b35000cd002b00ef37532 (patch) | |
tree | 678fb35556b487aa4d690f3c4aec257d41bd88c4 | |
parent | bad09c69eb3a4f51b8a8f539bde20612021e1917 (diff) | |
download | sonarqube-63bd0008b7563283652b35000cd002b00ef37532.tar.gz sonarqube-63bd0008b7563283652b35000cd002b00ef37532.zip |
SONAR-7027 add MeasureDao#selectByDeveloperForSnapshotAndMetrics
this method is used by Dev Cockpit to copy measures of a specific developer from a project to a copy of this project
5 files changed, 138 insertions, 6 deletions
diff --git a/sonar-db/src/main/java/org/sonar/db/measure/MeasureDao.java b/sonar-db/src/main/java/org/sonar/db/measure/MeasureDao.java index fa8b93f4348..13b27d68768 100644 --- a/sonar-db/src/main/java/org/sonar/db/measure/MeasureDao.java +++ b/sonar-db/src/main/java/org/sonar/db/measure/MeasureDao.java @@ -26,6 +26,7 @@ import java.util.Collection; import java.util.List; import java.util.Set; import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import org.sonar.db.Dao; import org.sonar.db.DatabaseUtils; import org.sonar.db.DbSession; @@ -79,6 +80,19 @@ public class MeasureDao implements Dao { }); } + /** + * Used by plugin Developer Cockpit + */ + public List<MeasureDto> selectByDeveloperForSnapshotAndMetrics(final DbSession dbSession, final long developerId, final long snapshotId, Collection<Integer> metricIds) { + return DatabaseUtils.executeLargeInputs(metricIds, new Function<List<Integer>, List<MeasureDto>>() { + @Override + @Nonnull + public List<MeasureDto> apply(@Nonnull List<Integer> input) { + return mapper(dbSession).selectByDeveloperForSnapshotAndMetrics(developerId, snapshotId, input); + } + }); + } + public void insert(DbSession session, MeasureDto measureDto) { mapper(session).insert(measureDto); } diff --git a/sonar-db/src/main/java/org/sonar/db/measure/MeasureMapper.java b/sonar-db/src/main/java/org/sonar/db/measure/MeasureMapper.java index 301dff9e629..fc6debc0a62 100644 --- a/sonar-db/src/main/java/org/sonar/db/measure/MeasureMapper.java +++ b/sonar-db/src/main/java/org/sonar/db/measure/MeasureMapper.java @@ -32,6 +32,8 @@ public interface MeasureMapper { List<MeasureDto> selectBySnapshotAndMetricKeys(@Param("snapshotId") long snapshotId, @Param("metricKeys") List<String> metricKeys); + List<MeasureDto> selectByDeveloperForSnapshotAndMetrics(@Param("developerId") long developerId, @Param("snapshotId") long snapshotId, @Param("metricIds") List<Integer> metricIds); + @CheckForNull MeasureDto selectByComponentAndMetric(@Param("componentKey") String componentKey, @Param("metricKey") String metricKey); diff --git a/sonar-db/src/main/resources/org/sonar/db/measure/MeasureMapper.xml b/sonar-db/src/main/resources/org/sonar/db/measure/MeasureMapper.xml index 8b104d9049e..7874e1e2d20 100644 --- a/sonar-db/src/main/resources/org/sonar/db/measure/MeasureMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/measure/MeasureMapper.xml @@ -76,6 +76,22 @@ </where> </select> + <select id="selectByDeveloperForSnapshotAndMetrics" parameterType="map" resultType="Measure"> + SELECT + <include refid="measureColumns"/> + FROM project_measures pm + <where> + pm.snapshot_id = #{snapshotId} + AND pm.rule_id is NULL + AND pm.characteristic_id is NULL + AND pm.person_id = #{developerId} + AND + <foreach item="metricId" index="index" collection="metricIds" open="(" separator=" or " close=")"> + pm.metric_id=#{metricId} + </foreach> + </where> + </select> + <select id="countByComponentAndMetric" parameterType="map" resultType="long"> SELECT count(pm.id) FROM project_measures pm diff --git a/sonar-db/src/test/java/org/sonar/db/measure/MeasureDaoTest.java b/sonar-db/src/test/java/org/sonar/db/measure/MeasureDaoTest.java index a714ad0fffb..60538b15b0e 100644 --- a/sonar-db/src/test/java/org/sonar/db/measure/MeasureDaoTest.java +++ b/sonar-db/src/test/java/org/sonar/db/measure/MeasureDaoTest.java @@ -24,6 +24,7 @@ import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import java.util.Collections; import java.util.List; @@ -44,6 +45,12 @@ import static org.assertj.guava.api.Assertions.assertThat; @Category(DbTests.class) public class MeasureDaoTest { + private static final int SNAPSHOT_ID = 5; + private static final long DEVELOPER_ID = 333L; + private static final int AUTHORS_BY_LINE_METRIC_ID = 10; + private static final int COVERAGE_LINE_HITS_DATA_METRIC_ID = 11; + private static final int NCLOC_METRIC_ID = 12; + @Rule public DbTester db = DbTester.create(System2.INSTANCE); @@ -111,7 +118,7 @@ public class MeasureDaoTest { public void select_by_snapshotId_and_metrics() { db.prepareDbUnit(getClass(), "shared.xml"); - List<MeasureDto> results = underTest.selectBySnapshotIdAndMetricKeys(5l, ImmutableSet.of("ncloc", "authors_by_line"), db.getSession()); + List<MeasureDto> results = underTest.selectBySnapshotIdAndMetricKeys(SNAPSHOT_ID, ImmutableSet.of("ncloc", "authors_by_line"), db.getSession()); assertThat(results).hasSize(2); Optional<MeasureDto> optional = FluentIterable.from(results).filter(new Predicate<MeasureDto>() { @@ -273,10 +280,10 @@ public class MeasureDaoTest { public void select_by_snapshot_and_metric_keys() throws Exception { db.prepareDbUnit(getClass(), "select_by_snapshot_and_metric_keys.xml"); - List<MeasureDto> results = underTest.selectBySnapshotIdAndMetricKeys(5, newHashSet("ncloc", "authors_by_line"), db.getSession()); + List<MeasureDto> results = underTest.selectBySnapshotIdAndMetricKeys(SNAPSHOT_ID, newHashSet("ncloc", "authors_by_line"), db.getSession()); assertThat(results).hasSize(2); - results = underTest.selectBySnapshotIdAndMetricKeys(5, newHashSet("ncloc"), db.getSession()); + results = underTest.selectBySnapshotIdAndMetricKeys(SNAPSHOT_ID, newHashSet("ncloc"), db.getSession()); assertThat(results).hasSize(1); MeasureDto result = results.get(0); @@ -289,14 +296,14 @@ public class MeasureDaoTest { assertThat(result.getVariation(5)).isEqualTo(-5d); assertThat(underTest.selectBySnapshotIdAndMetricKeys(123, newHashSet("ncloc"), db.getSession())).isEmpty(); - assertThat(underTest.selectBySnapshotIdAndMetricKeys(5, Collections.<String>emptySet(), db.getSession())).isEmpty(); + assertThat(underTest.selectBySnapshotIdAndMetricKeys(SNAPSHOT_ID, Collections.<String>emptySet(), db.getSession())).isEmpty(); } @Test public void select_by_snapshot_and_metric_keys_return_measures_with_rule_id() throws Exception { db.prepareDbUnit(getClass(), "select_by_snapshot_and_metric_keys_with_rule_id.xml"); - List<MeasureDto> results = underTest.selectBySnapshotIdAndMetricKeys(5, newHashSet("ncloc"), db.getSession()); + List<MeasureDto> results = underTest.selectBySnapshotIdAndMetricKeys(SNAPSHOT_ID, newHashSet("ncloc"), db.getSession()); assertThat(results).hasSize(3); Map<Long, MeasureDto> measuresById = measuresById(results); @@ -309,7 +316,7 @@ public class MeasureDaoTest { public void select_by_snapshot_and_metric_keys_return_measures_with_characteristic_id() throws Exception { db.prepareDbUnit(getClass(), "select_by_snapshot_and_metric_keys_with_characteristic_id.xml"); - List<MeasureDto> results = underTest.selectBySnapshotIdAndMetricKeys(5, newHashSet("ncloc"), db.getSession()); + List<MeasureDto> results = underTest.selectBySnapshotIdAndMetricKeys(SNAPSHOT_ID, newHashSet("ncloc"), db.getSession()); assertThat(results).hasSize(3); Map<Long, MeasureDto> measuresById = measuresById(results); @@ -319,6 +326,61 @@ public class MeasureDaoTest { } @Test + public void selectByDeveloperForSnapshotAndMetrics_when_there_is_no_measure_for_developer_returns_empty() { + db.prepareDbUnit(getClass(), "shared.xml"); + + List<MeasureDto> measureDtos = underTest.selectByDeveloperForSnapshotAndMetrics(db.getSession(), + DEVELOPER_ID, SNAPSHOT_ID, + ImmutableList.of(AUTHORS_BY_LINE_METRIC_ID, COVERAGE_LINE_HITS_DATA_METRIC_ID, NCLOC_METRIC_ID)); + + assertThat(measureDtos).isEmpty(); + } + + @Test + public void selectByDeveloperForSnapshotAndMetrics_returns_only_measures_for_developer() { + db.prepareDbUnit(getClass(), "with_some_measures_for_developer.xml"); + + List<MeasureDto> measureDtos = underTest.selectByDeveloperForSnapshotAndMetrics(db.getSession(), + DEVELOPER_ID, SNAPSHOT_ID, + ImmutableList.of(AUTHORS_BY_LINE_METRIC_ID, COVERAGE_LINE_HITS_DATA_METRIC_ID, NCLOC_METRIC_ID)); + + assertThat(measureDtos).extracting("id").containsOnly(30L, 31L, 32L); + } + + @Test + public void selectByDeveloperForSnapshotAndMetrics_returns_only_measures_for_developer_and_specified_metric_id() { + db.prepareDbUnit(getClass(), "with_some_measures_for_developer.xml"); + + List<MeasureDto> measureDtos = underTest.selectByDeveloperForSnapshotAndMetrics(db.getSession(), + DEVELOPER_ID, SNAPSHOT_ID, + ImmutableList.of(NCLOC_METRIC_ID)); + + assertThat(measureDtos).extracting("id").containsOnly(32L); + } + + @Test + public void selectByDeveloperForSnapshotAndMetrics_returns_empty_when_single_metric_id_does_not_exist() { + db.prepareDbUnit(getClass(), "with_some_measures_for_developer.xml"); + + List<MeasureDto> measureDtos = underTest.selectByDeveloperForSnapshotAndMetrics(db.getSession(), + DEVELOPER_ID, SNAPSHOT_ID, + ImmutableList.of(666)); + + assertThat(measureDtos).isEmpty(); + } + + @Test + public void selectByDeveloperForSnapshotAndMetrics_returns_empty_when_snapshotId_does_not_exist() { + db.prepareDbUnit(getClass(), "with_some_measures_for_developer.xml"); + + List<MeasureDto> measureDtos = underTest.selectByDeveloperForSnapshotAndMetrics(db.getSession(), + DEVELOPER_ID, 10, + ImmutableList.of(AUTHORS_BY_LINE_METRIC_ID, COVERAGE_LINE_HITS_DATA_METRIC_ID, NCLOC_METRIC_ID)); + + assertThat(measureDtos).isEmpty(); + } + + @Test public void insert() { db.prepareDbUnit(getClass(), "empty.xml"); diff --git a/sonar-db/src/test/resources/org/sonar/db/measure/MeasureDaoTest/with_some_measures_for_developer.xml b/sonar-db/src/test/resources/org/sonar/db/measure/MeasureDaoTest/with_some_measures_for_developer.xml new file mode 100644 index 00000000000..a6978d6dc54 --- /dev/null +++ b/sonar-db/src/test/resources/org/sonar/db/measure/MeasureDaoTest/with_some_measures_for_developer.xml @@ -0,0 +1,38 @@ +<dataset> + + <metrics id="10" name="authors_by_line"/> + <metrics id="11" name="coverage_line_hits_data"/> + <metrics id="12" name="ncloc"/> + + <projects id="1" kee="org.struts:struts-core:src/org/struts/RequestContext.java" enabled="[true]"/> + <projects id="333" kee="dev:John-Doe" enabled="[true]"/> + + <snapshots id="5" project_id="1" islast="[true]" /> + + <project_measures id="20" snapshot_id="5" metric_id="10" value="[null]" text_value="0123456789012345678901234567890123456789" measure_data="[null]" + variation_value_1="[null]" variation_value_2="[null]" variation_value_3="[null]" variation_value_4="[null]" variation_value_5="[null]" + alert_status="[null]" alert_text="[null]" + person_id="[null]"/> + <project_measures id="21" snapshot_id="5" metric_id="11" value="[null]" text_value="36=1;37=1;38=1;39=1;43=1;48=1;53=1" measure_data="[null]" + variation_value_1="[null]" variation_value_2="[null]" variation_value_3="[null]" variation_value_4="[null]" variation_value_5="[null]" + alert_status="[null]" alert_text="[null]" + person_id="[null]"/> + <project_measures id="22" snapshot_id="5" metric_id="12" value="10" text_value="[null]" measure_data="[null]" + variation_value_1="1" variation_value_2="2" variation_value_3="3" variation_value_4="4" variation_value_5="-5" + alert_status="OK" alert_text="Green" + person_id="[null]"/> + <!--measures for developer 333--> + <project_measures id="30" snapshot_id="5" metric_id="10" value="[null]" text_value="0123456789012345678901234567890123456789" measure_data="[null]" + variation_value_1="[null]" variation_value_2="[null]" variation_value_3="[null]" variation_value_4="[null]" variation_value_5="[null]" + alert_status="[null]" alert_text="[null]" + person_id="333"/> + <project_measures id="31" snapshot_id="5" metric_id="11" value="[null]" text_value="36=1;37=1;38=1;39=1;43=1;48=1;53=1" measure_data="[null]" + variation_value_1="[null]" variation_value_2="[null]" variation_value_3="[null]" variation_value_4="[null]" variation_value_5="[null]" + alert_status="[null]" alert_text="[null]" + person_id="333"/> + <project_measures id="32" snapshot_id="5" metric_id="12" value="10" text_value="[null]" measure_data="[null]" + variation_value_1="1" variation_value_2="2" variation_value_3="3" variation_value_4="4" variation_value_5="-5" + alert_status="OK" alert_text="Green" + person_id="333"/> + +</dataset> |