diff options
author | Jean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com> | 2014-10-23 16:53:04 +0200 |
---|---|---|
committer | Jean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com> | 2014-10-23 16:53:18 +0200 |
commit | 05f54e6666ebe2134a81d94fe9715ea02ca68363 (patch) | |
tree | fc16048201c5d47f26c2df74322b1205220ce75c /server/sonar-server/src/main/java | |
parent | fdf072f716d462797a26ceb3981ad85f234c1ddd (diff) | |
download | sonarqube-05f54e6666ebe2134a81d94fe9715ea02ca68363.tar.gz sonarqube-05f54e6666ebe2134a81d94fe9715ea02ca68363.zip |
SONAR-5718 Add "unassigned" item on assignees facet
Diffstat (limited to 'server/sonar-server/src/main/java')
3 files changed, 46 insertions, 7 deletions
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 f12875c331e..5771dcf49ac 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 @@ -29,7 +29,9 @@ import org.elasticsearch.action.search.SearchType; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.*; +import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.missing.InternalMissing; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.sort.FieldSortBuilder; @@ -309,13 +311,33 @@ public class IssueIndex extends BaseIndex<Issue, IssueDto, String> { query.componentRoots().toArray(new String[0]))); esSearch.addAggregation(stickyFacetBuilder(esQuery, filters, IssueNormalizer.IssueField.RULE_KEY.field(), IssueFilterParameters.RULES, query.rules().toArray(new String[0]))); - esSearch.addAggregation(stickyFacetBuilder(esQuery, filters, IssueNormalizer.IssueField.ASSIGNEE.field(), IssueFilterParameters.ASSIGNEES, - query.assignees().toArray(new String[0]))); + esSearch.addAggregation(getAssigneesFacet(query, options, filters, esQuery)); esSearch.addAggregation(stickyFacetBuilder(esQuery, filters, IssueNormalizer.IssueField.COMPONENT.field(), IssueFilterParameters.COMPONENTS, query.components().toArray(new String[0]))); } } + private AggregationBuilder getAssigneesFacet(IssueQuery query, QueryContext options, Map<String, FilterBuilder> filters, QueryBuilder esQuery) { + String fieldName = IssueNormalizer.IssueField.ASSIGNEE.field(); + String facetName = IssueFilterParameters.ASSIGNEES; + + // Same as in super.stickyFacetBuilder + BoolFilterBuilder facetFilter = getStickyFacetFilter(esQuery, filters, fieldName); + FilterAggregationBuilder facetTopAggregation = buildTopFacetAggregation(fieldName, facetName, facetFilter); + addSelectedItemsToFacet(fieldName, facetName, facetTopAggregation, query.assignees().toArray(new String[0])); + + // Add missing facet for unassigned issues + facetTopAggregation.subAggregation( + AggregationBuilders + .missing(facetName + "_missing") + .field(fieldName) + ); + + return AggregationBuilders + .global(facetName) + .subAggregation(facetTopAggregation); + } + private void setSorting(IssueQuery query, SearchRequestBuilder esSearch) { /* integrate Query Sort */ String sortField = query.sort(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java b/server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java index 4f48332325b..3fba52fdeb5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java @@ -593,13 +593,26 @@ public abstract class BaseIndex<DOMAIN, DTO extends Dto<KEY>, KEY extends Serial } protected AggregationBuilder stickyFacetBuilder(QueryBuilder query, Map<String, FilterBuilder> filters, String fieldName, String facetName, String... selected) { + BoolFilterBuilder facetFilter = getStickyFacetFilter(query, filters, fieldName); + FilterAggregationBuilder facetTopAggregation = buildTopFacetAggregation(fieldName, facetName, facetFilter); + facetTopAggregation = addSelectedItemsToFacet(fieldName, facetName, facetTopAggregation, selected); + + return AggregationBuilders + .global(facetName) + .subAggregation(facetTopAggregation); + } + + protected BoolFilterBuilder getStickyFacetFilter(QueryBuilder query, Map<String, FilterBuilder> filters, String fieldName) { BoolFilterBuilder facetFilter = FilterBuilders.boolFilter().must(FilterBuilders.queryFilter(query)); for (Map.Entry<String, FilterBuilder> filter : filters.entrySet()) { if (filter.getValue() != null && !StringUtils.equals(filter.getKey(), fieldName)) { facetFilter.must(filter.getValue()); } } + return facetFilter; + } + protected FilterAggregationBuilder buildTopFacetAggregation(String fieldName, String facetName, BoolFilterBuilder facetFilter) { FilterAggregationBuilder facetTopAggregation = AggregationBuilders .filter(facetName + "_filter") .filter(facetFilter) @@ -609,16 +622,16 @@ public abstract class BaseIndex<DOMAIN, DTO extends Dto<KEY>, KEY extends Serial .order(Terms.Order.count(false)) .size(10) .minDocCount(1)); + return facetTopAggregation; + } + protected FilterAggregationBuilder addSelectedItemsToFacet(String fieldName, String facetName, FilterAggregationBuilder facetTopAggregation, String... selected) { if (selected.length > 0) { facetTopAggregation = facetTopAggregation.subAggregation( AggregationBuilders.terms(facetName + "_selected") .field(fieldName) .include(Joiner.on('|').join(selected))); } - - return AggregationBuilders - .global(facetName) - .subAggregation(facetTopAggregation); + return facetTopAggregation; } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/search/Result.java b/server/sonar-server/src/main/java/org/sonar/server/search/Result.java index 9b50418d1e9..24ba8d755fa 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/search/Result.java +++ b/server/sonar-server/src/main/java/org/sonar/server/search/Result.java @@ -27,6 +27,7 @@ import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.aggregations.Aggregation; import org.elasticsearch.search.aggregations.HasAggregations; +import org.elasticsearch.search.aggregations.bucket.missing.Missing; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,7 +70,10 @@ public class Result<K> { } private void processAggregation(Aggregation aggregation) { - if (Terms.class.isAssignableFrom(aggregation.getClass())) { + if (Missing.class.isAssignableFrom(aggregation.getClass())) { + Missing missing = (Missing) aggregation; + this.facets.put(aggregation.getName().replace("_missing",""), new FacetValue("", (int) missing.getDocCount())); + } else if (Terms.class.isAssignableFrom(aggregation.getClass())) { Terms termAggregation = (Terms) aggregation; for (Terms.Bucket value : termAggregation.getBuckets()) { this.facets.put(aggregation.getName().replace("_selected",""), new FacetValue(value.getKey(), (int) value.getDocCount())); |