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;
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;
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) {
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;
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);
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
// 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());