From: Stephane Gamard Date: Wed, 30 Apr 2014 17:04:59 +0000 (+0200) Subject: SONAR-5237 - Initial mediumtest working X-Git-Tag: 4.4-RC1~1300 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=d89d525d6873f620cd9faece365e42a2ca79b276;p=sonarqube.git SONAR-5237 - Initial mediumtest working --- diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/RuleIndex.java b/sonar-server/src/main/java/org/sonar/server/rule2/RuleIndex.java index 00892f775e4..4b0fc473172 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/RuleIndex.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/RuleIndex.java @@ -20,6 +20,7 @@ package org.sonar.server.rule2; import com.google.common.collect.ImmutableSet; +import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.index.query.BoolFilterBuilder; @@ -27,6 +28,7 @@ import org.elasticsearch.index.query.FilterBuilders; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHitField; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.rule.RuleKey; @@ -40,8 +42,10 @@ import org.sonar.server.search.BaseIndex; import org.sonar.server.search.Hit; import org.sonar.server.search.QueryOptions; import org.sonar.server.search.Results; +import org.yecht.Data; import java.io.IOException; +import java.util.Map; import java.util.Set; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; @@ -63,7 +67,7 @@ public class RuleIndex extends BaseIndex { RuleField.UDPATED_AT.key()); public RuleIndex(RuleNormalizer normalizer, WorkQueue workQueue, - Profiling profiling, ESNode node) { + Profiling profiling, ESNode node) { super(normalizer, workQueue, profiling, node); } @@ -162,20 +166,32 @@ public class RuleIndex extends BaseIndex { this.addTermFilter(RuleField.SEVERITY.key(), query.getSeverities(), fb); this.addTermFilter(RuleField.KEY.key(), query.getKey(), fb); + QueryBuilder mainQuery = QueryBuilders.filteredQuery(qb, fb); + //Create ES query Object; - SearchResponse esResult = getClient() + SearchRequestBuilder esSearch = getClient() .prepareSearch(this.getIndexName()) - .setQuery(QueryBuilders.filteredQuery(qb, fb)) - .addFields(options.getFieldsToReturn().toArray(new String[options.getFieldsToReturn().size()])) - .get(); + .setQuery(mainQuery) + .addFields(options.getFieldsToReturn().toArray(new String[options.getFieldsToReturn().size()])); + + + SearchResponse esResult = esSearch.get(); + Results results = new Results() .setTotal((int) esResult.getHits().totalHits()) .setTime(esResult.getTookInMillis()); - for (SearchHit hit : esResult.getHits().getHits()) { - results.getHits().add( - Hit.fromMap(hit.score(), hit.sourceAsMap())); + for (SearchHit esHit : esResult.getHits().getHits()) { + Hit hit = new Hit(esHit.score()); + for (Map.Entry entry : esHit.fields().entrySet()) { + if(entry.getValue().getValues().size()>1) { + hit.getFields().put(entry.getKey(), entry.getValue().getValues()); + } else { + hit.getFields().put(entry.getKey(), entry.getValue().getValue()); + } + } + results.getHits().add(hit); } return results; diff --git a/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java b/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java index 986624d6982..59aa9d28b7b 100644 --- a/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java +++ b/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java @@ -30,6 +30,7 @@ import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.Client; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.index.query.BoolFilterBuilder; +import org.elasticsearch.index.query.FilterBuilder; import org.elasticsearch.index.query.FilterBuilders; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -112,8 +113,8 @@ public abstract class BaseIndex> implem LOG.info("Setup of index {}", this.getIndexName()); try { - LOG.info("Settings: {}", getIndexSettings().string()); - LOG.info("Mapping: {}", getMapping().string()); + LOG.debug("Settings: {}", getIndexSettings().string()); + LOG.debug("Mapping: {}", getMapping().string()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -158,12 +159,13 @@ public abstract class BaseIndex> implem public void insert(K key) { try { XContentBuilder doc = normalizer.normalize(key); - String keyvalue = this.getKeyValue(key); - if (doc != null && keyvalue != null && !keyvalue.isEmpty()) { + String keyValue = this.getKeyValue(key); + if (doc != null && keyValue != null && !keyValue.isEmpty()) { LOG.debug("Update document with key {}", key); IndexResponse result = getClient().index( new IndexRequest(this.getIndexName(), - this.getType(), keyvalue) + this.getType(), keyValue) + .refresh(true) .source(doc)).get(); } else { LOG.error("Could not normalize document {} for insert in ", @@ -183,6 +185,7 @@ public abstract class BaseIndex> implem UpdateResponse result = getClient().update( new UpdateRequest(this.getIndexName(), this.getType(), this.getKeyValue(key)) + .refresh(true) .doc(doc)).get(); } catch (Exception e) { LOG.error("Could not update documet for index {}: {}", @@ -224,13 +227,12 @@ public abstract class BaseIndex> implem protected BoolFilterBuilder addTermFilter(String field, Collection values, BoolFilterBuilder filter) { if (values != null && !values.isEmpty()) { - BoolFilterBuilder valueFilter = FilterBuilders.boolFilter() - .cache(true) - .cacheKey(field + "_vs"); + BoolFilterBuilder valuesFilter = FilterBuilders.boolFilter(); for (String value : values) { - valueFilter.should(FilterBuilders.termFilter(field, value)); + FilterBuilder valueFilter = FilterBuilders.termFilter(field, value); + valuesFilter.should(valueFilter); } - filter.must(valueFilter); + filter.must(valuesFilter); } return filter; } diff --git a/sonar-server/src/test/java/org/sonar/server/rule2/RuleMediumTest.java b/sonar-server/src/test/java/org/sonar/server/rule2/RuleMediumTest.java index ddc00ee07ff..f6dcc3150c5 100644 --- a/sonar-server/src/test/java/org/sonar/server/rule2/RuleMediumTest.java +++ b/sonar-server/src/test/java/org/sonar/server/rule2/RuleMediumTest.java @@ -22,7 +22,6 @@ package org.sonar.server.rule2; import com.google.common.collect.Iterables; import org.junit.After; import org.junit.ClassRule; -import org.junit.Ignore; import org.junit.Test; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; @@ -42,8 +41,8 @@ import static org.fest.assertions.Assertions.assertThat; public class RuleMediumTest { @ClassRule - public static ServerTester tester = new ServerTester(); - //.setProperty("sonar.es.http.port", "8888"); + public static ServerTester tester = new ServerTester() + .setProperty("sonar.es.http.port", "8888"); @After public void clear_data_store() { @@ -77,7 +76,6 @@ public class RuleMediumTest { } @Test - @Ignore public void search_rules_by_repositories() throws InterruptedException { RuleDao dao = tester.get(RuleDao.class); dao.insert(newRuleDto(RuleKey.of("javascript", "S001"))); @@ -86,6 +84,8 @@ public class RuleMediumTest { RuleService service = tester.get(RuleService.class); RuleQuery query = service.newRuleQuery().setRepositories(Arrays.asList("findbugs", "java")); Results results = service.search(query, new QueryOptions()); + + assertThat(results.getTotal()).isEqualTo(1); assertThat(results.getHits()).hasSize(1); assertThat(Iterables.getFirst(results.getHits(), null).getFieldAsString("key")).isEqualTo("S002");