aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-server/src/main/java
diff options
context:
space:
mode:
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>2014-10-23 16:53:04 +0200
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>2014-10-23 16:53:18 +0200
commit05f54e6666ebe2134a81d94fe9715ea02ca68363 (patch)
treefc16048201c5d47f26c2df74322b1205220ce75c /server/sonar-server/src/main/java
parentfdf072f716d462797a26ceb3981ad85f234c1ddd (diff)
downloadsonarqube-05f54e6666ebe2134a81d94fe9715ea02ca68363.tar.gz
sonarqube-05f54e6666ebe2134a81d94fe9715ea02ca68363.zip
SONAR-5718 Add "unassigned" item on assignees facet
Diffstat (limited to 'server/sonar-server/src/main/java')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java26
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java21
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/search/Result.java6
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()));