From: Jean-Baptiste Lievremont Date: Thu, 30 Oct 2014 13:54:11 +0000 (+0100) Subject: SONAR-5718 Add possibility to configure facet size and minimum doc count X-Git-Tag: 5.0-RC1~481 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=6137d755bac7fa51b6b69546d5fccbb65dff25ad;p=sonarqube.git SONAR-5718 Add possibility to configure facet size and minimum doc count --- 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 d75ff641735..94f0ba2a837 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 @@ -54,6 +54,8 @@ import static com.google.common.collect.Lists.newArrayList; public class IssueIndex extends BaseIndex { + private static final int DEFAULT_ISSUE_FACET_SIZE = 5; + private ListMultimap sortColumns = ArrayListMultimap.create(); public IssueIndex(IssueNormalizer normalizer, SearchClient client) { @@ -337,21 +339,21 @@ public class IssueIndex extends BaseIndex { if (options.isFacet()) { // Execute Term aggregations addSimpleStickyFacetIfNeeded(query, options, filters, esQuery, esSearch, - IssueFilterParameters.SEVERITIES, IssueNormalizer.IssueField.SEVERITY.field()); + IssueFilterParameters.SEVERITIES, IssueNormalizer.IssueField.SEVERITY.field(), 0); addSimpleStickyFacetIfNeeded(query, options, filters, esQuery, esSearch, - IssueFilterParameters.STATUSES, IssueNormalizer.IssueField.STATUS.field()); + IssueFilterParameters.STATUSES, IssueNormalizer.IssueField.STATUS.field(), 0); addSimpleStickyFacetIfNeeded(query, options, filters, esQuery, esSearch, - IssueFilterParameters.ACTION_PLANS, IssueNormalizer.IssueField.ACTION_PLAN.field(), query.actionPlans().toArray()); + IssueFilterParameters.ACTION_PLANS, IssueNormalizer.IssueField.ACTION_PLAN.field(), 1, query.actionPlans().toArray()); addSimpleStickyFacetIfNeeded(query, options, filters, esQuery, esSearch, - IssueFilterParameters.COMPONENT_ROOT_UUIDS, IssueNormalizer.IssueField.MODULE_PATH.field(), query.componentRootUuids().toArray()); + IssueFilterParameters.COMPONENT_ROOT_UUIDS, IssueNormalizer.IssueField.MODULE_PATH.field(), 1, query.componentRootUuids().toArray()); addSimpleStickyFacetIfNeeded(query, options, filters, esQuery, esSearch, - IssueFilterParameters.COMPONENT_UUIDS, IssueNormalizer.IssueField.COMPONENT.field(), query.componentUuids().toArray()); + IssueFilterParameters.COMPONENT_UUIDS, IssueNormalizer.IssueField.COMPONENT.field(), 1, query.componentUuids().toArray()); addSimpleStickyFacetIfNeeded(query, options, filters, esQuery, esSearch, - IssueFilterParameters.LANGUAGES, IssueNormalizer.IssueField.LANGUAGE.field(), query.languages().toArray()); + IssueFilterParameters.LANGUAGES, IssueNormalizer.IssueField.LANGUAGE.field(), 0, query.languages().toArray()); addSimpleStickyFacetIfNeeded(query, options, filters, esQuery, esSearch, - IssueFilterParameters.RULES, IssueNormalizer.IssueField.RULE_KEY.field(), query.rules().toArray()); + IssueFilterParameters.RULES, IssueNormalizer.IssueField.RULE_KEY.field(), 1, query.rules().toArray()); addSimpleStickyFacetIfNeeded(query, options, filters, esQuery, esSearch, - IssueFilterParameters.REPORTERS, IssueNormalizer.IssueField.REPORTER.field()); + IssueFilterParameters.REPORTERS, IssueNormalizer.IssueField.REPORTER.field(), 1); if (options.facets().contains(IssueFilterParameters.RESOLUTIONS)) { esSearch.addAggregation(getResolutionFacet(query, options, filters, esQuery)); @@ -363,10 +365,9 @@ public class IssueIndex extends BaseIndex { } private void addSimpleStickyFacetIfNeeded(IssueQuery query, QueryContext options, Map filters, QueryBuilder esQuery, SearchRequestBuilder esSearch, - String facetName, String fieldName, Object... selectedValues) { + String facetName, String fieldName, int minDocCount, Object... selectedValues) { if (options.facets().contains(facetName)) { - esSearch.addAggregation(stickyFacetBuilder(esQuery, filters, fieldName, facetName, - selectedValues)); + esSearch.addAggregation(stickyFacetBuilder(esQuery, filters, fieldName, facetName, DEFAULT_ISSUE_FACET_SIZE, minDocCount, selectedValues)); } } @@ -379,7 +380,7 @@ public class IssueIndex extends BaseIndex { assigneeFilters.remove("__isAssigned"); assigneeFilters.remove(fieldName); BoolFilterBuilder facetFilter = getStickyFacetFilter(esQuery, assigneeFilters, fieldName); - FilterAggregationBuilder facetTopAggregation = buildTopFacetAggregation(fieldName, facetName, facetFilter); + FilterAggregationBuilder facetTopAggregation = buildTopFacetAggregation(fieldName, facetName, facetFilter, DEFAULT_ISSUE_FACET_SIZE, 1); addSelectedItemsToFacet(fieldName, facetName, facetTopAggregation, query.assignees().toArray()); // Add missing facet for unassigned issues @@ -403,7 +404,7 @@ public class IssueIndex extends BaseIndex { resolutionFilters.remove("__isResolved"); resolutionFilters.remove(fieldName); BoolFilterBuilder facetFilter = getStickyFacetFilter(esQuery, resolutionFilters, fieldName); - FilterAggregationBuilder facetTopAggregation = buildTopFacetAggregation(fieldName, facetName, facetFilter); + FilterAggregationBuilder facetTopAggregation = buildTopFacetAggregation(fieldName, facetName, facetFilter, DEFAULT_ISSUE_FACET_SIZE, 0); addSelectedItemsToFacet(fieldName, facetName, facetTopAggregation, query.resolutions().toArray()); // Add missing facet for unresolved issues 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 9f8d748d22d..bded61a64e8 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 @@ -62,6 +62,10 @@ import java.util.*; public abstract class BaseIndex, KEY extends Serializable> implements Index { + private static final int FACET_DEFAULT_MIN_DOC_COUNT = 1; + + private static final int FACET_DEFAULT_SIZE = 10; + private static final Logger LOG = LoggerFactory.getLogger(BaseIndex.class); private final SearchClient client; @@ -609,9 +613,15 @@ public abstract class BaseIndex, KEY extends Serial } - protected AggregationBuilder stickyFacetBuilder(QueryBuilder query, Map filters, String fieldName, String facetName, Object... selected) { + protected AggregationBuilder stickyFacetBuilder(QueryBuilder query, Map filters, String fieldName, String facetName, + Object... selected) { + return stickyFacetBuilder(query, filters, fieldName, facetName, FACET_DEFAULT_SIZE, FACET_DEFAULT_MIN_DOC_COUNT, selected); + } + + protected AggregationBuilder stickyFacetBuilder(QueryBuilder query, Map filters, String fieldName, String facetName, int size, int minDocCount, + Object... selected) { BoolFilterBuilder facetFilter = getStickyFacetFilter(query, filters, fieldName); - FilterAggregationBuilder facetTopAggregation = buildTopFacetAggregation(fieldName, facetName, facetFilter); + FilterAggregationBuilder facetTopAggregation = buildTopFacetAggregation(fieldName, facetName, facetFilter, size, minDocCount); facetTopAggregation = addSelectedItemsToFacet(fieldName, facetName, facetTopAggregation, selected); return AggregationBuilders @@ -629,7 +639,7 @@ public abstract class BaseIndex, KEY extends Serial return facetFilter; } - protected FilterAggregationBuilder buildTopFacetAggregation(String fieldName, String facetName, BoolFilterBuilder facetFilter) { + protected FilterAggregationBuilder buildTopFacetAggregation(String fieldName, String facetName, BoolFilterBuilder facetFilter, int size, int minDocCount) { return AggregationBuilders .filter(facetName + "_filter") .filter(facetFilter) @@ -637,8 +647,12 @@ public abstract class BaseIndex, KEY extends Serial AggregationBuilders.terms(facetName) .field(fieldName) .order(Terms.Order.count(false)) - .size(10) - .minDocCount(1)); + .size(size) + .minDocCount(minDocCount)); + } + + protected FilterAggregationBuilder buildTopFacetAggregation(String fieldName, String facetName, BoolFilterBuilder facetFilter) { + return buildTopFacetAggregation(fieldName, facetName, facetFilter, FACET_DEFAULT_SIZE, FACET_DEFAULT_MIN_DOC_COUNT); } protected FilterAggregationBuilder addSelectedItemsToFacet(String fieldName, String facetName, FilterAggregationBuilder facetTopAggregation, Object... selected) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/search/ws/SearchRequestHandler.java b/server/sonar-server/src/main/java/org/sonar/server/search/ws/SearchRequestHandler.java index 2631a249f1c..cbc5fd6b2b5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/search/ws/SearchRequestHandler.java +++ b/server/sonar-server/src/main/java/org/sonar/server/search/ws/SearchRequestHandler.java @@ -145,11 +145,13 @@ public abstract class SearchRequestHandler implements RequestHand json.beginObject(); json.prop("property", facetName); json.name("values").beginArray(); - for (FacetValue facetValue : results.getFacets().get(facetName)) { - json.beginObject(); - json.prop("val", facetValue.getKey()); - json.prop("count", facetValue.getValue()); - json.endObject(); + if (results.getFacets().containsKey(facetName)) { + for (FacetValue facetValue : results.getFacets().get(facetName)) { + json.beginObject(); + json.prop("val", facetValue.getKey()); + json.prop("count", facetValue.getValue()); + json.endObject(); + } } json.endArray().endObject(); }