]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5174 Add no pagination search
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Mon, 31 Mar 2014 13:48:16 +0000 (15:48 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Mon, 31 Mar 2014 13:48:24 +0000 (15:48 +0200)
sonar-server/src/main/java/org/sonar/server/rule/RuleQuery.java
sonar-server/src/main/java/org/sonar/server/rule/RuleRegistry.java
sonar-server/src/test/java/org/sonar/server/rule/RuleRegistryTest.java

index adc992fcd6109d30db89eddb94167a1ed272de64..d7ee6b481a44f3a3e9ec8eae7308604382911c79 100644 (file)
@@ -34,6 +34,7 @@ public class RuleQuery {
 
   private static final int DEFAULT_PAGE_INDEX = 1;
   private static final int DEFAULT_PAGE_SIZE = 25;
+  public static final int NO_PAGINATION = -1;
 
   private String key;
   private String query;
index ea7611f44ca69f424db13145120bf60f853e503b..ec281b0d6dcc06e1e1e2d755ce8ec3f6e00a585b 100644 (file)
@@ -27,9 +27,13 @@ import com.google.common.collect.Multimap;
 import org.apache.commons.lang.StringUtils;
 import org.apache.ibatis.session.SqlSession;
 import org.elasticsearch.ElasticSearchException;
+import org.elasticsearch.action.search.SearchRequestBuilder;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.action.search.SearchType;
 import org.elasticsearch.common.collect.Lists;
 import org.elasticsearch.common.collect.Maps;
 import org.elasticsearch.common.io.BytesStream;
+import org.elasticsearch.common.unit.TimeValue;
 import org.elasticsearch.common.xcontent.XContentBuilder;
 import org.elasticsearch.common.xcontent.XContentFactory;
 import org.elasticsearch.index.query.BoolFilterBuilder;
@@ -196,20 +200,44 @@ public class RuleRegistry {
       }
     }
 
-    Paging paging = Paging.create(query.pageSize(), query.pageIndex());
-    SearchHits hits = searchIndex.executeRequest(
+    Builder<Rule> rulesBuilder = ImmutableList.builder();
+    SearchRequestBuilder searchRequestBuilder =
       searchIndex.client().prepareSearch(INDEX_RULES).setTypes(TYPE_RULE)
-        .setPostFilter(mainFilter)
-        .addSort(RuleDocument.FIELD_NAME, SortOrder.ASC)
-        .setSize(paging.pageSize())
-        .setFrom(paging.offset())
-    );
+      .setPostFilter(mainFilter)
+      .addSort(RuleDocument.FIELD_NAME, SortOrder.ASC);
+
+    if (RuleQuery.NO_PAGINATION == query.pageSize()) {
+      final int scrollTime = 100;
+      SearchResponse scrollResp = searchRequestBuilder
+        .setSearchType(SearchType.SCAN)
+        .setScroll(new TimeValue(scrollTime))
+        .setSize(50).execute().actionGet();
+      //Scroll until no hits are returned
+      while (true) {
+        scrollResp = searchIndex.client().prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(scrollTime)).execute().actionGet();
+        for (SearchHit hit : scrollResp.getHits()) {
+          rulesBuilder.add(RuleDocumentParser.parse(hit.sourceAsMap()));
+        }
+        //Break condition: No hits are returned
+        if (scrollResp.getHits().getHits().length == 0) {
+          break;
+        }
+      }
+      return new PagedResult<Rule>(rulesBuilder.build(), null);
 
-    Builder<Rule> rulesBuilder = ImmutableList.builder();
-    for (SearchHit hit : hits.hits()) {
-      rulesBuilder.add(RuleDocumentParser.parse(hit.sourceAsMap()));
+    } else {
+      Paging paging = Paging.create(query.pageSize(), query.pageIndex());
+      SearchHits hits = searchIndex.executeRequest(
+        searchRequestBuilder
+          .setSize(paging.pageSize())
+          .setFrom(paging.offset())
+      );
+
+      for (SearchHit hit : hits.hits()) {
+        rulesBuilder.add(RuleDocumentParser.parse(hit.sourceAsMap()));
+      }
+      return new PagedResult<Rule>(rulesBuilder.build(), PagingResult.create(paging.pageSize(), paging.pageIndex(), hits.getTotalHits()));
     }
-    return new PagedResult<Rule>(rulesBuilder.build(), PagingResult.create(paging.pageSize(), paging.pageIndex(), hits.getTotalHits()));
   }
 
   private static void addMustTermOrTerms(BoolFilterBuilder filter, String field, Collection<String> terms) {
index 3fdab92d7901a428293d8cabda0d0854ad443306..967de36c8ad7aa71811b447367e992753fa75896 100644 (file)
@@ -435,14 +435,14 @@ public class RuleRegistryTest {
   }
 
   @Test
-  public void find_linear() {
+  public void find_rules_with_all_remediation_function_types() {
     Map<Integer, CharacteristicDto> characteristics = newHashMap();
     characteristics.put(10, new CharacteristicDto().setId(10).setKey("REUSABILITY").setName("Reusability"));
     characteristics.put(11, new CharacteristicDto().setId(11).setKey("MODULARITY").setName("Modularity").setParentId(10));
 
     List<RuleDto> rules = ImmutableList.of(
       new RuleDto().setId(10).setRepositoryKey("repo").setRuleKey("key1").setSeverity(Severity.MINOR)
-        .setDefaultSubCharacteristicId(11).setDefaultRemediationFunction("LINEAR").setDefaultRemediationCoefficient("1h").setDefaultRemediationOffset(""),
+        .setDefaultSubCharacteristicId(11).setDefaultRemediationFunction("LINEAR").setDefaultRemediationCoefficient("1h"),
       new RuleDto().setId(11).setRepositoryKey("repo").setRuleKey("key2").setSeverity(Severity.MINOR)
         .setDefaultSubCharacteristicId(11).setDefaultRemediationFunction("CONSTANT_ISSUE").setDefaultRemediationOffset("15min"),
       new RuleDto().setId(12).setRepositoryKey("repo").setRuleKey("key3").setSeverity(Severity.MINOR)
@@ -451,7 +451,12 @@ public class RuleRegistryTest {
 
     registry.bulkRegisterRules(rules, characteristics, ArrayListMultimap.<Integer, RuleParamDto>create(), ArrayListMultimap.<Integer, RuleRuleTagDto>create());
 
-    assertThat(registry.find(RuleQuery.builder().hasDebtCharacteristic(null).build()).results()).hasSize(3);
+    assertThat(registry.find(RuleQuery.builder().build()).results()).hasSize(3);
+  }
+
+  @Test
+  public void find_with_no_pagination() {
+    assertThat(registry.find(RuleQuery.builder().pageSize(-1).build()).results()).hasSize(2);
   }
 
   private String testFileAsString(String testFile) throws Exception {