aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Duda <michal.duda@sonarsource.com>2019-04-02 18:20:18 +0200
committerSonarTech <sonartech@sonarsource.com>2019-04-03 20:21:06 +0200
commita4352cc55d433d33f37c5a3274d9150bb761cc0c (patch)
tree3ed1928003a8b53b7195bfc915421394814293ca
parent03da034980ce4559787a2b2621e75c2266c27e31 (diff)
downloadsonarqube-a4352cc55d433d33f37c5a3274d9150bb761cc0c.tar.gz
sonarqube-a4352cc55d433d33f37c5a3274d9150bb761cc0c.zip
SONAR-11917 Improved copy project measures step in portfolio recalculation
Changed implementation of copy project measures step in portfolio recalculation to use scrolling select.
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/measure/LiveMeasureDao.java9
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/measure/LiveMeasureMapper.java7
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/measure/LiveMeasureMapper.xml9
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/measure/LiveMeasureDaoTest.java38
4 files changed, 60 insertions, 3 deletions
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/measure/LiveMeasureDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/measure/LiveMeasureDao.java
index 2355e964c91..42c83faa85d 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/measure/LiveMeasureDao.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/measure/LiveMeasureDao.java
@@ -56,6 +56,15 @@ public class LiveMeasureDao implements Dao {
componentUuids -> mapper(dbSession).selectByComponentUuidsAndMetricIds(componentUuids, metricIds));
}
+ public void scrollSelectByComponentUuidAndMetricKeys(DbSession dbSession, String componentUuid, Collection<String> metricIds,
+ ResultHandler<LiveMeasureDto> handler) {
+ if (metricIds.isEmpty()) {
+ return;
+ }
+
+ mapper(dbSession).scrollSelectByComponentUuidAndMetricKeys(componentUuid, metricIds, handler);
+ }
+
public List<LiveMeasureDto> selectByComponentUuidsAndMetricKeys(DbSession dbSession, Collection<String> largeComponentUuids, Collection<String> metricKeys) {
if (largeComponentUuids.isEmpty() || metricKeys.isEmpty()) {
return Collections.emptyList();
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/measure/LiveMeasureMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/measure/LiveMeasureMapper.java
index 3018e66afa3..d7bc5fa9625 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/measure/LiveMeasureMapper.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/measure/LiveMeasureMapper.java
@@ -37,6 +37,11 @@ public interface LiveMeasureMapper {
@Param("componentUuids") Collection<String> componentUuids,
@Param("metricKeys") Collection<String> metricKeys);
+ void scrollSelectByComponentUuidAndMetricKeys(
+ @Param("componentUuid") String componentUuid,
+ @Param("metricKeys") Collection<String> metricKeys,
+ ResultHandler<LiveMeasureDto> handler);
+
LiveMeasureDto selectByComponentUuidAndMetricKey(
@Param("componentUuid") String componentUuid,
@Param("metricKey") String metricKey);
@@ -63,7 +68,7 @@ public interface LiveMeasureMapper {
int update(
@Param("dto") LiveMeasureDto dto,
@Param("now") long now);
-
+
int upsert(
@Param("dtos") List<LiveMeasureDto> dtos,
@Param("now") long now);
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/LiveMeasureMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/LiveMeasureMapper.xml
index 41488372e3e..8c08e03cfeb 100644
--- a/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/LiveMeasureMapper.xml
+++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/measure/LiveMeasureMapper.xml
@@ -169,6 +169,15 @@
</if>
</sql>
+ <select id="scrollSelectByComponentUuidAndMetricKeys" resultType="org.sonar.db.measure.LiveMeasureDto" fetchSize="${_scrollFetchSize}"
+ resultSetType="FORWARD_ONLY">
+ select <include refid="columns"/> from live_measures lm
+ inner join metrics m on m.id = lm.metric_id
+ where
+ m.name in <foreach item="metricKey" collection="metricKeys" open="(" separator="," close=")">#{metricKey, jdbcType=VARCHAR}</foreach>
+ and lm.component_uuid = #{componentUuid, jdbcType=VARCHAR}
+ </select>
+
<select id="selectTreeByQuery" parameterType="map" resultType="org.sonar.db.measure.LiveMeasureDto" fetchSize="${_scrollFetchSize}" resultSetType="FORWARD_ONLY">
select <include refid="columns"/> from live_measures lm
inner join projects p on p.uuid = lm.component_uuid
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/measure/LiveMeasureDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/measure/LiveMeasureDaoTest.java
index f55cc9b7a24..7d35e0ce13f 100644
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/measure/LiveMeasureDaoTest.java
+++ b/server/sonar-db-dao/src/test/java/org/sonar/db/measure/LiveMeasureDaoTest.java
@@ -30,6 +30,7 @@ import org.apache.commons.lang.RandomStringUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
+import org.mockito.internal.util.collections.Sets;
import org.sonar.api.utils.System2;
import org.sonar.db.DbTester;
import org.sonar.db.component.BranchType;
@@ -209,6 +210,40 @@ public class LiveMeasureDaoTest {
}
@Test
+ public void scrollSelectByComponentUuidAndMetricKeys_for_non_empty_metric_set() {
+ List<LiveMeasureDto> results = new ArrayList<>();
+ MetricDto metric = db.measures().insertMetric();
+ MetricDto metric2 = db.measures().insertMetric();
+ ComponentDto project = db.components().insertPrivateProject();
+ ComponentDto project2 = db.components().insertPrivateProject();
+ underTest.insert(db.getSession(), newLiveMeasure(project, metric).setValue(3.14));
+ underTest.insert(db.getSession(), newLiveMeasure(project, metric2).setValue(4.54));
+ underTest.insert(db.getSession(), newLiveMeasure(project2, metric).setValue(99.99));
+ underTest.scrollSelectByComponentUuidAndMetricKeys(db.getSession(), project.uuid(), Sets.newSet(metric.getKey(), metric2.getKey()),
+ context -> results.add(context.getResultObject()));
+
+ assertThat(results).hasSize(2);
+ LiveMeasureDto result = results.stream().filter(lm -> lm.getMetricId() == metric.getId()).findFirst().get();
+ assertThat(result.getComponentUuid()).isEqualTo(project.uuid());
+ assertThat(result.getMetricId()).isEqualTo(metric.getId());
+ assertThat(result.getValue()).isEqualTo(3.14);
+ LiveMeasureDto result2 = results.stream().filter(lm -> lm.getMetricId() == metric2.getId()).findFirst().get();
+ assertThat(result2.getComponentUuid()).isEqualTo(project.uuid());
+ assertThat(result2.getMetricId()).isEqualTo(metric2.getId());
+ assertThat(result2.getValue()).isEqualTo(4.54);
+ }
+
+ @Test
+ public void scrollSelectByComponentUuidAndMetricKeys_for_empty_metric_set() {
+ List<LiveMeasureDto> results = new ArrayList<>();
+ ComponentDto project = db.components().insertPrivateProject();
+ underTest.scrollSelectByComponentUuidAndMetricKeys(db.getSession(), project.uuid(), Sets.newSet(),
+ context -> results.add(context.getResultObject()));
+
+ assertThat(results).isEmpty();
+ }
+
+ @Test
public void selectTreeByQuery_with_empty_results() {
List<LiveMeasureDto> results = new ArrayList<>();
underTest.selectTreeByQuery(db.getSession(), newPrivateProjectDto(db.getDefaultOrganization()),
@@ -311,7 +346,6 @@ public class LiveMeasureDaoTest {
underTest.insert(db.getSession(), measure);
-
LiveMeasureDto result = underTest.selectMeasure(db.getSession(), file.uuid(), metric.getKey()).orElseThrow(() -> new IllegalArgumentException("Measure not found"));
assertThat(new String(result.getData(), StandardCharsets.UTF_8)).isEqualTo("text_value");
assertThat(result.getDataAsString()).isEqualTo("text_value");
@@ -451,7 +485,7 @@ public class LiveMeasureDaoTest {
underTest.upsert(db.getSession(), asList(dto));
// update
- dto.setData((String)null);
+ dto.setData((String) null);
int count = underTest.upsert(db.getSession(), asList(dto));
assertThat(count).isEqualTo(1);
verifyPersisted(dto);