diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2017-01-25 16:39:07 +0100 |
---|---|---|
committer | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2017-01-25 16:39:07 +0100 |
commit | 35485c876e9929e256a953f1fe20e726e5bbc915 (patch) | |
tree | a48648d03b82d101daf6befcd37b34452fb4deee /server | |
parent | 3e43924e631f72a35353525e74530f8e66f22ef3 (diff) | |
download | sonarqube-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.java | 19 | ||||
-rw-r--r-- | server/sonar-server/src/main/java/org/sonar/server/measure/ws/SearchHistoryResult.java | 25 |
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(); } |