From: Julien Lancelot Date: Mon, 6 Mar 2017 15:47:25 +0000 (+0100) Subject: SONAR-8231 Return selected languages even when no project for this language X-Git-Tag: 6.4-RC1~803 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=5e681224aa7196b766c743224c4ed13af206b798;p=sonarqube.git SONAR-8231 Return selected languages even when no project for this language --- 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 81e5aaf8a48..464d1e8aa44 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 @@ -227,7 +227,7 @@ public class SearchProjectsAction implements ComponentsWsAction { Ordering ordering = Ordering.explicit(projectUuids).onResultOf(ComponentDto::uuid); List projects = ordering.immutableSortedCopy(dbClient.componentDao().selectByUuids(dbSession, projectUuids)); Map analysisByProjectUuid = getSnapshots(dbSession, request, projectUuids); - return new SearchResults(projects, favoriteProjectUuids, esResults, analysisByProjectUuid); + return new SearchResults(projects, favoriteProjectUuids, esResults, analysisByProjectUuid, query); } private static boolean hasFavoriteFilter(List criteria) { @@ -285,8 +285,7 @@ public class SearchProjectsAction implements ComponentsWsAction { return request.build(); } - private SearchProjectsWsResponse buildResponse(SearchProjectsRequest request, SearchResults searchResults, - Map organizationsByUuid) { + private SearchProjectsWsResponse buildResponse(SearchProjectsRequest request, SearchResults searchResults, Map organizationsByUuid) { Function dbToWsComponent = new DbToWsComponent(organizationsByUuid, searchResults.favoriteProjectUuids, searchResults.analysisByProjectUuid, userSession.isLoggedIn()); @@ -301,15 +300,17 @@ public class SearchProjectsAction implements ComponentsWsAction { .forEach(response::addComponents); return response; }) - .map(response -> addFacets(searchResults.facets, response)) + .map(response -> addFacets(searchResults, response)) .map(SearchProjectsWsResponse.Builder::build) .findFirst() .orElseThrow(() -> new IllegalStateException("SearchProjectsWsResponse not built")); } - private static SearchProjectsWsResponse.Builder addFacets(Facets esFacets, SearchProjectsWsResponse.Builder wsResponse) { + private static SearchProjectsWsResponse.Builder addFacets(SearchResults searchResults, SearchProjectsWsResponse.Builder wsResponse) { + Facets esFacets = searchResults.facets; EsToWsFacet esToWsFacet = new EsToWsFacet(); + searchResults.query.getLanguages().ifPresent(languages -> addMandatoryValuesToFacet(esFacets, FILTER_LANGUAGES, languages)); Common.Facets wsFacets = esFacets.getAll().entrySet().stream() .map(esToWsFacet) .collect(Collector.of( @@ -325,6 +326,18 @@ public class SearchProjectsAction implements ComponentsWsAction { return wsResponse; } + private static void addMandatoryValuesToFacet(Facets facets, String facetName, Iterable mandatoryValues) { + Map buckets = facets.get(facetName); + if (buckets == null) { + return; + } + for (String mandatoryValue : mandatoryValues) { + if (!buckets.containsKey(mandatoryValue)) { + buckets.put(mandatoryValue, 0L); + } + } + } + private static class EsToWsFacet implements Function>, Common.Facet> { private final BucketToFacetValue bucketToFacetValue = new BucketToFacetValue(); private final Common.Facet.Builder wsFacet = Common.Facet.newBuilder(); @@ -413,14 +426,17 @@ public class SearchProjectsAction implements ComponentsWsAction { private final Set favoriteProjectUuids; private final Facets facets; private final Map analysisByProjectUuid; + private final ProjectMeasuresQuery query; private final int total; - private SearchResults(List projects, Set favoriteProjectUuids, SearchIdResult searchResults, Map analysisByProjectUuid) { + private SearchResults(List projects, Set favoriteProjectUuids, SearchIdResult searchResults, Map analysisByProjectUuid, + ProjectMeasuresQuery query) { this.projects = projects; this.favoriteProjectUuids = favoriteProjectUuids; this.total = (int) searchResults.getTotal(); this.facets = searchResults.getFacets(); this.analysisByProjectUuid = analysisByProjectUuid; + this.query = query; } } } 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 a6496d4f25d..5ce96fec3f8 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 @@ -484,6 +484,26 @@ public class SearchProjectsActionTest { tuple("", 2L)); } + @Test + public void return_languages_facet_with_language_having_no_project_if_language_is_in_filter() { + OrganizationDto organization = db.getDefaultOrganization(); + insertProjectInDbAndEs(newProjectDto(organization).setName("Sonar Java"), newArrayList(newMeasure(COVERAGE, 81d)), null, asList("", "java")); + insertProjectInDbAndEs(newProjectDto(organization).setName("Sonar Groovy"), newArrayList(newMeasure(COVERAGE, 81)), null, asList("java")); + insertMetrics(COVERAGE, NCLOC_LANGUAGE_DISTRIBUTION_KEY); + + SearchProjectsWsResponse result = call(request.setFilter("languages = xoo").setFacets(singletonList(FILTER_LANGUAGES))); + + Common.Facet facet = result.getFacets().getFacetsList().stream() + .filter(oneFacet -> FILTER_LANGUAGES.equals(oneFacet.getProperty())) + .findFirst().orElseThrow(IllegalStateException::new); + assertThat(facet.getValuesList()) + .extracting(Common.FacetValue::getVal, Common.FacetValue::getCount) + .containsOnly( + tuple("xoo", 0L), + tuple("java", 2L), + tuple("", 1L)); + } + @Test public void default_sort_is_by_ascending_name() throws Exception { OrganizationDto organization = db.getDefaultOrganization();