diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java index 8bb030b36286..553239d0564f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java @@ -58,7 +58,7 @@ public class IssueQuery { private final Collection statuses; private final Collection resolutions; private final Collection components; - private final Collection componentRoots; + private final Collection modules; private final Collection projects; private final Collection rules; private final Collection actionPlans; @@ -84,7 +84,7 @@ private IssueQuery(Builder builder) { this.statuses = defaultCollection(builder.statuses); this.resolutions = defaultCollection(builder.resolutions); this.components = defaultCollection(builder.components); - this.componentRoots = defaultCollection(builder.componentRoots); + this.modules = defaultCollection(builder.modules); this.projects = defaultCollection(builder.projects); this.rules = defaultCollection(builder.rules); this.actionPlans = defaultCollection(builder.actionPlans); @@ -125,8 +125,8 @@ public Collection componentUuids() { return components; } - public Collection componentRootUuids() { - return componentRoots; + public Collection moduleUuids() { + return modules; } public Collection projectUuids() { @@ -230,7 +230,7 @@ public static class Builder { private Collection statuses; private Collection resolutions; private Collection components; - private Collection componentRoots; + private Collection modules; private Collection projects; private Collection rules; private Collection actionPlans; @@ -278,8 +278,8 @@ public Builder componentUuids(@Nullable Collection l) { return this; } - public Builder componentRootUuids(@Nullable Collection l) { - this.componentRoots = l; + public Builder moduleUuids(@Nullable Collection l) { + this.modules = l; return this; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java index 28bb75ae3a02..d5d6473e40aa 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java @@ -193,9 +193,9 @@ private void addComponentRootUuids(IssueQuery.Builder builder, DbSession session if (componentRoots != null) { throw new IllegalArgumentException("componentRoots and componentRootUuids cannot be set simultaneously"); } - builder.componentRootUuids(componentRootUuids); + builder.moduleUuids(componentRootUuids); } else { - builder.componentRootUuids(componentUuids(session, componentRoots)); + builder.moduleUuids(componentUuids(session, componentRoots)); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java b/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java index 695f617ec238..f83322c952bf 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java @@ -24,6 +24,7 @@ import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import org.apache.commons.lang.BooleanUtils; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; @@ -254,9 +255,9 @@ protected Map getFilters(IssueQuery query, QueryContext o filters.put(IssueIndexDefinition.FIELD_ISSUE_KEY, matchFilter(IssueIndexDefinition.FIELD_ISSUE_KEY, query.issueKeys())); filters.put(IssueIndexDefinition.FIELD_ISSUE_ACTION_PLAN, matchFilter(IssueIndexDefinition.FIELD_ISSUE_ACTION_PLAN, query.actionPlans())); filters.put(IssueIndexDefinition.FIELD_ISSUE_ASSIGNEE, matchFilter(IssueIndexDefinition.FIELD_ISSUE_ASSIGNEE, query.assignees())); - filters.put(IssueIndexDefinition.FIELD_ISSUE_MODULE_PATH, matchFilter(IssueIndexDefinition.FIELD_ISSUE_MODULE_PATH, query.componentRootUuids())); - filters.put(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, matchFilter(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, query.componentUuids())); - filters.put(IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID, matchFilter(IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID, query.projectUuids())); + + addComponentRelatedFilters(query, filters); + filters.put(IssueIndexDefinition.FIELD_ISSUE_LANGUAGE, matchFilter(IssueIndexDefinition.FIELD_ISSUE_LANGUAGE, query.languages())); filters.put(IssueIndexDefinition.FIELD_ISSUE_TAGS, matchFilter(IssueIndexDefinition.FIELD_ISSUE_TAGS, query.tags())); filters.put(IssueIndexDefinition.FIELD_ISSUE_RESOLUTION, matchFilter(IssueIndexDefinition.FIELD_ISSUE_RESOLUTION, query.resolutions())); @@ -270,6 +271,33 @@ protected Map getFilters(IssueQuery query, QueryContext o return filters; } + private void addComponentRelatedFilters(IssueQuery query, Map filters) { + if (query.onComponentOnly()) { + Set allComponents = Sets.newHashSet(); + allComponents.addAll(query.projectUuids()); + allComponents.addAll(query.moduleUuids()); + allComponents.addAll(query.componentUuids()); + filters.put(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, matchFilter(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, allComponents)); + } else { + filters.put(IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID, matchFilter(IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID, query.projectUuids())); + filters.put(IssueIndexDefinition.FIELD_ISSUE_MODULE_UUID, matchFilter(IssueIndexDefinition.FIELD_ISSUE_MODULE_UUID, query.moduleUuids())); + + FilterBuilder componentFilter = matchFilter(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, query.componentUuids()); + FilterBuilder modulePathFilter = matchFilter(IssueIndexDefinition.FIELD_ISSUE_MODULE_PATH, query.componentUuids()); + BoolFilterBuilder compositeFilter = null; + if (componentFilter != null || modulePathFilter != null) { + compositeFilter = FilterBuilders.boolFilter(); + if (componentFilter != null) { + compositeFilter.should(componentFilter); + } + if (modulePathFilter != null) { + compositeFilter.should(modulePathFilter); + } + } + filters.put(IssueIndexDefinition.FIELD_ISSUE_COMPONENT_UUID, compositeFilter); + } + } + private FilterBuilder getAuthorizationFilter(QueryContext options) { String user = options.getUserLogin(); Set groups = options.getUserGroups(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java index 85abb5e40f9d..a621b364d5cf 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java @@ -445,6 +445,7 @@ private void collectFacetsData(Request request, Result result, Set