From 3fbd83b3c0ca94b26c4968af2dc51a6ff46cc2de Mon Sep 17 00:00:00 2001 From: Daniel Schwarz Date: Tue, 23 May 2017 15:01:18 +0200 Subject: [PATCH] SONAR-9260 add "NO_DATA" range for coverage facets of project search --- .../it/projectSearch/SearchProjectsTest.java | 2 ++ .../measure/index/ProjectMeasuresIndex.java | 6 ++--- .../ws/SearchProjectsActionTest.java | 8 +++++-- .../index/ProjectMeasuresIndexTest.java | 24 ++++++++++++++++--- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/it/it-tests/src/test/java/it/projectSearch/SearchProjectsTest.java b/it/it-tests/src/test/java/it/projectSearch/SearchProjectsTest.java index 4d4b50369a3..4906a0481ce 100644 --- a/it/it-tests/src/test/java/it/projectSearch/SearchProjectsTest.java +++ b/it/it-tests/src/test/java/it/projectSearch/SearchProjectsTest.java @@ -164,6 +164,7 @@ public class SearchProjectsTest { tuple("WARN", 0L), tuple("ERROR", 0L)); checkFacet(response, "coverage", + tuple("NO_DATA", 2L), tuple("*-30.0", 0L), tuple("30.0-50.0", 0L), tuple("50.0-70.0", 0L), @@ -239,6 +240,7 @@ public class SearchProjectsTest { tuple("4", 0L), tuple("5", 0L)); checkFacet(response, "new_coverage", + tuple("NO_DATA", 2L), tuple("*-30.0", 0L), tuple("30.0-50.0", 0L), tuple("50.0-70.0", 0L), diff --git a/server/sonar-server/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndex.java b/server/sonar-server/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndex.java index 8fb31c3ee65..c784e13abbf 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndex.java @@ -121,8 +121,8 @@ public class ProjectMeasuresIndex { (esSearch, query, facetBuilder) -> addRangeFacetIncludingNoData(esSearch, DUPLICATED_LINES_DENSITY_KEY, facetBuilder, DUPLICATIONS_THRESHOLDS)) .put(NEW_DUPLICATED_LINES_DENSITY_KEY, (esSearch, query, facetBuilder) -> addRangeFacetIncludingNoData(esSearch, NEW_DUPLICATED_LINES_DENSITY_KEY, facetBuilder, DUPLICATIONS_THRESHOLDS)) - .put(COVERAGE_KEY, (esSearch, query, facetBuilder) -> addRangeFacet(esSearch, COVERAGE_KEY, facetBuilder, COVERAGE_THRESHOLDS)) - .put(NEW_COVERAGE_KEY, (esSearch, query, facetBuilder) -> addRangeFacet(esSearch, NEW_COVERAGE_KEY, facetBuilder, COVERAGE_THRESHOLDS)) + .put(COVERAGE_KEY, (esSearch, query, facetBuilder) -> addRangeFacetIncludingNoData(esSearch, COVERAGE_KEY, facetBuilder, COVERAGE_THRESHOLDS)) + .put(NEW_COVERAGE_KEY, (esSearch, query, facetBuilder) -> addRangeFacetIncludingNoData(esSearch, NEW_COVERAGE_KEY, facetBuilder, COVERAGE_THRESHOLDS)) .put(SQALE_RATING_KEY, (esSearch, query, facetBuilder) -> addRatingFacet(esSearch, SQALE_RATING_KEY, facetBuilder)) .put(NEW_MAINTAINABILITY_RATING_KEY, (esSearch, query, facetBuilder) -> addRatingFacet(esSearch, NEW_MAINTAINABILITY_RATING_KEY, facetBuilder)) .put(RELIABILITY_RATING_KEY, (esSearch, query, facetBuilder) -> addRatingFacet(esSearch, RELIABILITY_RATING_KEY, facetBuilder)) @@ -284,7 +284,7 @@ public class ProjectMeasuresIndex { BoolQueryBuilder metricFilters = boolQuery(); entry.getValue() .stream() - .map(criterion -> toQuery(criterion)) + .map(ProjectMeasuresIndex::toQuery) .forEach(metricFilters::must); filters.put(entry.getKey(), metricFilters); }); diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java index f54ef4b2e94..534cd77fdbc 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchProjectsActionTest.java @@ -743,6 +743,7 @@ public class SearchProjectsActionTest { userSession.logIn(); OrganizationDto organizationDto = db.organizations().insert(); MetricDto coverage = db.measureDbTester().insertMetric(c -> c.setKey(COVERAGE).setValueType(PERCENT.name())); + insertProject(organizationDto); insertProject(organizationDto, new Measure(coverage, c -> c.setValue(80d))); insertProject(organizationDto, new Measure(coverage, c -> c.setValue(85d))); insertProject(organizationDto, new Measure(coverage, c -> c.setValue(10d))); @@ -754,7 +755,8 @@ public class SearchProjectsActionTest { .findFirst().orElseThrow(IllegalStateException::new); assertThat(facet.getValuesList()) .extracting(Common.FacetValue::getVal, Common.FacetValue::getCount) - .containsExactly( + .containsOnly( + tuple("NO_DATA", 1L), tuple("*-30.0", 1L), tuple("30.0-50.0", 0L), tuple("50.0-70.0", 0L), @@ -767,6 +769,7 @@ public class SearchProjectsActionTest { userSession.logIn(); OrganizationDto organizationDto = db.organizations().insert(); MetricDto coverage = db.measureDbTester().insertMetric(c -> c.setKey(NEW_COVERAGE).setValueType(PERCENT.name())); + insertProject(organizationDto); insertProject(organizationDto, new Measure(coverage, c -> c.setVariation(80d))); insertProject(organizationDto, new Measure(coverage, c -> c.setVariation(85d))); insertProject(organizationDto, new Measure(coverage, c -> c.setVariation(10d))); @@ -778,7 +781,8 @@ public class SearchProjectsActionTest { .findFirst().orElseThrow(IllegalStateException::new); assertThat(facet.getValuesList()) .extracting(Common.FacetValue::getVal, Common.FacetValue::getCount) - .containsExactly( + .containsOnly( + tuple("NO_DATA", 1L), tuple("*-30.0", 1L), tuple("30.0-50.0", 0L), tuple("50.0-70.0", 0L), diff --git a/server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java b/server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java index 3affb0a44be..e6d819df1f4 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/measure/index/ProjectMeasuresIndexTest.java @@ -533,7 +533,8 @@ public class ProjectMeasuresIndexTest { entry("100000.0-500000.0", 2L), entry("500000.0-*", 0L)); // But facet on coverage does well take into into filters - assertThat(facets.get(COVERAGE)).containsExactly( + assertThat(facets.get(COVERAGE)).containsOnly( + entry("NO_DATA", 0L), entry("*-30.0", 3L), entry("30.0-50.0", 0L), entry("50.0-70.0", 0L), @@ -611,6 +612,8 @@ public class ProjectMeasuresIndexTest { @Test public void facet_coverage() { index( + // 1 doc with no coverage + newDocWithNoMeasure(), // 3 docs with coverage<30% newDoc(COVERAGE, 0d), newDoc(COVERAGE, 0d), @@ -635,7 +638,8 @@ public class ProjectMeasuresIndexTest { Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(COVERAGE)).getFacets(); - assertThat(facets.get(COVERAGE)).containsExactly( + assertThat(facets.get(COVERAGE)).containsOnly( + entry("NO_DATA", 1L), entry("*-30.0", 3L), entry("30.0-50.0", 2L), entry("50.0-70.0", 4L), @@ -646,6 +650,10 @@ public class ProjectMeasuresIndexTest { @Test public void facet_coverage_is_sticky() { index( + // docs with no coverage + newDoc(NCLOC, 999d, DUPLICATION, 0d), + newDoc(NCLOC, 999d, DUPLICATION, 1d), + newDoc(NCLOC, 999d, DUPLICATION, 20d), // docs with coverage<30% newDoc(NCLOC, 999d, COVERAGE, 0d, DUPLICATION, 0d), newDoc(NCLOC, 1_000d, COVERAGE, 10d, DUPLICATION, 0d), @@ -668,6 +676,7 @@ public class ProjectMeasuresIndexTest { // Sticky facet on coverage does not take into account coverage filter assertThat(facets.get(COVERAGE)).containsExactly( + entry("NO_DATA", 2L), entry("*-30.0", 3L), entry("30.0-50.0", 2L), entry("50.0-70.0", 1L), @@ -686,6 +695,8 @@ public class ProjectMeasuresIndexTest { public void facet_coverage_contains_only_projects_authorized_for_user() throws Exception { // User can see these projects indexForUser(USER1, + // 1 doc with no coverage + newDocWithNoMeasure(), // docs with coverage<30% newDoc(COVERAGE, 0d), newDoc(COVERAGE, 0d), @@ -696,6 +707,9 @@ public class ProjectMeasuresIndexTest { // User cannot see these projects indexForUser(USER2, + // 2 docs with no coverage + newDocWithNoMeasure(), + newDocWithNoMeasure(), // docs with coverage>=50% and coverage<70% newDoc(COVERAGE, 50d), // docs with coverage>=70% and coverage<80% @@ -707,6 +721,7 @@ public class ProjectMeasuresIndexTest { Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(COVERAGE)).getFacets(); assertThat(facets.get(COVERAGE)).containsExactly( + entry("NO_DATA", 1L), entry("*-30.0", 3L), entry("30.0-50.0", 2L), entry("50.0-70.0", 0L), @@ -717,6 +732,8 @@ public class ProjectMeasuresIndexTest { @Test public void facet_new_coverage() { index( + // 1 doc with no coverage + newDocWithNoMeasure(), // 3 docs with coverage<30% newDoc(NEW_COVERAGE, 0d), newDoc(NEW_COVERAGE, 0d), @@ -741,7 +758,8 @@ public class ProjectMeasuresIndexTest { Facets facets = underTest.search(new ProjectMeasuresQuery(), new SearchOptions().addFacets(NEW_COVERAGE)).getFacets(); - assertThat(facets.get(NEW_COVERAGE)).containsExactly( + assertThat(facets.get(NEW_COVERAGE)).containsOnly( + entry("NO_DATA", 1L), entry("*-30.0", 3L), entry("30.0-50.0", 2L), entry("50.0-70.0", 4L), -- 2.39.5