]> source.dussan.org Git - sonarqube.git/commitdiff
DAOv.2 - Updated tag for aggregation in RuleService and Normalizer
authorStephane Gamard <stephane.gamard@searchbox.com>
Thu, 22 May 2014 15:46:07 +0000 (17:46 +0200)
committerStephane Gamard <stephane.gamard@searchbox.com>
Thu, 22 May 2014 15:46:16 +0000 (17:46 +0200)
sonar-server/src/main/java/org/sonar/server/rule2/RuleService.java
sonar-server/src/main/java/org/sonar/server/rule2/index/RuleIndex.java
sonar-server/src/main/java/org/sonar/server/rule2/index/RuleNormalizer.java
sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java
sonar-server/src/test/java/org/sonar/server/rule2/RuleServiceMediumTest.java
sonar-server/src/test/java/org/sonar/server/rule2/index/RuleIndexMediumTest.java

index a9c4bf867d1a218125c638f6cbadd6a992e46bf2..340ae3e07a6187f21f51f79bcca1b4ca3bb0476a 100644 (file)
@@ -97,9 +97,16 @@ public class RuleService implements ServerComponent {
    * List all tags, including system tags, defined on rules
    */
   public Set<String> listTags() {
-    return index.terms(RuleNormalizer.RuleField.TAGS.key(), RuleNormalizer.RuleField.SYSTEM_TAGS.key());
+    /** using combined _TAGS field of ES until ES update that has multiTerms aggregation */
+    return index.terms(RuleNormalizer.RuleField._TAGS.key());
   }
 
+  /**
+   * Set tags for rule.
+   *
+   * @param ruleKey  the required key
+   * @param tags     Set of tags. <code>null</code> to remove all tags.
+   */
   public void setTags(RuleKey ruleKey, Set<String> tags) {
 
     checkAdminPermission(UserSession.get());
index eed0f30537a97cc5e9e74abf2cdb93dcd8872c28..4ca8faf2b6984565efa7481c8005e5740b101c18 100644 (file)
@@ -31,8 +31,6 @@ import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.search.aggregations.AggregationBuilders;
 import org.elasticsearch.search.aggregations.bucket.terms.Terms;
-import org.elasticsearch.search.facet.FacetBuilders;
-import org.elasticsearch.search.facet.terms.TermsFacet;
 import org.elasticsearch.search.sort.FieldSortBuilder;
 import org.elasticsearch.search.sort.SortBuilders;
 import org.elasticsearch.search.sort.SortOrder;
@@ -147,8 +145,14 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> {
 
     addMatchField(mapping, RuleNormalizer.RuleField.LANGUAGE.key(), "string");
 
+    mapping.startObject(RuleNormalizer.RuleField._TAGS.key())
+      .field("type", "string")
+      .field("analyzer", "whitespace")
+      .endObject();
+
     mapping.startObject(RuleNormalizer.RuleField.TAGS.key())
       .field("type", "string")
+      .field("analyzer", "whitespace")
       .endObject();
 
     mapping.startObject(RuleNormalizer.RuleField.SYSTEM_TAGS.key())
@@ -275,7 +279,7 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> {
         RuleNormalizer.RuleField.KEY.key(),
         RuleNormalizer.RuleField.KEY.key() + ".search",
         RuleNormalizer.RuleField.LANGUAGE.key(),
-        RuleNormalizer.RuleField.TAGS.key());
+        RuleNormalizer.RuleField._TAGS.key());
     } else {
       qb = QueryBuilders.matchAllQuery();
     }
@@ -289,8 +293,8 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> {
     this.addTermFilter(RuleNormalizer.RuleField.REPOSITORY.key(), query.getRepositories(), fb);
     this.addTermFilter(RuleNormalizer.RuleField.SEVERITY.key(), query.getSeverities(), fb);
     this.addTermFilter(RuleNormalizer.RuleField.KEY.key(), query.getKey(), fb);
+    this.addTermFilter(RuleNormalizer.RuleField._TAGS.key(), query.getTags(), fb);
 
-    this.addMultiFieldTermFilter(query.getTags(), fb, RuleNormalizer.RuleField.TAGS.key(), RuleNormalizer.RuleField.SYSTEM_TAGS.key());
 
     if (query.getStatuses() != null && !query.getStatuses().isEmpty()) {
       Collection<String> stringStatus = new ArrayList<String>();
@@ -349,8 +353,7 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> {
      /* the Tag facet */
     query.addAggregation(AggregationBuilders
       .terms("Tags")
-      .field(RuleNormalizer.RuleField.SYSTEM_TAGS.key())
-      .field(RuleNormalizer.RuleField.TAGS.key())
+      .field(RuleNormalizer.RuleField._TAGS.key())
       .order(Terms.Order.count(false))
       .size(10)
       .minDocCount(0));
@@ -384,25 +387,25 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> {
     return new RuleDoc(fields);
   }
 
-  public Set<String> terms(String... fields) {
+
+  public Set<String> terms(String fields) {
     Set<String> tags = new HashSet<String>();
+    String key = "_ref";
 
     SearchRequestBuilder request = this.getClient()
       .prepareSearch(this.getIndexName())
       .setQuery(QueryBuilders.matchAllQuery())
-      .addFacet(FacetBuilders.termsFacet("tags")
-        .allTerms(false)
-        .fields(fields)
-        .global(true)
-        .size(Integer.MAX_VALUE));
+      .addAggregation(AggregationBuilders.terms(key)
+        .field(fields)
+        .size(Integer.MAX_VALUE)
+        .minDocCount(1));
 
     SearchResponse esResponse = request.get();
 
-    TermsFacet termFacet = esResponse
-      .getFacets().facet("tags");
+    Terms aggregation = (Terms) esResponse.getAggregations().get(key);
 
-    for (TermsFacet.Entry facetValue : termFacet.getEntries()) {
-      tags.add(facetValue.getTerm().string());
+    for (Terms.Bucket value : aggregation.getBuckets()){
+      tags.add(value.getKey());
     }
     return tags;
   }
index e0b2850efdd62e520e37929b5e405006207e8370..6c39c5292e50923eb09494e097809360d9a3722d 100644 (file)
@@ -23,6 +23,7 @@ import com.google.common.base.Function;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import org.elasticsearch.action.update.UpdateRequest;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.check.Cardinality;
@@ -64,7 +65,8 @@ public class RuleNormalizer extends BaseNormalizer<RuleDto, RuleKey> {
     NOTE("markdownNote"),
     NOTE_LOGIN("noteLogin"),
     NOTE_CREATED_AT("noteCreatedAt"),
-    NOTE_UPDATED_AT("noteUpdatedAt");
+    NOTE_UPDATED_AT("noteUpdatedAt"),
+    _TAGS("_tags");
 
     private final String key;
 
@@ -128,6 +130,7 @@ public class RuleNormalizer extends BaseNormalizer<RuleDto, RuleKey> {
   @Override
   public UpdateRequest normalize(RuleDto rule) {
 
+    /** Update Fields */
     Map<String, Object> update = new HashMap<String, Object>();
     update.put(RuleField.KEY.key(), rule.getKey().toString());
     update.put(RuleField.REPOSITORY.key(), rule.getRepositoryKey());
@@ -176,19 +179,18 @@ public class RuleNormalizer extends BaseNormalizer<RuleDto, RuleKey> {
     update.put(RuleField.DEBT_FUNCTION_TYPE.key(), dType);
     update.put(RuleField.DEBT_FUNCTION_COEFFICIENT.key(), dCoefficient);
     update.put(RuleField.DEBT_FUNCTION_OFFSET.key(), dOffset);
-
     update.put(RuleField.TAGS.key(), rule.getTags());
     update.put(RuleField.SYSTEM_TAGS.key(), rule.getSystemTags());
+    update.put(RuleField._TAGS.key(), Sets.union(rule.getSystemTags(), rule.getTags()));
 
 
-
-      /* Upsert elements */
+    /** Upsert elements */
     Map<String, Object> upsert = new HashMap<String, Object>(update);
     upsert.put(RuleField.KEY.key(), rule.getKey().toString());
     upsert.put(RuleField.PARAMS.key(), new ArrayList<String>());
 
 
-    /* Creating updateRequest */
+    /** Creating updateRequest */
     return new UpdateRequest()
       .doc(update)
       .upsert(upsert);
index 635944fc6ca37c079f1635456b2e5b5d27bfb94d..7a68cd2cdd75d94d88163494c881759f371cf231 100644 (file)
@@ -39,7 +39,6 @@ import org.sonar.server.es.ESNode;
 
 import java.io.IOException;
 import java.io.Serializable;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
@@ -279,29 +278,6 @@ public abstract class BaseIndex<D, E extends Dto<K>, K extends Serializable>
       .endObject();
   }
 
-  protected void addFindField(XContentBuilder mapping, String field, String type) throws IOException {
-    mapping.startObject(field)
-      .field("type", type)
-      .field("index", "analyzed")
-      .endObject();
-  }
-
-
-  protected BoolFilterBuilder addMultiFieldTermFilter(Collection<String> values, BoolFilterBuilder filter, String... fields) {
-    if (values != null && !values.isEmpty()) {
-      BoolFilterBuilder valuesFilter = FilterBuilders.boolFilter();
-      for (String value : values) {
-        Collection<FilterBuilder> filterBuilders = new ArrayList<FilterBuilder>();
-        for (String field : fields) {
-          filterBuilders.add(FilterBuilders.termFilter(field, value));
-        }
-        valuesFilter.should(FilterBuilders.orFilter(filterBuilders.toArray(new FilterBuilder[filterBuilders.size()])));
-      }
-      filter.must(valuesFilter);
-    }
-    return filter;
-  }
-
 
   protected BoolFilterBuilder addTermFilter(String field, Collection<String> values, BoolFilterBuilder filter) {
     if (values != null && !values.isEmpty()) {
index 4c5e21aebed4e3418ea81037d359d858e77cd8b9..cf691a4a28140d19704bf515c5f10f5b897bb83e 100644 (file)
@@ -180,8 +180,7 @@ public class RuleServiceMediumTest {
 
 
 
-    Set<String> tags = index.terms(RuleNormalizer.RuleField.TAGS.key(),
-      RuleNormalizer.RuleField.SYSTEM_TAGS.key());
+    Set<String> tags = index.terms(RuleNormalizer.RuleField._TAGS.key());
     assertThat(tags).containsOnly("java-coding","security",
       "stephane.gamard@sonarsource.com","mytag");
 
index c235d15878fe925e5d9003d14a2b6b51ad85508d..9baa5f01688235c218e102a570d8f5b46dd5ac5f 100644 (file)
@@ -103,7 +103,8 @@ public class RuleIndexMediumTest {
   @Test
   public void global_facet_on_repositories() {
     dao.insert(newRuleDto(RuleKey.of("javascript", "S001")).setRuleKey("X001"), dbSession);
-    dao.insert(newRuleDto(RuleKey.of("php", "S001")), dbSession);
+    dao.insert(newRuleDto(RuleKey.of("php", "S001"))
+      .setSystemTags(ImmutableSet.of("sysTag")), dbSession);
     dao.insert(newRuleDto(RuleKey.of("javascript", "S002")).setRuleKey("X002")
       .setTags(ImmutableSet.of("tag1")), dbSession);
     dbSession.commit();
@@ -116,15 +117,20 @@ public class RuleIndexMediumTest {
 
     // Repositories Facet is preset
     result = index.search(query, new QueryOptions().setFacet(true));
-
     assertThat(result.getFacets()).isNotNull();
     assertThat(result.getFacets()).hasSize(3);
+
+    // Verify the value of a given facet
     Collection<FacetValue> repoFacets = result.getFacetValues("Repositories");
     assertThat(repoFacets).hasSize(2);
     assertThat(Iterables.get(repoFacets, 0).getKey()).isEqualTo("javascript");
     assertThat(Iterables.get(repoFacets, 0).getValue()).isEqualTo(2);
     assertThat(Iterables.get(repoFacets, 1).getKey()).isEqualTo("php");
     assertThat(Iterables.get(repoFacets, 1).getValue()).isEqualTo(1);
+
+    // Check that tag facet has both Tags and SystemTags values
+    Collection<FacetValue> tagFacet = result.getFacetValues("Tags");
+    assertThat(tagFacet).hasSize(2);
   }
 
   @Test