aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2016-10-20 18:12:41 +0200
committerJulien Lancelot <julien.lancelot@sonarsource.com>2016-10-24 15:11:23 +0200
commitbe7fe2686f3c4cb62c5351e81f6a51d3983e8547 (patch)
tree9f2548cfaa11d38c28d5ae22cdf17c0169e2bc38
parent5e3e8bd5ccf3ab8ae1fb675beb4c2f5de0ac22c5 (diff)
downloadsonarqube-be7fe2686f3c4cb62c5351e81f6a51d3983e8547.tar.gz
sonarqube-be7fe2686f3c4cb62c5351e81f6a51d3983e8547.zip
SONAR-8319 Add Quality Gate facet to WS api/components/search_projects
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/component/es/ProjectMeasuresIndex.java19
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/component/es/ProjectMeasuresIndexTest.java28
2 files changed, 42 insertions, 5 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/es/ProjectMeasuresIndex.java b/server/sonar-server/src/main/java/org/sonar/server/component/es/ProjectMeasuresIndex.java
index 3115942030e..f6767705457 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/component/es/ProjectMeasuresIndex.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/component/es/ProjectMeasuresIndex.java
@@ -31,6 +31,7 @@ import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.range.RangeBuilder;
import org.elasticsearch.search.sort.SortOrder;
+import org.sonar.api.measures.Metric;
import org.sonar.server.component.es.ProjectMeasuresQuery.MetricCriterion;
import org.sonar.server.es.BaseIndex;
import org.sonar.server.es.EsClient;
@@ -44,7 +45,7 @@ import static org.elasticsearch.index.query.QueryBuilders.nestedQuery;
import static org.elasticsearch.index.query.QueryBuilders.rangeQuery;
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
import static org.elasticsearch.index.query.QueryBuilders.termsQuery;
-import static org.elasticsearch.search.aggregations.AggregationBuilders.filters;
+import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY;
import static org.sonar.api.measures.CoreMetrics.COVERAGE_KEY;
import static org.sonar.api.measures.CoreMetrics.DUPLICATED_LINES_DENSITY_KEY;
import static org.sonar.api.measures.CoreMetrics.NCLOC_KEY;
@@ -84,12 +85,13 @@ public class ProjectMeasuresIndex extends BaseIndex {
.setQuery(esQuery)
.setFrom(searchOptions.getOffset())
.setSize(searchOptions.getLimit())
- .addAggregation(createRangeFacet(DUPLICATED_LINES_DENSITY_KEY, ImmutableList.of(3d, 5d, 10d, 20d)))
- .addAggregation(createRangeFacet(COVERAGE_KEY, ImmutableList.of(30d, 50d, 70d, 80d)))
- .addAggregation(createRangeFacet(NCLOC_KEY, ImmutableList.of(1_000d, 10_000d, 100_000d, 500_000d)))
+ .addAggregation(createQualityGateFacet())
.addAggregation(createRatingFacet(SQALE_RATING_KEY))
.addAggregation(createRatingFacet(RELIABILITY_RATING_KEY))
.addAggregation(createRatingFacet(SECURITY_RATING_KEY))
+ .addAggregation(createRangeFacet(DUPLICATED_LINES_DENSITY_KEY, ImmutableList.of(3d, 5d, 10d, 20d)))
+ .addAggregation(createRangeFacet(COVERAGE_KEY, ImmutableList.of(30d, 50d, 70d, 80d)))
+ .addAggregation(createRangeFacet(NCLOC_KEY, ImmutableList.of(1_000d, 10_000d, 100_000d, 500_000d)))
.addSort(FIELD_NAME + "." + SORT_SUFFIX, SortOrder.ASC);
return new SearchIdResult<>(request.get(), id -> id);
@@ -124,7 +126,7 @@ public class ProjectMeasuresIndex extends BaseIndex {
.subAggregation(
AggregationBuilders.filter("filter_" + metricKey)
.filter(termsQuery(FIELD_KEY, metricKey))
- .subAggregation(filters(metricKey)
+ .subAggregation(AggregationBuilders.filters(metricKey)
.filter("1", termQuery(FIELD_VALUE, 1d))
.filter("2", termQuery(FIELD_VALUE, 2d))
.filter("3", termQuery(FIELD_VALUE, 3d))
@@ -132,6 +134,13 @@ public class ProjectMeasuresIndex extends BaseIndex {
.filter("5", termQuery(FIELD_VALUE, 5d))));
}
+ private static AggregationBuilder createQualityGateFacet() {
+ return AggregationBuilders.filters(ALERT_STATUS_KEY)
+ .filter(Metric.Level.ERROR.name(), termQuery(FIELD_QUALITY_GATE, Metric.Level.ERROR.name()))
+ .filter(Metric.Level.WARN.name(), termQuery(FIELD_QUALITY_GATE, Metric.Level.WARN.name()))
+ .filter(Metric.Level.OK.name(), termQuery(FIELD_QUALITY_GATE, Metric.Level.OK.name()));
+ }
+
private QueryBuilder createEsQuery(ProjectMeasuresQuery query) {
BoolQueryBuilder filters = boolQuery()
.must(createAuthorizationFilter());
diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/es/ProjectMeasuresIndexTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/es/ProjectMeasuresIndexTest.java
index 7f08375a874..b5c07e0d4bc 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/component/es/ProjectMeasuresIndexTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/component/es/ProjectMeasuresIndexTest.java
@@ -22,6 +22,7 @@ package org.sonar.server.component.es;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableMap;
import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.IntStream;
@@ -29,6 +30,7 @@ import javax.annotation.Nullable;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.config.MapSettings;
+import org.sonar.api.measures.Metric.Level;
import org.sonar.server.component.es.ProjectMeasuresQuery.MetricCriterion;
import org.sonar.server.component.es.ProjectMeasuresQuery.Operator;
import org.sonar.server.es.EsTester;
@@ -42,6 +44,7 @@ import static com.google.common.collect.Lists.newArrayList;
import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
+import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY;
import static org.sonar.api.measures.Metric.Level.OK;
import static org.sonar.api.security.DefaultGroups.ANYONE;
import static org.sonar.server.component.es.ProjectMeasuresIndexDefinition.INDEX_PROJECT_MEASURES;
@@ -453,6 +456,31 @@ public class ProjectMeasuresIndexTest {
entry("5", 5L));
}
+ @Test
+ public void facet_quality_gate() {
+ addDocs(
+ // 2 docs with QG OK
+ newDoc("P11", "K1", "N1").setQualityGate(Level.OK.name()),
+ newDoc("P12", "K1", "N1").setQualityGate(Level.OK.name()),
+ // 3 docs with QG WARN
+ newDoc("P21", "K1", "N1").setQualityGate(Level.WARN.name()),
+ newDoc("P22", "K1", "N1").setQualityGate(Level.WARN.name()),
+ newDoc("P23", "K1", "N1").setQualityGate(Level.WARN.name()),
+ // 4 docs with QG ERROR
+ newDoc("P31", "K1", "N1").setQualityGate(Level.ERROR.name()),
+ newDoc("P32", "K1", "N1").setQualityGate(Level.ERROR.name()),
+ newDoc("P33", "K1", "N1").setQualityGate(Level.ERROR.name()),
+ newDoc("P34", "K1", "N1").setQualityGate(Level.ERROR.name()));
+
+ LinkedHashMap<String, Long> result = underTest.search(new ProjectMeasuresQuery(), new SearchOptions()).getFacets().get(ALERT_STATUS_KEY);
+
+ assertThat(result).containsExactly(
+ entry(Level.ERROR.name(), 4L),
+ entry(Level.WARN.name(), 3L),
+ entry(Level.OK.name(), 2L)
+ );
+ }
+
private void addDocs(ProjectMeasuresDoc... docs) {
addDocs(null, ANYONE, docs);
}