diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2016-10-20 18:12:41 +0200 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2016-10-24 15:11:23 +0200 |
commit | be7fe2686f3c4cb62c5351e81f6a51d3983e8547 (patch) | |
tree | 9f2548cfaa11d38c28d5ae22cdf17c0169e2bc38 | |
parent | 5e3e8bd5ccf3ab8ae1fb675beb4c2f5de0ac22c5 (diff) | |
download | sonarqube-be7fe2686f3c4cb62c5351e81f6a51d3983e8547.tar.gz sonarqube-be7fe2686f3c4cb62c5351e81f6a51d3983e8547.zip |
SONAR-8319 Add Quality Gate facet to WS api/components/search_projects
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); } |