From fbbb1a0ebed1211229fdb010111d1b8d99ad4ca8 Mon Sep 17 00:00:00 2001 From: Daniel Schwarz Date: Tue, 8 Aug 2017 11:30:50 +0200 Subject: [PATCH] SONAR-8798 fix quality flaws --- .../process/AbstractProcessMonitor.java | 2 +- .../process/CommandFactoryImpl.java | 8 -- .../application/process/EsProcessMonitor.java | 5 +- .../sonar/application/process/EsSettings.java | 2 +- .../process/ProcessLauncherImpl.java | 18 ++-- .../component/index/ComponentIndex.java | 3 +- .../java/org/sonar/server/es/BulkIndexer.java | 4 +- .../java/org/sonar/server/es/EsUtils.java | 51 ++------- .../java/org/sonar/server/es/NewIndex.java | 102 ++++++++++-------- .../sonar/server/es/StickyFacetBuilder.java | 3 +- .../measure/index/ProjectMeasuresIndex.java | 18 ++-- .../sonar/server/rule/index/RuleIndex.java | 54 ++++++---- .../sonar/server/test/index/TestIndex.java | 4 +- .../sonar/server/user/index/UserIndex.java | 2 +- .../issue/ws/SearchActionComponentsTest.java | 3 - 15 files changed, 121 insertions(+), 158 deletions(-) diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/AbstractProcessMonitor.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/AbstractProcessMonitor.java index f778b6e354f..1583a726a30 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/AbstractProcessMonitor.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/AbstractProcessMonitor.java @@ -30,7 +30,7 @@ import org.sonar.process.ProcessId; abstract class AbstractProcessMonitor implements ProcessMonitor { - private static final Logger LOG = LoggerFactory.getLogger(EsProcessMonitor.class); + private static final Logger LOG = LoggerFactory.getLogger(AbstractProcessMonitor.class); private static final int EXPECTED_EXIT_VALUE = 0; protected final Process process; diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/CommandFactoryImpl.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/CommandFactoryImpl.java index fdb296347a7..1214518fb54 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/CommandFactoryImpl.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/CommandFactoryImpl.java @@ -85,14 +85,6 @@ public class CommandFactoryImpl implements CommandFactory { settingsMap.forEach((key, value) -> res.addEsOption("-E" + key + "=" + value)); return res; - - // FIXME quid of proxy settings and sonar.search.javaOpts/javaAdditionalOpts - // defaults of HTTPS are the same than HTTP defaults - // setSystemPropertyToDefaultIfNotSet(command, HTTPS_PROXY_HOST, HTTP_PROXY_HOST); - // setSystemPropertyToDefaultIfNotSet(command, HTTPS_PROXY_PORT, HTTP_PROXY_PORT); - // command - // .addJavaOptions(settings.getProps().nonNullValue(ProcessProperties.SEARCH_JAVA_OPTS)) - // .addJavaOptions(settings.getProps().nonNullValue(ProcessProperties.SEARCH_JAVA_ADDITIONAL_OPTS)); } private Properties buildLog4j2Properties(File logDir) { diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/EsProcessMonitor.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/EsProcessMonitor.java index e7502535d54..4572af62128 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/EsProcessMonitor.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/EsProcessMonitor.java @@ -23,7 +23,6 @@ import com.google.common.net.HostAndPort; import io.netty.util.ThreadDeathWatcher; import io.netty.util.concurrent.GlobalEventExecutor; import java.net.InetAddress; -import java.net.MalformedURLException; import java.net.UnknownHostException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -62,7 +61,7 @@ public class EsProcessMonitor extends AbstractProcessMonitor { private final EsCommand esCommand; private AtomicReference transportClient = new AtomicReference<>(null); - public EsProcessMonitor(Process process, ProcessId processId, EsCommand esCommand) throws MalformedURLException { + public EsProcessMonitor(Process process, ProcessId processId, EsCommand esCommand) { super(process, processId); this.esCommand = esCommand; } @@ -165,7 +164,7 @@ public class EsProcessMonitor extends AbstractProcessMonitor { } private TransportClient buildTransportClient() { - org.elasticsearch.common.settings.Settings.Builder esSettings = org.elasticsearch.common.settings.Settings.builder(); + Settings.Builder esSettings = Settings.builder(); // mandatory property defined by bootstrap process esSettings.put("cluster.name", esCommand.getClusterName()); diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/EsSettings.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/EsSettings.java index cf4470e0d41..d791a4cee53 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/EsSettings.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/EsSettings.java @@ -173,7 +173,7 @@ public class EsSettings { } } - private void configureAction(Map builder) { + private static void configureAction(Map builder) { builder.put("action.auto_create_index", String.valueOf(false)); } } diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessLauncherImpl.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessLauncherImpl.java index 3ac0fd1dcd0..b2d13441f18 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessLauncherImpl.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessLauncherImpl.java @@ -81,7 +81,9 @@ public class ProcessLauncherImpl implements ProcessLauncher { try { writeConfFiles(esCommand); ProcessBuilder processBuilder = create(esCommand); - LOG.info("Launch process[{}]: {}", processId.getKey(), String.join(" ", processBuilder.command())); + if (LOG.isInfoEnabled()) { + LOG.info("Launch process[{}]: {}", processId.getKey(), String.join(" ", processBuilder.command())); + } process = processBuilder.start(); @@ -108,7 +110,6 @@ public class ProcessLauncherImpl implements ProcessLauncher { IOUtils.copy(getClass().getResourceAsStream("jvm.options"), new FileOutputStream(new File(confDir, "jvm.options"))); esCommand.getLog4j2Properties().store(new FileOutputStream(new File(confDir, "log4j2.properties")), "log42 properties file for ES bundled in SonarQube"); } catch (IOException e) { - e.printStackTrace(); throw new IllegalStateException("Failed to write ES configuration files", e); } } @@ -121,7 +122,9 @@ public class ProcessLauncherImpl implements ProcessLauncher { ProcessCommands commands = allProcessesCommands.createAfterClean(processId.getIpcIndex()); ProcessBuilder processBuilder = create(javaCommand); - LOG.info("Launch process[{}]: {}", processId.getKey(), String.join(" ", processBuilder.command())); + if (LOG.isInfoEnabled()) { + LOG.info("Launch process[{}]: {}", processId.getKey(), String.join(" ", processBuilder.command())); + } process = processBuilder.start(); return new ProcessCommandsProcessMonitor(process, processId, commands); } catch (Exception e) { @@ -143,18 +146,20 @@ public class ProcessLauncherImpl implements ProcessLauncher { return create(esCommand, commands); } - private void writeJvmOptions(EsCommand esCommand) { + private static void writeJvmOptions(EsCommand esCommand) { Path jvmOptionsFile = esCommand.getJvmOptionsFile(); String jvmOptions = esCommand.getJvmOptions() .stream() - .map(s -> s.split(" (?=-)"))// FIXME this pattern does not allow escaping + + // we do not expect the user to use parameters containing " -" + .map(s -> s.split(" (?=-)")) .flatMap(Arrays::stream) .collect(Collectors.joining("\n")); String jvmOptionsContent = ELASTICSEARCH_JVM_OPTIONS_HEADER + jvmOptions; try { Files.write(jvmOptionsFile, jvmOptionsContent.getBytes(Charset.forName("UTF-8"))); } catch (IOException e) { - throw new RuntimeException("Cannot write Elasticsearch jvm options file", e); + throw new IllegalStateException("Cannot write Elasticsearch jvm options file", e); } } @@ -199,7 +204,6 @@ public class ProcessLauncherImpl implements ProcessLauncher { props.putAll(javaCommand.getArguments()); props.setProperty(PROPERTY_PROCESS_KEY, javaCommand.getProcessId().getKey()); props.setProperty(PROPERTY_PROCESS_INDEX, Integer.toString(javaCommand.getProcessId().getIpcIndex())); - // FIXME is it the responsibility of child process to have this timeout (too) ? props.setProperty(PROPERTY_TERMINATION_TIMEOUT, "60000"); props.setProperty(PROPERTY_SHARED_PATH, tempDir.getAbsolutePath()); try (OutputStream out = new FileOutputStream(propertiesFile)) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndex.java b/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndex.java index 9078c0b2d96..41b07f569e6 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/index/ComponentIndex.java @@ -32,7 +32,6 @@ import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.filters.FiltersAggregationBuilder; -import org.elasticsearch.search.aggregations.bucket.filters.FiltersAggregator; import org.elasticsearch.search.aggregations.bucket.filters.FiltersAggregator.KeyedFilter; import org.elasticsearch.search.aggregations.bucket.filters.InternalFilters; import org.elasticsearch.search.aggregations.bucket.filters.InternalFilters.InternalBucket; @@ -156,6 +155,6 @@ public class ComponentIndex { SearchHits hitList = docs.getHits(); SearchHit[] hits = hitList.getHits(); - return new ComponentHitsPerQualifier(bucket.getKey(), ComponentHit.fromSearchHits(hits), hitList.totalHits()); + return new ComponentHitsPerQualifier(bucket.getKey(), ComponentHit.fromSearchHits(hits), hitList.getTotalHits()); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/es/BulkIndexer.java b/server/sonar-server/src/main/java/org/sonar/server/es/BulkIndexer.java index 8881940b02a..cf931dff496 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/es/BulkIndexer.java +++ b/server/sonar-server/src/main/java/org/sonar/server/es/BulkIndexer.java @@ -151,8 +151,8 @@ public class BulkIndexer { while (true) { SearchHit[] hits = searchResponse.getHits().getHits(); for (SearchHit hit : hits) { - SearchHitField routing = hit.field("_routing"); - DeleteRequestBuilder deleteRequestBuilder = client.prepareDelete(hit.index(), hit.type(), hit.getId()); + SearchHitField routing = hit.getField("_routing"); + DeleteRequestBuilder deleteRequestBuilder = client.prepareDelete(hit.getIndex(), hit.getType(), hit.getId()); if (routing != null) { deleteRequestBuilder.setRouting(routing.getValue()); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/es/EsUtils.java b/server/sonar-server/src/main/java/org/sonar/server/es/EsUtils.java index 12a012d1b2d..d9cabf1bb59 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/es/EsUtils.java +++ b/server/sonar-server/src/main/java/org/sonar/server/es/EsUtils.java @@ -65,7 +65,7 @@ public class EsUtils { return docs; } - public static LinkedHashMap termsToMap(Terms terms) { + public static Map termsToMap(Terms terms) { LinkedHashMap map = new LinkedHashMap<>(); List buckets = terms.getBuckets(); for (Terms.Bucket bucket : buckets) { @@ -115,58 +115,19 @@ public class EsUtils { return SPECIAL_REGEX_CHARS.matcher(str).replaceAll("\\\\$0"); } - private static class DocScrollIterator implements Iterator { - - private final EsClient esClient; - private final String scrollId; - private final Function, D> docConverter; - - private final Queue hits = new ArrayDeque<>(); - - private DocScrollIterator(EsClient esClient, SearchResponse scrollResponse, Function, D> docConverter) { - this.esClient = esClient; - this.scrollId = scrollResponse.getScrollId(); - this.docConverter = docConverter; - Collections.addAll(hits, scrollResponse.getHits().getHits()); - } - - @Override - public boolean hasNext() { - if (hits.isEmpty()) { - SearchScrollRequestBuilder esRequest = esClient.prepareSearchScroll(scrollId) - .setScroll(TimeValue.timeValueMinutes(SCROLL_TIME_IN_MINUTES)); - Collections.addAll(hits, esRequest.get().getHits().getHits()); - } - return !hits.isEmpty(); - } - - @Override - public D next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - return docConverter.apply(hits.poll().getSource()); - } - - @Override - public void remove() { - throw new UnsupportedOperationException("Cannot remove item when scrolling"); - } - } - - public static Iterator scrollIds(EsClient esClient, SearchResponse scrollResponse, Function idConverter) { + public static Iterator scrollIds(EsClient esClient, SearchResponse scrollResponse, Function idConverter) { return new IdScrollIterator<>(esClient, scrollResponse, idConverter); } - private static class IdScrollIterator implements Iterator { + private static class IdScrollIterator implements Iterator { private final EsClient esClient; private final String scrollId; - private final Function idConverter; + private final Function idConverter; private final Queue hits = new ArrayDeque<>(); - private IdScrollIterator(EsClient esClient, SearchResponse scrollResponse, Function idConverter) { + private IdScrollIterator(EsClient esClient, SearchResponse scrollResponse, Function idConverter) { this.esClient = esClient; this.scrollId = scrollResponse.getScrollId(); this.idConverter = idConverter; @@ -184,7 +145,7 @@ public class EsUtils { } @Override - public ID next() { + public I next() { if (!hasNext()) { throw new NoSuchElementException(); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java b/server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java index 306c05752f6..bba7ef58450 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java @@ -338,55 +338,63 @@ public class NewIndex { } public NewIndexType build() { - Map hash = new TreeMap<>(); if (subFields.isEmpty()) { - hash.putAll(ImmutableMap.of( - "type", getFieldType(), - "index", disableSearch ? INDEX_NOT_SEARCHABLE : INDEX_SEARCHABLE, - "norms", valueOf(!disableNorms), - "store", valueOf(store))); - if (getFieldData()) { - hash.put(FIELD_FIELDDATA, FIELDDATA_ENABLED); - } - } else { - hash.put("type", getFieldType()); - - Map multiFields = new TreeMap<>(subFields); - - if (termVectorWithPositionOffsets) { - multiFields.entrySet().forEach(entry -> { - Object subFieldMapping = entry.getValue(); - if (subFieldMapping instanceof Map) { - entry.setValue( - addFieldToMapping( - (Map) subFieldMapping, - FIELD_TERM_VECTOR, "with_positions_offsets")); - } - }); - hash.put(FIELD_TERM_VECTOR, "with_positions_offsets"); - } - if (getFieldData()) { - multiFields.entrySet().forEach(entry -> { - Object subFieldMapping = entry.getValue(); - if (subFieldMapping instanceof Map) { - entry.setValue( - addFieldToMapping( - (Map) subFieldMapping, - FIELD_FIELDDATA, FIELDDATA_ENABLED)); - } - }); - hash.put(FIELD_FIELDDATA, FIELDDATA_ENABLED); - } - - multiFields.put(fieldName, ImmutableMap.of( - "type", getFieldType(), - "index", INDEX_SEARCHABLE, - "norms", "false", - "store", valueOf(store))); - - hash.put("fields", multiFields); + return buildWithoutSubfields(); + } + return buildWithSubfields(); + } + + private NewIndexType buildWithoutSubfields() { + Map hash = new TreeMap<>(); + hash.putAll(ImmutableMap.of( + "type", getFieldType(), + INDEX, disableSearch ? INDEX_NOT_SEARCHABLE : INDEX_SEARCHABLE, + "norms", valueOf(!disableNorms), + "store", valueOf(store))); + if (getFieldData()) { + hash.put(FIELD_FIELDDATA, FIELDDATA_ENABLED); + } + return indexType.setProperty(fieldName, hash); + } + + private NewIndexType buildWithSubfields() { + Map hash = new TreeMap<>(); + hash.put("type", getFieldType()); + + Map multiFields = new TreeMap<>(subFields); + + if (termVectorWithPositionOffsets) { + multiFields.entrySet().forEach(entry -> { + Object subFieldMapping = entry.getValue(); + if (subFieldMapping instanceof Map) { + entry.setValue( + addFieldToMapping( + (Map) subFieldMapping, + FIELD_TERM_VECTOR, "with_positions_offsets")); + } + }); + hash.put(FIELD_TERM_VECTOR, "with_positions_offsets"); + } + if (getFieldData()) { + multiFields.entrySet().forEach(entry -> { + Object subFieldMapping = entry.getValue(); + if (subFieldMapping instanceof Map) { + entry.setValue( + addFieldToMapping( + (Map) subFieldMapping, + FIELD_FIELDDATA, FIELDDATA_ENABLED)); + } + }); + hash.put(FIELD_FIELDDATA, FIELDDATA_ENABLED); } + multiFields.put(fieldName, ImmutableMap.of( + "type", getFieldType(), + INDEX, INDEX_SEARCHABLE, + "norms", "false", + "store", valueOf(store))); + hash.put("fields", multiFields); + return indexType.setProperty(fieldName, hash); } @@ -463,7 +471,7 @@ public class NewIndex { public NestedFieldBuilder addKeywordField(String fieldName) { return setProperty(fieldName, ImmutableMap.of( "type", FIELD_TYPE_KEYWORD, - "index", INDEX_SEARCHABLE)); + INDEX, INDEX_SEARCHABLE)); } public NestedFieldBuilder addDoubleField(String fieldName) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/es/StickyFacetBuilder.java b/server/sonar-server/src/main/java/org/sonar/server/es/StickyFacetBuilder.java index b714d3bbfbc..d8e387f10f1 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/es/StickyFacetBuilder.java +++ b/server/sonar-server/src/main/java/org/sonar/server/es/StickyFacetBuilder.java @@ -81,7 +81,8 @@ public class StickyFacetBuilder { * @param selected the terms, that the user already has selected * @return the (global) aggregation, that can be added on top level of the elasticsearch request */ - public AggregationBuilder buildStickyFacet(String fieldName, String facetName, Function additionalAggregationFilter, Object... selected) { + public AggregationBuilder buildStickyFacet(String fieldName, String facetName, Function additionalAggregationFilter, + Object... selected) { return buildStickyFacet(fieldName, facetName, FACET_DEFAULT_SIZE, additionalAggregationFilter, selected); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndex.java b/server/sonar-server/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndex.java index 56196237dd4..7d9931d074c 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndex.java @@ -284,13 +284,13 @@ public class ProjectMeasuresIndex { filters.put("__authorization", authorizationTypeSupport.createQueryFilter()); Multimap metricCriterionMultimap = ArrayListMultimap.create(); query.getMetricCriteria().forEach(metricCriterion -> metricCriterionMultimap.put(metricCriterion.getMetricKey(), metricCriterion)); - metricCriterionMultimap.asMap().entrySet().forEach(entry -> { + metricCriterionMultimap.asMap().forEach((key, value) -> { BoolQueryBuilder metricFilters = boolQuery(); - entry.getValue() + value .stream() .map(ProjectMeasuresIndex::toQuery) .forEach(metricFilters::must); - filters.put(entry.getKey(), metricFilters); + filters.put(key, metricFilters); }); query.getQualityGateStatus() @@ -308,18 +308,12 @@ public class ProjectMeasuresIndex { query.getTags() .ifPresent(tags -> filters.put(FIELD_TAGS, termsQuery(FIELD_TAGS, tags))); - createTextQueryFilter(query).ifPresent(queryBuilder -> filters.put("textQuery", queryBuilder)); + query.getQueryText() + .map(ProjectsTextSearchQueryFactory::createQuery) + .ifPresent(queryBuilder -> filters.put("textQuery", queryBuilder)); return filters; } - private static Optional createTextQueryFilter(ProjectMeasuresQuery query) { - Optional queryText = query.getQueryText(); - if (!queryText.isPresent()) { - return Optional.empty(); - } - return Optional.of(ProjectsTextSearchQueryFactory.createQuery(queryText.get())); - } - private static QueryBuilder toQuery(MetricCriterion criterion) { if (criterion.isNoData()) { return boolQuery().mustNot( diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java index 57f63f63196..ee0a7256bea 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java @@ -215,7 +215,6 @@ public class RuleIndex { /* Build main filter (match based) */ private static Map buildFilters(RuleQuery query) { - Map filters = new HashMap<>(); /* Add enforced filter on rules that are REMOVED */ @@ -255,14 +254,8 @@ public class RuleIndex { } if (isNotEmpty(query.getTags())) { - BoolQueryBuilder q = boolQuery(); - query.getTags().stream() - .map(tag -> boolQuery() - .filter(QueryBuilders.termQuery(FIELD_RULE_EXTENSION_TAGS, tag)) - .filter(termsQuery(FIELD_RULE_EXTENSION_SCOPE, RuleExtensionScope.system().getScope(), RuleExtensionScope.organization(query.getOrganization()).getScope()))) - .map(childQuery -> JoinQueryBuilders.hasChildQuery(INDEX_TYPE_RULE_EXTENSION.getType(), childQuery, ScoreMode.None)) - .forEach(q::should); - filters.put(FIELD_RULE_EXTENSION_TAGS, q); + filters.put(FIELD_RULE_EXTENSION_TAGS, + buildTagsFilter(query.getTags(), query.getOrganization())); } Collection types = query.getTypes(); @@ -301,20 +294,7 @@ public class RuleIndex { /* Implementation of activation query */ QProfileDto profile = query.getQProfile(); if (query.getActivation() != null && profile != null) { - - // ActiveRule Filter (profile and inheritance) - BoolQueryBuilder activeRuleFilter = boolQuery(); - addTermFilter(activeRuleFilter, FIELD_ACTIVE_RULE_PROFILE_UUID, profile.getRulesProfileUuid()); - addTermFilter(activeRuleFilter, FIELD_ACTIVE_RULE_INHERITANCE, query.getInheritance()); - addTermFilter(activeRuleFilter, FIELD_ACTIVE_RULE_SEVERITY, query.getActiveSeverities()); - - // ChildQuery - QueryBuilder childQuery; - if (activeRuleFilter.hasClauses()) { - childQuery = activeRuleFilter; - } else { - childQuery = matchAllQuery(); - } + QueryBuilder childQuery = buildActivationFilter(query, profile); if (TRUE.equals(query.getActivation())) { filters.put("activation", @@ -339,6 +319,34 @@ public class RuleIndex { return filters; } + private static BoolQueryBuilder buildTagsFilter(Collection tags, OrganizationDto organization) { + BoolQueryBuilder q = boolQuery(); + tags.stream() + .map(tag -> boolQuery() + .filter(QueryBuilders.termQuery(FIELD_RULE_EXTENSION_TAGS, tag)) + .filter(termsQuery(FIELD_RULE_EXTENSION_SCOPE, RuleExtensionScope.system().getScope(), RuleExtensionScope.organization(organization).getScope()))) + .map(childQuery -> JoinQueryBuilders.hasChildQuery(INDEX_TYPE_RULE_EXTENSION.getType(), childQuery, ScoreMode.None)) + .forEach(q::should); + return q; + } + + private static QueryBuilder buildActivationFilter(RuleQuery query, QProfileDto profile) { + // ActiveRule Filter (profile and inheritance) + BoolQueryBuilder activeRuleFilter = boolQuery(); + addTermFilter(activeRuleFilter, FIELD_ACTIVE_RULE_PROFILE_UUID, profile.getRulesProfileUuid()); + addTermFilter(activeRuleFilter, FIELD_ACTIVE_RULE_INHERITANCE, query.getInheritance()); + addTermFilter(activeRuleFilter, FIELD_ACTIVE_RULE_SEVERITY, query.getActiveSeverities()); + + // ChildQuery + QueryBuilder childQuery; + if (activeRuleFilter.hasClauses()) { + childQuery = activeRuleFilter; + } else { + childQuery = matchAllQuery(); + } + return childQuery; + } + private static BoolQueryBuilder addTermFilter(BoolQueryBuilder filter, String field, @Nullable Collection values) { if (isNotEmpty(values)) { BoolQueryBuilder valuesFilter = boolQuery(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/test/index/TestIndex.java b/server/sonar-server/src/main/java/org/sonar/server/test/index/TestIndex.java index 6e57de3be20..90dd3cc000d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/test/index/TestIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/test/index/TestIndex.java @@ -53,7 +53,7 @@ public class TestIndex { .setSize(1) .setQuery(boolQuery().must(matchAllQuery()).filter(termQuery(FIELD_TEST_UUID, testUuid))) .get().getHits().getHits()) { - coveredFiles.addAll(new TestDoc(hit.sourceAsMap()).coveredFiles()); + coveredFiles.addAll(new TestDoc(hit.getSourceAsMap()).coveredFiles()); } return coveredFiles; @@ -97,7 +97,7 @@ public class TestIndex { .setQuery(boolQuery().must(matchAllQuery()).filter(termQuery(FIELD_TEST_UUID, testUuid))) .get().getHits().getHits(); if (hits.length > 0) { - return Optional.of(new TestDoc(hits[0].sourceAsMap())); + return Optional.of(new TestDoc(hits[0].getSourceAsMap())); } return Optional.absent(); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndex.java b/server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndex.java index 8eb0f0213e8..0ddb194e46d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndex.java @@ -90,7 +90,7 @@ public class UserIndex { .should(matchQuery(SORTABLE_ANALYZER.subField(FIELD_SCM_ACCOUNTS), scmAccount)))) .setSize(3); for (SearchHit hit : request.get().getHits().getHits()) { - result.add(new UserDoc(hit.sourceAsMap())); + result.add(new UserDoc(hit.getSourceAsMap())); } } return result; diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java index 41e70c47322..29fac927c51 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java @@ -23,7 +23,6 @@ import java.io.IOException; import java.util.List; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.sonar.api.config.internal.MapSettings; @@ -210,7 +209,6 @@ public class SearchActionComponentsTest { .assertJson(this.getClass(), "no_issue.json"); } - @Ignore @Test public void search_since_leak_period_on_project() throws Exception { ComponentDto project = insertComponent(ComponentTesting.newPublicProjectDto(otherOrganization2, "P1").setDbKey("PK1")); @@ -239,7 +237,6 @@ public class SearchActionComponentsTest { .assertJson(this.getClass(), "search_since_leak_period.json"); } - @Ignore @Test public void search_since_leak_period_on_file_in_module_project() throws Exception { ComponentDto project = insertComponent(ComponentTesting.newPublicProjectDto(defaultOrganization, "P1").setDbKey("PK1")); -- 2.39.5