]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5359 Update /api/rules/search WS to search for template rules
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Tue, 3 Jun 2014 07:23:04 +0000 (09:23 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Tue, 3 Jun 2014 07:23:04 +0000 (09:23 +0200)
sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java
sonar-server/src/main/java/org/sonar/server/rule/index/RuleQuery.java
sonar-server/src/main/java/org/sonar/server/rule/ws/SearchAction.java
sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexMediumTest.java

index b044b937d8d305d19aa4a4848eb986d1e8ff9853..c53750f96da63bdfb50cf59c52231d6e53150946 100644 (file)
@@ -24,11 +24,7 @@ import org.elasticsearch.action.search.SearchRequestBuilder;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.common.settings.ImmutableSettings;
 import org.elasticsearch.common.settings.Settings;
-import org.elasticsearch.index.query.BoolFilterBuilder;
-import org.elasticsearch.index.query.FilterBuilder;
-import org.elasticsearch.index.query.FilterBuilders;
-import org.elasticsearch.index.query.QueryBuilder;
-import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.index.query.*;
 import org.elasticsearch.search.aggregations.AggregationBuilders;
 import org.elasticsearch.search.aggregations.bucket.terms.Terms;
 import org.elasticsearch.search.sort.FieldSortBuilder;
@@ -40,19 +36,10 @@ import org.sonar.core.cluster.WorkQueue;
 import org.sonar.core.rule.RuleDto;
 import org.sonar.server.qualityprofile.index.ActiveRuleNormalizer;
 import org.sonar.server.rule.Rule;
-import org.sonar.server.search.BaseIndex;
-import org.sonar.server.search.ESNode;
-import org.sonar.server.search.IndexDefinition;
-import org.sonar.server.search.IndexField;
-import org.sonar.server.search.QueryOptions;
+import org.sonar.server.search.*;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> {
 
@@ -195,7 +182,7 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> {
 
     if(query.getAvailableSince() != null){
       fb.must(FilterBuilders.rangeFilter(RuleNormalizer.RuleField.UPDATED_AT.field())
-      .gte(query.getAvailableSince()));
+        .gte(query.getAvailableSince()));
     }
 
     if (query.getStatuses() != null && !query.getStatuses().isEmpty()) {
@@ -206,6 +193,10 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> {
       this.addTermFilter(fb, RuleNormalizer.RuleField.STATUS.field(), stringStatus);
     }
 
+    Boolean isTemplate = query.isTemplate();
+    if (isTemplate != null) {
+      this.addTermFilter(fb, RuleNormalizer.RuleField.TEMPLATE.field(), Boolean.toString(isTemplate));
+    }
 
     // ActiveRule Filter (profile and inheritance)
     BoolFilterBuilder childrenFilter = FilterBuilders.boolFilter();
index ffadc82201317064f6cb1f8a82212df729fcad71..facddccf16518839628f9287fa1c2c33e3caae3c 100644 (file)
@@ -26,6 +26,7 @@ import org.sonar.server.search.IndexField;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
+
 import java.util.Collection;
 import java.util.Date;
 
@@ -43,10 +44,11 @@ public class RuleQuery {
   private Boolean hasDebtCharacteristic;
   private Boolean activation;
   private String qProfileKey;
-  private boolean ascendingSort = true;
-  private IndexField sortField;
   private Collection<String> inheritance;
+  private Boolean isTemplate;
   private Date availableSince;
+  private IndexField sortField;
+  private boolean ascendingSort = true;
 
 
   /**
@@ -195,6 +197,16 @@ public class RuleQuery {
     return this;
   }
 
+  @CheckForNull
+  public Boolean isTemplate() {
+    return isTemplate;
+  }
+
+  public RuleQuery setIsTemplate(@Nullable Boolean b) {
+    this.isTemplate = b;
+    return this;
+  }
+
   public IndexField getSortField() {
     return this.sortField;
   }
index 1f790d3f0024e27fea5e781722cc1ead6b4a31ee..fa0d9d0be36f0c15ce31901cbb1f72ed3b13a37f 100644 (file)
@@ -59,6 +59,7 @@ public class SearchAction implements RequestHandler {
   public static final String PARAM_TAGS = "tags";
   public static final String PARAM_ALL_OF_TAGS = "all_of_tags";
   public static final String PARAM_INHERITANCE = "inheritance";
+  public static final String PARAM_IS_TEMPLATE = "is_template";
   public static final String PARAM_FACETS = "facets";
 
   public static final String SEARCH_ACTION = "search";
@@ -174,6 +175,11 @@ public class SearchAction implements RequestHandler {
       .setExampleValue(ActiveRule.Inheritance.INHERITED.name()+","+
         ActiveRule.Inheritance.OVERRIDES.name());
 
+    action
+      .createParam(PARAM_IS_TEMPLATE)
+      .setDescription("Filter template rules. Available since 4.4")
+      .setBooleanPossibleValues();
+
     action
       .createParam(SearchOptions.PARAM_SORT)
       .setDescription("Sort field")
@@ -227,6 +233,7 @@ public class SearchAction implements RequestHandler {
     query.setTags(request.paramAsStrings(PARAM_TAGS));
     query.setAllOfTags(request.paramAsStrings(PARAM_ALL_OF_TAGS));
     query.setInheritance(request.paramAsStrings(PARAM_INHERITANCE));
+    query.setIsTemplate(request.paramAsBoolean(PARAM_IS_TEMPLATE));
     return query;
   }
 
index e5d7cf88fd8e8f6f9770dd562aedce546e212fb2..f47dae2816e41c6b64f4d51a382ab2dd1e1e4ff1 100644 (file)
@@ -49,12 +49,7 @@ import org.sonar.server.search.QueryOptions;
 import org.sonar.server.search.Result;
 import org.sonar.server.tester.ServerTester;
 
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 import static org.fest.assertions.Assertions.assertThat;
 import static org.fest.assertions.Fail.fail;
@@ -63,7 +58,7 @@ public class RuleIndexMediumTest {
 
   @ClassRule
   public static ServerTester tester = new ServerTester()
-    .setProperty(IndexProperties.HTTP_PORT,"9200");
+    .setProperty(IndexProperties.HTTP_PORT, "9200");
 
   RuleDao dao = tester.get(RuleDao.class);
   RuleIndex index = tester.get(RuleIndex.class);
@@ -652,6 +647,36 @@ public class RuleIndexMediumTest {
     assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(2);
   }
 
+  @Test
+  public void search_by_is_template() throws InterruptedException {
+    dao.insert(dbSession, newRuleDto(RuleKey.of("java", "S001")).setCardinality(Cardinality.SINGLE));
+    dao.insert(dbSession, newRuleDto(RuleKey.of("java", "S002")).setCardinality(Cardinality.MULTIPLE));
+    dbSession.commit();
+
+    // find all
+    RuleQuery query = new RuleQuery();
+    Result<Rule> results = index.search(query, new QueryOptions());
+    assertThat(results.getHits()).hasSize(2);
+
+    // Only template
+    query = new RuleQuery().setIsTemplate(true);
+    results = index.search(query, new QueryOptions());
+    assertThat(results.getHits()).hasSize(1);
+    assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S002");
+    assertThat(Iterables.getFirst(results.getHits(), null).template()).isTrue();
+
+    // Only not template
+    query = new RuleQuery().setIsTemplate(false);
+    results = index.search(query, new QueryOptions());
+    assertThat(results.getHits()).hasSize(1);
+    assertThat(Iterables.getFirst(results.getHits(), null).template()).isFalse();
+    assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S001");
+
+    // null => no filter
+    query = new RuleQuery().setIsTemplate(null);
+    assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(2);
+  }
+
   @Test
   public void paging() {
     dao.insert(dbSession, newRuleDto(RuleKey.of("java", "S001")));