import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
-import org.elasticsearch.index.query.BoolFilterBuilder;
-import org.elasticsearch.index.query.FilterBuilder;
-import org.elasticsearch.index.query.FilterBuilders;
-import org.elasticsearch.index.query.QueryBuilder;
-import org.elasticsearch.index.query.QueryBuilders;
+import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.sonar.core.rule.RuleDto;
import org.sonar.server.qualityprofile.index.ActiveRuleNormalizer;
import org.sonar.server.rule.Rule;
-import org.sonar.server.search.BaseIndex;
-import org.sonar.server.search.ESNode;
-import org.sonar.server.search.IndexDefinition;
-import org.sonar.server.search.IndexField;
-import org.sonar.server.search.QueryOptions;
+import org.sonar.server.search.*;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> {
if(query.getAvailableSince() != null){
fb.must(FilterBuilders.rangeFilter(RuleNormalizer.RuleField.UPDATED_AT.field())
- .gte(query.getAvailableSince()));
+ .gte(query.getAvailableSince()));
}
if (query.getStatuses() != null && !query.getStatuses().isEmpty()) {
this.addTermFilter(fb, RuleNormalizer.RuleField.STATUS.field(), stringStatus);
}
+ Boolean isTemplate = query.isTemplate();
+ if (isTemplate != null) {
+ this.addTermFilter(fb, RuleNormalizer.RuleField.TEMPLATE.field(), Boolean.toString(isTemplate));
+ }
// ActiveRule Filter (profile and inheritance)
BoolFilterBuilder childrenFilter = FilterBuilders.boolFilter();
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
+
import java.util.Collection;
import java.util.Date;
private Boolean hasDebtCharacteristic;
private Boolean activation;
private String qProfileKey;
- private boolean ascendingSort = true;
- private IndexField sortField;
private Collection<String> inheritance;
+ private Boolean isTemplate;
private Date availableSince;
+ private IndexField sortField;
+ private boolean ascendingSort = true;
/**
return this;
}
+ @CheckForNull
+ public Boolean isTemplate() {
+ return isTemplate;
+ }
+
+ public RuleQuery setIsTemplate(@Nullable Boolean b) {
+ this.isTemplate = b;
+ return this;
+ }
+
public IndexField getSortField() {
return this.sortField;
}
public static final String PARAM_TAGS = "tags";
public static final String PARAM_ALL_OF_TAGS = "all_of_tags";
public static final String PARAM_INHERITANCE = "inheritance";
+ public static final String PARAM_IS_TEMPLATE = "is_template";
public static final String PARAM_FACETS = "facets";
public static final String SEARCH_ACTION = "search";
.setExampleValue(ActiveRule.Inheritance.INHERITED.name()+","+
ActiveRule.Inheritance.OVERRIDES.name());
+ action
+ .createParam(PARAM_IS_TEMPLATE)
+ .setDescription("Filter template rules. Available since 4.4")
+ .setBooleanPossibleValues();
+
action
.createParam(SearchOptions.PARAM_SORT)
.setDescription("Sort field")
query.setTags(request.paramAsStrings(PARAM_TAGS));
query.setAllOfTags(request.paramAsStrings(PARAM_ALL_OF_TAGS));
query.setInheritance(request.paramAsStrings(PARAM_INHERITANCE));
+ query.setIsTemplate(request.paramAsBoolean(PARAM_IS_TEMPLATE));
return query;
}
import org.sonar.server.search.Result;
import org.sonar.server.tester.ServerTester;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
import static org.fest.assertions.Assertions.assertThat;
import static org.fest.assertions.Fail.fail;
@ClassRule
public static ServerTester tester = new ServerTester()
- .setProperty(IndexProperties.HTTP_PORT,"9200");
+ .setProperty(IndexProperties.HTTP_PORT, "9200");
RuleDao dao = tester.get(RuleDao.class);
RuleIndex index = tester.get(RuleIndex.class);
assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(2);
}
+ @Test
+ public void search_by_is_template() throws InterruptedException {
+ dao.insert(dbSession, newRuleDto(RuleKey.of("java", "S001")).setCardinality(Cardinality.SINGLE));
+ dao.insert(dbSession, newRuleDto(RuleKey.of("java", "S002")).setCardinality(Cardinality.MULTIPLE));
+ dbSession.commit();
+
+ // find all
+ RuleQuery query = new RuleQuery();
+ Result<Rule> results = index.search(query, new QueryOptions());
+ assertThat(results.getHits()).hasSize(2);
+
+ // Only template
+ query = new RuleQuery().setIsTemplate(true);
+ results = index.search(query, new QueryOptions());
+ assertThat(results.getHits()).hasSize(1);
+ assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S002");
+ assertThat(Iterables.getFirst(results.getHits(), null).template()).isTrue();
+
+ // Only not template
+ query = new RuleQuery().setIsTemplate(false);
+ results = index.search(query, new QueryOptions());
+ assertThat(results.getHits()).hasSize(1);
+ assertThat(Iterables.getFirst(results.getHits(), null).template()).isFalse();
+ assertThat(Iterables.getFirst(results.getHits(), null).key().rule()).isEqualTo("S001");
+
+ // null => no filter
+ query = new RuleQuery().setIsTemplate(null);
+ assertThat(index.search(query, new QueryOptions()).getHits()).hasSize(2);
+ }
+
@Test
public void paging() {
dao.insert(dbSession, newRuleDto(RuleKey.of("java", "S001")));