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;
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;
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;
RuleField.UDPATED_AT.key());
public RuleIndex(RuleNormalizer normalizer, WorkQueue workQueue,
- Profiling profiling, ESNode node) {
+ Profiling profiling, ESNode node) {
super(normalizer, workQueue, profiling, node);
}
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<String, SearchHitField> 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;
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;
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();
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 ",
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 {}: {}",
protected BoolFilterBuilder addTermFilter(String field, Collection<String> 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;
}
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;
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() {
}
@Test
- @Ignore
public void search_rules_by_repositories() throws InterruptedException {
RuleDao dao = tester.get(RuleDao.class);
dao.insert(newRuleDto(RuleKey.of("javascript", "S001")));
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");