From 3e20cbb28fbcf4cd0f18ed5516b193654851bd06 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Lievremont Date: Wed, 5 Mar 2014 09:28:28 +0100 Subject: [PATCH] SONAR-5087 Use correct filter and field for match against name --- .../java/org/sonar/server/rule/RuleRegistry.java | 15 ++++++++++----- .../org/sonar/server/rule/RuleRegistryTest.java | 12 ++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/sonar-server/src/main/java/org/sonar/server/rule/RuleRegistry.java b/sonar-server/src/main/java/org/sonar/server/rule/RuleRegistry.java index c8570d771e3..5e68748543c 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule/RuleRegistry.java +++ b/sonar-server/src/main/java/org/sonar/server/rule/RuleRegistry.java @@ -23,13 +23,17 @@ package org.sonar.server.rule; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.Multimap; +import org.apache.commons.lang.StringUtils; import org.elasticsearch.ElasticSearchException; import org.elasticsearch.common.collect.Lists; import org.elasticsearch.common.collect.Maps; import org.elasticsearch.common.io.BytesStream; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.index.query.BoolFilterBuilder; import org.elasticsearch.index.query.FilterBuilders; +import org.elasticsearch.index.query.MatchQueryBuilder.Operator; +import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.sort.SortOrder; @@ -123,13 +127,14 @@ public class RuleRegistry { } public PagedResult find(RuleQuery query) { + BoolFilterBuilder mainFilter = FilterBuilders.boolFilter().mustNot(FilterBuilders.termFilter(RuleDocument.FIELD_STATUS, STATUS_REMOVED)); + if (StringUtils.isNotBlank(query.query())) { + mainFilter.must(FilterBuilders.queryFilter( + QueryBuilders.matchQuery(RuleDocument.FIELD_NAME+".search", query.query()).operator(Operator.AND))); + } SearchHits hits = searchIndex.executeRequest( searchIndex.client().prepareSearch(INDEX_RULES).setTypes(TYPE_RULE) - .setPostFilter( - FilterBuilders.boolFilter() - .must(FilterBuilders.termFilter(RuleDocument.FIELD_NAME, query.query())) - .mustNot(FilterBuilders.termFilter(RuleDocument.FIELD_STATUS, STATUS_REMOVED)) - ) + .setPostFilter(mainFilter) .addSort(RuleDocument.FIELD_NAME, SortOrder.ASC) .setSize(query.paging().pageSize()) .setFrom(query.paging().offset())); diff --git a/sonar-server/src/test/java/org/sonar/server/rule/RuleRegistryTest.java b/sonar-server/src/test/java/org/sonar/server/rule/RuleRegistryTest.java index 30960ec6795..b91e362c1fb 100644 --- a/sonar-server/src/test/java/org/sonar/server/rule/RuleRegistryTest.java +++ b/sonar-server/src/test/java/org/sonar/server/rule/RuleRegistryTest.java @@ -273,6 +273,18 @@ public class RuleRegistryTest { assertThat(esSetup.exists("rules", "rule", "3")).isFalse(); } + @Test + public void should_find_rules_by_name() { + // Removed rule should not appear + assertThat(registry.find(RuleQuery.builder().withPage(1).withPageSize(10).build()).results()).hasSize(2); + + // Search is case insensitive + assertThat(registry.find(RuleQuery.builder().withPage(1).withPageSize(10).withSearchQuery("one issue per line").build()).results()).hasSize(1); + + // Search is ngram based + assertThat(registry.find(RuleQuery.builder().withPage(1).withPageSize(10).withSearchQuery("with param").build()).results()).hasSize(1); + } + private String testFileAsString(String testFile) throws Exception { return IOUtils.toString(TestUtils.getResource(getClass(), testFile).toURI()); } -- 2.39.5