From a0f12d64a0a63f743fe4024696904cfe6d5a5e15 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Lievremont Date: Wed, 22 Oct 2014 15:08:24 +0200 Subject: [PATCH] SONAR-5749 Add selected items in issues facets --- .../sonar/server/issue/index/IssueIndex.java | 7 ++-- .../org/sonar/server/search/BaseIndex.java | 33 ++++++++++++------- .../org/sonar/server/search/IndexQueue.java | 8 ++--- .../java/org/sonar/server/search/Result.java | 3 +- 4 files changed, 29 insertions(+), 22 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 cd6cd987c60..6323db766e0 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 @@ -195,7 +195,7 @@ public class IssueIndex extends BaseIndex { esSearch.setQuery(esQuery); } - setFacets(options, filters, esQuery, esSearch); + setFacets(query, options, filters, esQuery, esSearch); SearchResponse response = getClient().execute(esSearch); return new Result(this, response); @@ -298,14 +298,15 @@ public class IssueIndex extends BaseIndex { } } - private void setFacets(QueryContext options, Map filters, QueryBuilder esQuery, SearchRequestBuilder esSearch) { + private void setFacets(IssueQuery query, QueryContext options, Map filters, QueryBuilder esQuery, SearchRequestBuilder esSearch) { if (options.isFacet()) { // Execute Term aggregations esSearch.addAggregation(stickyFacetBuilder(esQuery, filters, IssueNormalizer.IssueField.SEVERITY.field(), IssueFilterParameters.SEVERITIES)); esSearch.addAggregation(stickyFacetBuilder(esQuery, filters, IssueNormalizer.IssueField.STATUS.field(), IssueFilterParameters.STATUSES)); esSearch.addAggregation(stickyFacetBuilder(esQuery, filters, IssueNormalizer.IssueField.RESOLUTION.field(), IssueFilterParameters.RESOLUTIONS)); esSearch.addAggregation(stickyFacetBuilder(esQuery, filters, IssueNormalizer.IssueField.ACTION_PLAN.field(), IssueFilterParameters.ACTION_PLANS)); - esSearch.addAggregation(stickyFacetBuilder(esQuery, filters, IssueNormalizer.IssueField.PROJECT.field(), IssueFilterParameters.COMPONENT_ROOTS)); + esSearch.addAggregation(stickyFacetBuilder(esQuery, filters, IssueNormalizer.IssueField.PROJECT.field(), IssueFilterParameters.COMPONENT_ROOTS, + query.componentRoots().toArray(new String[0]))); } } 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 476d1979373..89a8b886ab8 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 @@ -19,6 +19,7 @@ */ package org.sonar.server.search; +import com.google.common.base.Joiner; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -40,6 +41,7 @@ import org.elasticsearch.search.aggregations.Aggregation; import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.Aggregations; +import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.terms.StringTerms; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.aggregations.metrics.max.Max; @@ -574,24 +576,33 @@ public abstract class BaseIndex, KEY extends Serial } - protected AggregationBuilder stickyFacetBuilder(QueryBuilder query, Map filters, String fieldName, String facetName) { + protected AggregationBuilder stickyFacetBuilder(QueryBuilder query, Map filters, String fieldName, String facetName, String... selected) { BoolFilterBuilder facetFilter = FilterBuilders.boolFilter().must(FilterBuilders.queryFilter(query)); for (Map.Entry filter : filters.entrySet()) { if (filter.getValue() != null && !StringUtils.equals(filter.getKey(), fieldName)) { facetFilter.must(filter.getValue()); } } + + FilterAggregationBuilder facetTopAggregation = AggregationBuilders + .filter(facetName + "_filter") + .filter(facetFilter) + .subAggregation( + AggregationBuilders.terms(facetName) + .field(fieldName) + .order(Terms.Order.count(false)) + .size(10) + .minDocCount(1)); + + if (selected.length > 0) { + facetTopAggregation = facetTopAggregation.subAggregation( + AggregationBuilders.terms(facetName + "_selected") + .field(fieldName) + .include(Joiner.on('|').join(selected))); + } + return AggregationBuilders .global(facetName) - .subAggregation( - AggregationBuilders - .filter(facetName + "_filter") - .filter(facetFilter) - .subAggregation( - AggregationBuilders.terms(facetName) - .field(fieldName) - .order(Terms.Order.count(false)) - .size(10) - .minDocCount(1))); + .subAggregation(facetTopAggregation); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java b/server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java index 1a01f78e8fd..ae3548f34ea 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java +++ b/server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java @@ -35,11 +35,7 @@ import org.sonar.api.platform.ComponentContainer; import org.sonar.core.cluster.WorkQueue; import org.sonar.server.search.action.IndexAction; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -130,7 +126,7 @@ public class IndexQueue implements ServerComponent, WorkQueue> { boolean hasInlineRefreshRequest = false; ExecutorService executorService = Executors.newFixedThreadPool(CONCURRENT_NORMALIZATION_FACTOR); // invokeAll() blocks until ALL tasks submitted to executor complete - List>> requests = executorService.invokeAll(actions, 20, TimeUnit.MINUTES); + List>> requests = (List) executorService.invokeAll(actions, 20, TimeUnit.MINUTES); for (Future> updates : requests) { for (ActionRequest update : updates.get()) { 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 fa1c9d5af2c..9b50418d1e9 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 @@ -72,7 +72,7 @@ public class Result { if (Terms.class.isAssignableFrom(aggregation.getClass())) { Terms termAggregation = (Terms) aggregation; for (Terms.Bucket value : termAggregation.getBuckets()) { - this.facets.put(aggregation.getName(), new FacetValue(value.getKey(), (int) value.getDocCount())); + this.facets.put(aggregation.getName().replace("_selected",""), new FacetValue(value.getKey(), (int) value.getDocCount())); } } else if (HasAggregations.class.isAssignableFrom(aggregation.getClass())) { HasAggregations hasAggregations = (HasAggregations) aggregation; @@ -82,7 +82,6 @@ public class Result { } else { LOGGER.warn("Cannot process {} type of aggregation", aggregation.getClass()); } - } public Iterator scroll() { -- 2.39.5