addMatchField(mapping, RuleNormalizer.RuleField.REPOSITORY.key(), "string");
addMatchField(mapping, RuleNormalizer.RuleField.SEVERITY.key(), "string");
- addMatchField(mapping, RuleNormalizer.RuleField.STATUS.key(), "string");
-
+ addMatchField(mapping, RuleNormalizer.RuleField.STATUS.key(), "string");;
addMatchField(mapping, RuleNormalizer.RuleField.LANGUAGE.key(), "string");
+ mapping.startObject(RuleNormalizer.RuleField.CHARACTERISTIC.key())
+ .field("type", "string")
+ .field("analyzer", "whitespace")
+ .endObject();
+
+ mapping.startObject(RuleNormalizer.RuleField.SUB_CHARACTERISTIC.key())
+ .field("type", "string")
+ .field("analyzer", "whitespace")
+ .endObject();
+
mapping.startObject(RuleNormalizer.RuleField._TAGS.key())
.field("type", "string")
.field("analyzer", "whitespace")
RuleNormalizer.RuleField.KEY.key(),
RuleNormalizer.RuleField.KEY.key() + ".search",
RuleNormalizer.RuleField.LANGUAGE.key(),
+ RuleNormalizer.RuleField.CHARACTERISTIC.key(),
+ RuleNormalizer.RuleField.SUB_CHARACTERISTIC.key(),
RuleNormalizer.RuleField._TAGS.key());
} else {
qb = QueryBuilders.matchAllQuery();
/* Build main filter (match based) */
protected FilterBuilder getFilter(RuleQuery query, QueryOptions options) {
+
BoolFilterBuilder fb = FilterBuilders.boolFilter();
+ this.addMultiFieldTermFilter(query.getDebtCharacteristics(), fb,
+ RuleNormalizer.RuleField.SUB_CHARACTERISTIC.key(),
+ RuleNormalizer.RuleField.CHARACTERISTIC.key());
this.addTermFilter(RuleNormalizer.RuleField.LANGUAGE.key(), query.getLanguages(), fb);
this.addTermFilter(RuleNormalizer.RuleField.REPOSITORY.key(), query.getRepositories(), fb);
this.addTermFilter(RuleNormalizer.RuleField.SEVERITY.key(), query.getSeverities(), fb);
(query.getTags() != null && !query.getTags().isEmpty()) ||
(query.getStatuses() != null && !query.getStatuses().isEmpty()) ||
(query.getKey() != null && !query.getKey().isEmpty()) ||
+ (query.getDebtCharacteristics() != null && !query.getDebtCharacteristics().isEmpty()) ||
(query.getActivation() != null && !query.getActivation().isEmpty())) {
return fb;
} else {
import java.io.IOException;
import java.io.Serializable;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
.endObject();
}
+ protected BoolFilterBuilder addMultiFieldTermFilter(Collection<String> values, BoolFilterBuilder filter, String... fields) {
+ if (values != null && !values.isEmpty()) {
+ BoolFilterBuilder valuesFilter = FilterBuilders.boolFilter();
+ for (String value : values) {
+ Collection<FilterBuilder> filterBuilders = new ArrayList<FilterBuilder>();
+ for (String field : fields) {
+ filterBuilders.add(FilterBuilders.termFilter(field, value));
+ }
+ valuesFilter.should(FilterBuilders.orFilter(filterBuilders.toArray(new FilterBuilder[filterBuilders.size()])));
+ }
+ filter.must(valuesFilter);
+ }
+ return filter;
+ }
+
protected BoolFilterBuilder addTermFilter(String field, Collection<String> values, BoolFilterBuilder filter) {
if (values != null && !values.isEmpty()) {
import org.sonar.core.qualityprofile.db.ActiveRuleDto;
import org.sonar.core.qualityprofile.db.QualityProfileDto;
import org.sonar.core.rule.RuleDto;
+import org.sonar.core.technicaldebt.db.CharacteristicDto;
import org.sonar.server.db.DbClient;
import org.sonar.server.rule2.Rule;
import org.sonar.server.rule2.persistence.RuleDao;
}
@Test
- public void search_by_any_of_languages() throws InterruptedException {
+ public void search_by_any_of_languages() throws InterruptedException {
dao.insert(newRuleDto(RuleKey.of("java", "S001")).setLanguage("java"), dbSession);
dao.insert(newRuleDto(RuleKey.of("javascript", "S002")).setLanguage("js"), dbSession);
dbSession.commit();
assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(2);
}
+
+ @Test
+ public void search_by_characteristics() throws InterruptedException {
+
+ CharacteristicDto char1 = new CharacteristicDto().setName("char1")
+ .setKey("char1")
+ .setEnabled(true);
+ dbClient.debtCharacteristicDao().insert(char1, dbSession);
+ dbSession.commit();
+
+ CharacteristicDto char11 = new CharacteristicDto().setName("char11")
+ .setKey("char11")
+ .setEnabled(true)
+ .setParentId(char1.getId());
+ dbClient.debtCharacteristicDao().insert(char11, dbSession);
+ dbSession.commit();
+
+ dao.insert(newRuleDto(RuleKey.of("java", "S001"))
+ .setSubCharacteristicId(char11.getId()), dbSession);
+
+ dao.insert(newRuleDto(RuleKey.of("javascript", "S002")), dbSession);
+
+ dbSession.commit();
+
+
+ RuleQuery query;
+ Result<Rule> results;
+
+ // 0. we have 2 rules in index
+ results = index.search(new RuleQuery(), new QueryOptions());
+ assertThat(results.getHits()).hasSize(2);
+
+ // filter by non-subChar
+ query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of("toto"));
+ assertThat(index.search(query, new QueryOptions()).getHits()).isEmpty();
+
+ // filter by subChar
+ query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char11.getKey()));
+ assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(1);
+
+ // filter by Char
+ query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char1.getKey()));
+ assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(1);
+
+ // filter by Char and SubChar
+ query = new RuleQuery().setDebtCharacteristics(ImmutableSet.of(char11.getKey(), char1.getKey()));
+ assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(1);
+
+ // search by Char
+ query = new RuleQuery().setQueryText(char1.getKey());
+ assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(1);
+
+ // search by SubChar
+ query = new RuleQuery().setQueryText(char11.getKey());
+ assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(1);
+
+ // search by SubChar & Char
+ query = new RuleQuery().setQueryText(char11.getKey()+" "+char1.getKey());
+ assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(1);
+ }
+
@Test
public void search_by_any_of_severities() throws InterruptedException {
dao.insert(newRuleDto(RuleKey.of("java", "S001")).setSeverity(Severity.BLOCKER), dbSession);