]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5718 Add possibility to configure facet size and minimum doc count
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Thu, 30 Oct 2014 13:54:11 +0000 (14:54 +0100)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Thu, 30 Oct 2014 15:16:44 +0000 (16:16 +0100)
server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java
server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java
server/sonar-server/src/main/java/org/sonar/server/search/ws/SearchRequestHandler.java

index d75ff641735ec8eeeda7595761a163f312451b4d..94f0ba2a837df76c2c6b0de2e61c79328a11f7ed 100644 (file)
@@ -54,6 +54,8 @@ import static com.google.common.collect.Lists.newArrayList;
 
 public class IssueIndex extends BaseIndex<Issue, IssueDto, String> {
 
+  private static final int DEFAULT_ISSUE_FACET_SIZE = 5;
+
   private ListMultimap<String, IndexField> sortColumns = ArrayListMultimap.create();
 
   public IssueIndex(IssueNormalizer normalizer, SearchClient client) {
@@ -337,21 +339,21 @@ public class IssueIndex extends BaseIndex<Issue, IssueDto, String> {
     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<Issue, IssueDto, String> {
   }
 
   private void addSimpleStickyFacetIfNeeded(IssueQuery query, QueryContext options, Map<String, FilterBuilder> 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<Issue, IssueDto, String> {
     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<Issue, IssueDto, String> {
     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
index 9f8d748d22dfc21f12871ad56be7af462d097901..bded61a64e8cfdf215daa795c473f4bc88c9396b 100644 (file)
@@ -62,6 +62,10 @@ import java.util.*;
 public abstract class BaseIndex<DOMAIN, DTO extends Dto<KEY>, KEY extends Serializable>
   implements Index<DOMAIN, DTO, KEY> {
 
+  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<DOMAIN, DTO extends Dto<KEY>, KEY extends Serial
 
   }
 
-  protected AggregationBuilder stickyFacetBuilder(QueryBuilder query, Map<String, FilterBuilder> filters, String fieldName, String facetName, Object... selected) {
+  protected AggregationBuilder stickyFacetBuilder(QueryBuilder query, Map<String, FilterBuilder> 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<String, FilterBuilder> 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<DOMAIN, DTO extends Dto<KEY>, 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<DOMAIN, DTO extends Dto<KEY>, 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) {
index 2631a249f1cb599773481e1872b938e13e5a588d..cbc5fd6b2b5bca984d296b232630cbcf6f8cbb27 100644 (file)
@@ -145,11 +145,13 @@ public abstract class SearchRequestHandler<QUERY, DOMAIN> 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();
     }