]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5530 - Implemented getByKeys in BaseIndex
authorStephane Gamard <stephane.gamard@sonarsource.com>
Tue, 9 Sep 2014 08:05:17 +0000 (10:05 +0200)
committerStephane Gamard <stephane.gamard@sonarsource.com>
Tue, 9 Sep 2014 08:05:17 +0000 (10:05 +0200)
server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java
server/sonar-server/src/test/java/org/sonar/server/rule/RuleBackendMediumTest.java

index 1aa47aeb866ed926a5d6afc8cc65bf655026ec19..006869ce648b1c32dcdc9c90ca64f3effd1db668 100644 (file)
@@ -27,6 +27,10 @@ import org.elasticsearch.action.count.CountRequestBuilder;
 import org.elasticsearch.action.count.CountResponse;
 import org.elasticsearch.action.get.GetRequestBuilder;
 import org.elasticsearch.action.get.GetResponse;
+import org.elasticsearch.action.get.MultiGetItemResponse;
+import org.elasticsearch.action.get.MultiGetRequest;
+import org.elasticsearch.action.get.MultiGetRequestBuilder;
+import org.elasticsearch.action.get.MultiGetResponse;
 import org.elasticsearch.action.search.SearchRequestBuilder;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.action.search.SearchScrollRequestBuilder;
@@ -44,20 +48,24 @@ import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
 import org.elasticsearch.search.aggregations.bucket.terms.Terms;
 import org.elasticsearch.search.aggregations.metrics.max.Max;
 import org.elasticsearch.search.aggregations.metrics.valuecount.InternalValueCount;
+import org.elasticsearch.search.fetch.source.FetchSourceContext;
 import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.sonar.core.persistence.Dto;
 
 import javax.annotation.Nullable;
+
 import java.io.IOException;
 import java.io.Serializable;
 import java.util.ArrayDeque;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Queue;
 
@@ -392,6 +400,27 @@ public abstract class BaseIndex<DOMAIN, DTO extends Dto<KEY>, KEY extends Serial
     return null;
   }
 
+  public Collection<DOMAIN> getByKeys(KEY... keys) {
+
+    List<DOMAIN> results = new ArrayList<DOMAIN>();
+    MultiGetRequestBuilder request = client.prepareMultiGet()
+      .setPreference("_local");
+    for (KEY key : keys) {
+      request.add(new MultiGetRequest
+        .Item(getIndexName(), getIndexType(), getKeyValue(key))
+          .routing(getKeyValue(key))
+          .fetchSourceContext(FetchSourceContext.FETCH_SOURCE));
+    }
+
+    MultiGetResponse response = client.execute(request);
+    if (response.getResponses() != null) {
+      for (MultiGetItemResponse item : response.getResponses()) {
+        results.add(toDoc(item.getResponse().getSource()));
+      }
+    }
+    return results;
+  }
+
   /* ES QueryHelper Methods */
 
   protected BoolFilterBuilder addTermFilter(BoolFilterBuilder filter, String field, @Nullable Collection<String> values) {
index b17666864bace261ca6eadfa6469796297b22259..85bf88f06997bb077f8d0a89e8c8e07c50c68276 100644 (file)
@@ -40,6 +40,7 @@ import org.sonar.server.rule.index.RuleQuery;
 import org.sonar.server.search.QueryOptions;
 import org.sonar.server.tester.ServerTester;
 
+import java.util.Collection;
 import java.util.List;
 
 import static org.fest.assertions.Assertions.assertThat;
@@ -50,7 +51,8 @@ import static org.fest.assertions.Assertions.assertThat;
 public class RuleBackendMediumTest {
 
   @ClassRule
-  public static ServerTester tester = new ServerTester();
+  public static ServerTester tester = new ServerTester()
+    .setProperty("sonar.log.profilingLevel", "FULL");
 
   RuleDao dao = tester.get(RuleDao.class);
   RuleIndex index = tester.get(RuleIndex.class);
@@ -69,6 +71,19 @@ public class RuleBackendMediumTest {
     dbSession.close();
   }
 
+  @Test
+  public void insert_in_db_and_multiget_in_es() throws InterruptedException {
+    // insert db
+    RuleDto ruleDto = RuleTesting.newXooX1();
+    RuleDto ruleDto2 = RuleTesting.newXooX2();
+    dao.insert(dbSession, ruleDto, ruleDto2);
+    dbSession.commit();
+
+    // check that we get two rules
+    Collection<Rule> hits = index.getByKeys(RuleTesting.XOO_X1, RuleTesting.XOO_X2);
+    assertThat(hits).hasSize(2);
+  }
+
   @Test
   public void insert_in_db_and_index_in_es() throws InterruptedException {
     // insert db
@@ -87,6 +102,16 @@ public class RuleBackendMediumTest {
 
     // verify that rule is indexed in es
     Rule hit = index.getByKey(RuleTesting.XOO_X1);
+    assertRuleEquivalent(ruleDto, hit);
+
+    // Verify Multi-get
+    Collection<Rule> hits = index.getByKeys(RuleTesting.XOO_X1);
+    assertThat(hits).hasSize(1);
+    assertRuleEquivalent(ruleDto, Iterables.getFirst(hits, null));
+
+  }
+
+  private void assertRuleEquivalent(RuleDto ruleDto, Rule hit) {
     assertThat(hit).isNotNull();
     assertThat(hit.key().repository()).isEqualTo(ruleDto.getRepositoryKey());
     assertThat(hit.key().rule()).isEqualTo(ruleDto.getRuleKey());