aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2017-01-25 16:39:07 +0100
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2017-01-25 16:39:07 +0100
commit35485c876e9929e256a953f1fe20e726e5bbc915 (patch)
treea48648d03b82d101daf6befcd37b34452fb4deee /server
parent3e43924e631f72a35353525e74530f8e66f22ef3 (diff)
downloadsonarqube-35485c876e9929e256a953f1fe20e726e5bbc915.tar.gz
sonarqube-35485c876e9929e256a953f1fe20e726e5bbc915.zip
SONAR-7305 Improve performances of WS api/measures/search_history
Diffstat (limited to 'server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/measure/ws/SearchHistoryAction.java19
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/measure/ws/SearchHistoryResult.java25
2 files changed, 29 insertions, 15 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/measure/ws/SearchHistoryAction.java b/server/sonar-server/src/main/java/org/sonar/server/measure/ws/SearchHistoryAction.java
index 8400bef04ab..ab2d4394762 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/measure/ws/SearchHistoryAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/measure/ws/SearchHistoryAction.java
@@ -21,6 +21,7 @@
package org.sonar.server.measure.ws;
import com.google.common.collect.Sets;
+import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
@@ -39,6 +40,7 @@ import org.sonar.db.component.SnapshotQuery;
import org.sonar.db.component.SnapshotQuery.SORT_FIELD;
import org.sonar.db.component.SnapshotQuery.SORT_ORDER;
import org.sonar.db.measure.MeasureDto;
+import org.sonar.db.measure.PastMeasureQuery;
import org.sonar.db.metric.MetricDto;
import org.sonar.server.component.ComponentFinder;
import org.sonar.server.user.UserSession;
@@ -122,7 +124,7 @@ public class SearchHistoryAction implements MeasuresWsAction {
.setComponent(component)
.setAnalyses(searchAnalyses(dbSession, request, component))
.setMetrics(searchMetrics(dbSession, request));
- return result.setMeasures(searchMeasures(dbSession, component, result.getAnalyses(), result.getMetrics()));
+ return result.setMeasures(searchMeasures(dbSession, request, result));
}
};
}
@@ -133,12 +135,15 @@ public class SearchHistoryAction implements MeasuresWsAction {
return component;
}
- private List<MeasureDto> searchMeasures(DbSession dbSession, ComponentDto component, List<SnapshotDto> analyses, List<MetricDto> metrics) {
- return dbClient.measureDao().selectPastMeasures(
- dbSession,
- component.uuid(),
- analyses.stream().map(SnapshotDto::getUuid).collect(Collectors.toList()),
- metrics.stream().map(MetricDto::getId).collect(Collectors.toList()));
+ private List<MeasureDto> searchMeasures(DbSession dbSession, SearchHistoryRequest request, SearchHistoryResult result) {
+ Date from = parseStartingDateOrDateTime(request.getFrom());
+ Date to = parseEndingDateOrDateTime(request.getTo());
+ PastMeasureQuery dbQuery = new PastMeasureQuery(
+ result.getComponent().uuid(),
+ result.getMetrics().stream().map(MetricDto::getId).collect(Collectors.toList()),
+ from == null ? null : from.getTime(),
+ to == null ? null : (to.getTime() + 1_000L));
+ return dbClient.measureDao().selectPastMeasures(dbSession, dbQuery);
}
private List<SnapshotDto> searchAnalyses(DbSession dbSession, SearchHistoryRequest request, ComponentDto component) {
diff --git a/server/sonar-server/src/main/java/org/sonar/server/measure/ws/SearchHistoryResult.java b/server/sonar-server/src/main/java/org/sonar/server/measure/ws/SearchHistoryResult.java
index 3d23e3c4a3b..f2d3e52474f 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/measure/ws/SearchHistoryResult.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/measure/ws/SearchHistoryResult.java
@@ -25,6 +25,8 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.Table;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
+import org.sonar.core.util.stream.Collectors;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.SnapshotDto;
import org.sonar.db.measure.MeasureDto;
@@ -35,7 +37,6 @@ import org.sonarqube.ws.client.measure.SearchHistoryRequest;
import static java.util.Collections.emptyList;
import static java.util.Objects.requireNonNull;
import static org.sonar.api.utils.Paging.offset;
-import static org.sonar.core.util.stream.Collectors.toList;
import static org.sonar.db.metric.MetricDtoFunctions.isOptimizedForBestValue;
import static org.sonar.server.measure.ws.MetricDtoWithBestValue.isEligibleForBestValue;
@@ -51,8 +52,8 @@ class SearchHistoryResult {
this.request = request;
}
- boolean hasResults() {
- return !analyses.isEmpty();
+ public ComponentDto getComponent() {
+ return requireNonNull(component);
}
SearchHistoryResult setComponent(ComponentDto component) {
@@ -67,7 +68,8 @@ class SearchHistoryResult {
SearchHistoryResult setAnalyses(List<SnapshotDto> analyses) {
this.paging = Common.Paging.newBuilder().setPageIndex(request.getPage()).setPageSize(request.getPageSize()).setTotal(analyses.size()).build();
- this.analyses = analyses.stream().skip(offset(request.getPage(), request.getPageSize())).limit(request.getPageSize()).collect(toList());
+ this.analyses = analyses.stream().skip(offset(request.getPage(), request.getPageSize())).limit(request.getPageSize()).collect(Collectors.toList());
+
return this;
}
@@ -85,9 +87,16 @@ class SearchHistoryResult {
}
SearchHistoryResult setMeasures(List<MeasureDto> measures) {
- this.measures = ImmutableList.<MeasureDto>builder()
- .addAll(measures)
- .addAll(addBestValuesToMeasures(component, measures)).build();
+ Set<String> analysisUuids = analyses.stream().map(SnapshotDto::getUuid).collect(Collectors.toHashSet());
+ ImmutableList.Builder<MeasureDto> measuresBuilder = ImmutableList.builder();
+ List<MeasureDto> filteredMeasures = measures.stream()
+ .filter(measure -> analysisUuids.contains(measure.getAnalysisUuid()))
+ .collect(Collectors.toArrayList());
+ measuresBuilder.addAll(filteredMeasures);
+ measuresBuilder.addAll(computeBestValues(filteredMeasures));
+
+ this.measures = measuresBuilder.build();
+
return this;
}
@@ -98,7 +107,7 @@ class SearchHistoryResult {
* <li>metric is optimized for best value</li>
* </ul>
*/
- private List<MeasureDto> addBestValuesToMeasures(ComponentDto component, List<MeasureDto> measures) {
+ private List<MeasureDto> computeBestValues(List<MeasureDto> measures) {
if (!isEligibleForBestValue().test(component)) {
return emptyList();
}