From 86b4023643943d54f9a9392bd3a22d9098c87bc9 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Mon, 6 Mar 2017 17:26:55 +0100 Subject: [PATCH] SONAR-8838 Return selected tags in facet --- .../component/ws/SearchProjectsAction.java | 2 + .../measure/index/ProjectMeasuresIndex.java | 11 ++--- .../ws/SearchProjectsActionTest.java | 44 ++++++++++++++++++- .../index/ProjectMeasuresIndexTest.java | 12 +++++ 4 files changed, 63 insertions(+), 6 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java b/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java index 464d1e8aa44..3be2b0458ee 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java @@ -79,6 +79,7 @@ import static org.sonarqube.ws.client.component.ComponentsWsParameters.PARAM_ORG import static org.sonarqube.ws.client.component.SearchProjectsRequest.DEFAULT_PAGE_SIZE; import static org.sonarqube.ws.client.component.SearchProjectsRequest.MAX_PAGE_SIZE; import static org.sonarqube.ws.client.project.ProjectsWsParameters.FILTER_LANGUAGES; +import static org.sonarqube.ws.client.project.ProjectsWsParameters.FILTER_TAGS; public class SearchProjectsAction implements ComponentsWsAction { @@ -311,6 +312,7 @@ public class SearchProjectsAction implements ComponentsWsAction { EsToWsFacet esToWsFacet = new EsToWsFacet(); searchResults.query.getLanguages().ifPresent(languages -> addMandatoryValuesToFacet(esFacets, FILTER_LANGUAGES, languages)); + searchResults.query.getTags().ifPresent(tags -> addMandatoryValuesToFacet(esFacets, FILTER_TAGS, tags)); Common.Facets wsFacets = esFacets.getAll().entrySet().stream() .map(esToWsFacet) .collect(Collector.of( 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 7a1290fee6a..e9e928356b5 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 @@ -111,7 +111,7 @@ public class ProjectMeasuresIndex extends BaseIndex { .put(SECURITY_RATING_KEY, (esSearch, query, facetBuilder) -> addRatingFacet(esSearch, SECURITY_RATING_KEY, facetBuilder)) .put(ALERT_STATUS_KEY, (esSearch, query, facetBuilder) -> esSearch.addAggregation(createStickyFacet(ALERT_STATUS_KEY, facetBuilder, createQualityGateFacet()))) .put(FILTER_LANGUAGES, ProjectMeasuresIndex::addLanguagesFacet) - .put(FIELD_TAGS, (esSearch, query, facetBuilder) -> esSearch.addAggregation(createStickyFacet(FIELD_TAGS, facetBuilder, createTagsFacet()))) + .put(FIELD_TAGS, ProjectMeasuresIndex::addTagsFacet) .build(); private final AuthorizationTypeSupport authorizationTypeSupport; @@ -182,6 +182,11 @@ public class ProjectMeasuresIndex extends BaseIndex { esSearch.addAggregation(facetBuilder.buildStickyFacet(FIELD_LANGUAGES, FILTER_LANGUAGES, languages.isPresent() ? languages.get().toArray() : new Object[] {})); } + private static void addTagsFacet(SearchRequestBuilder esSearch, ProjectMeasuresQuery query, StickyFacetBuilder facetBuilder) { + Optional> tags = query.getTags(); + esSearch.addAggregation(facetBuilder.buildStickyFacet(FIELD_TAGS, FILTER_TAGS, tags.isPresent() ? tags.get().toArray() : new Object[] {})); + } + private static AbstractAggregationBuilder createStickyFacet(String facetKey, StickyFacetBuilder facetBuilder, AbstractAggregationBuilder aggregationBuilder) { BoolQueryBuilder facetFilter = facetBuilder.getStickyFacetFilter(facetKey); return AggregationBuilders @@ -235,10 +240,6 @@ public class ProjectMeasuresIndex extends BaseIndex { return qualityGateStatusFilter; } - private static AbstractAggregationBuilder createTagsFacet() { - return AggregationBuilders.terms(FIELD_TAGS).field(FIELD_TAGS); - } - private Map createFilters(ProjectMeasuresQuery query) { Map filters = new HashMap<>(); filters.put("__authorization", authorizationTypeSupport.createQueryFilter()); 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 1a7cec6e723..ca2f975809d 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 @@ -92,6 +92,7 @@ import static org.sonar.test.JsonAssert.assertJson; import static org.sonarqube.ws.client.component.ComponentsWsParameters.PARAM_FILTER; import static org.sonarqube.ws.client.component.ComponentsWsParameters.PARAM_ORGANIZATION; import static org.sonarqube.ws.client.project.ProjectsWsParameters.FILTER_LANGUAGES; +import static org.sonarqube.ws.client.project.ProjectsWsParameters.FILTER_TAGS; public class SearchProjectsActionTest { @@ -306,7 +307,6 @@ public class SearchProjectsActionTest { insertProjectInDbAndEs(newProjectDto(organizationDto).setName("Sonar Java").setTags(newArrayList("finance", "platform"))); insertProjectInDbAndEs(newProjectDto(organizationDto).setName("Sonar Markdown").setTags(singletonList("marketing"))); insertProjectInDbAndEs(newProjectDto(organizationDto).setName("Sonar Qube").setTags(newArrayList("offshore"))); - insertMetrics(COVERAGE, NCLOC); request.setFilter("tags in (finance, offshore)"); SearchProjectsWsResponse result = call(request); @@ -504,6 +504,48 @@ public class SearchProjectsActionTest { tuple("", 1L)); } + @Test + public void return_tags_facet() { + OrganizationDto organization = db.getDefaultOrganization(); + insertProjectInDbAndEs(newProjectDto(organization).setName("Sonar Java").setTags(newArrayList("finance", "platform"))); + insertProjectInDbAndEs(newProjectDto(organization).setName("Sonar Markdown").setTags(singletonList("offshore"))); + insertProjectInDbAndEs(newProjectDto(organization).setName("Sonar Qube").setTags(newArrayList("offshore"))); + + SearchProjectsWsResponse result = call(request.setFacets(singletonList(FILTER_TAGS))); + + Common.Facet facet = result.getFacets().getFacetsList().stream() + .filter(oneFacet -> FILTER_TAGS.equals(oneFacet.getProperty())) + .findFirst().orElseThrow(IllegalStateException::new); + assertThat(facet.getProperty()).isEqualTo(FILTER_TAGS); + assertThat(facet.getValuesList()) + .extracting(Common.FacetValue::getVal, Common.FacetValue::getCount) + .containsExactly( + tuple("offshore", 2L), + tuple("finance", 1L), + tuple("platform", 1L)); + } + + @Test + public void return_tags_facet_with_tags_having_no_project_if_tags_is_in_filter() { + OrganizationDto organization = db.getDefaultOrganization(); + insertProjectInDbAndEs(newProjectDto(organization).setName("Sonar Java").setTags(newArrayList("finance", "platform"))); + insertProjectInDbAndEs(newProjectDto(organization).setName("Sonar Markdown").setTags(singletonList("offshore"))); + insertProjectInDbAndEs(newProjectDto(organization).setName("Sonar Qube").setTags(newArrayList("offshore"))); + + SearchProjectsWsResponse result = call(request.setFilter("tags = marketing").setFacets(singletonList(FILTER_TAGS))); + + Common.Facet facet = result.getFacets().getFacetsList().stream() + .filter(oneFacet -> FILTER_TAGS.equals(oneFacet.getProperty())) + .findFirst().orElseThrow(IllegalStateException::new); + assertThat(facet.getValuesList()) + .extracting(Common.FacetValue::getVal, Common.FacetValue::getCount) + .containsExactly( + tuple("offshore", 2L), + tuple("finance", 1L), + tuple("platform", 1L), + tuple("marketing", 0L)); + } + @Test public void default_sort_is_by_ascending_name() throws Exception { OrganizationDto organization = db.getDefaultOrganization(); 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 d734e26ef2b..f8f001a61c8 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 @@ -1150,6 +1150,18 @@ public class ProjectMeasuresIndexTest { assertThat(result).hasSize(10).containsOnlyKeys("finance1", "finance2", "finance3", "finance4", "finance5", "finance6", "finance7", "finance8", "finance9", "finance10"); } + @Test + public void facet_tags_returns_more_than_10_tags_when_tags_filter_contains_value_not_in_top_10() { + index( + newDoc().setTags(newArrayList("finance1", "finance2", "finance3", "finance4", "finance5", "finance6", "finance7", "finance8", "finance9", "finance10")), + newDoc().setTags(newArrayList("finance1", "finance2", "finance3", "finance4", "finance5", "finance6", "finance7", "finance8", "finance9", "finance10")), + newDoc().setTags(newArrayList("solo", "solo2"))); + + Map result = underTest.search(new ProjectMeasuresQuery().setTags(ImmutableSet.of("solo", "solo2")), new SearchOptions().addFacets(FIELD_TAGS)).getFacets().get(FIELD_TAGS); + + assertThat(result).hasSize(12).containsOnlyKeys("finance1", "finance2", "finance3", "finance4", "finance5", "finance6", "finance7", "finance8", "finance9", "finance10", "solo", "solo2"); + } + @Test public void search_tags() { index( -- 2.39.5