aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorJenkins CI <ci@sonarsource.com>2015-10-19 16:35:34 +0200
committerJenkins CI <ci@sonarsource.com>2015-10-19 16:35:34 +0200
commit26817f2f1b31d777b681cc08f3a06db201521007 (patch)
tree5810a84e091fc6cc4c14f8ab88e941f5ac45c928 /server
parent04dd8ed3ace12b889258c7b07d1bb5abca673c6e (diff)
parent5ad6fee42b1b74f36c3df201fe37d14c969dec44 (diff)
downloadsonarqube-26817f2f1b31d777b681cc08f3a06db201521007.tar.gz
sonarqube-26817f2f1b31d777b681cc08f3a06db201521007.zip
Automatic merge from branch-5.2
* origin/branch-5.2: SONAR-6582 do not return module key on single-module projects Use doc_values on some fields of ES index issues/issue Improve ES request for facets resolutions, status and severities fix display of issues filters manage link correct profile comparison wording SONAR-6926 remove Cross Project Duplication properties declaration
Diffstat (limited to 'server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java9
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java6
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndexDefinition.java16
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java8
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsMediumTest.java36
-rw-r--r--server/sonar-web/src/main/js/apps/issues/filters-view.js1
-rw-r--r--server/sonar-web/src/main/js/apps/quality-profiles/templates/quality-profile-comparison.hbs2
7 files changed, 62 insertions, 16 deletions
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 7f9a599cba0..127c77e5a3d 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
@@ -178,6 +178,15 @@ public class NewIndex {
this.fieldName = fieldName;
}
+ /**
+ * It is recommended to enable doc_values when the non-analyzed field is involved
+ * into aggregations/sorting and only a small fraction of the values is used (high
+ * number of different values)
+ * <ul>
+ * <li>https://www.elastic.co/blog/found-sizing-elasticsearch</li>
+ * <li>https://www.elastic.co/guide/en/elasticsearch/guide/current/doc-values.html</li>
+ * </ul>
+ */
public StringFieldBuilder docValues() {
this.docValues = true;
return this;
diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java b/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java
index 07651b46cb3..e4a826d46f6 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java
@@ -381,9 +381,9 @@ public class IssueIndex extends BaseIndex {
StickyFacetBuilder stickyFacetBuilder = newStickyFacetBuilder(query, filters, esQuery);
// Execute Term aggregations
addSimpleStickyFacetIfNeeded(options, stickyFacetBuilder, esSearch,
- IssueFilterParameters.SEVERITIES, IssueIndexDefinition.FIELD_ISSUE_SEVERITY, Severity.ALL.toArray());
+ IssueFilterParameters.SEVERITIES, IssueIndexDefinition.FIELD_ISSUE_SEVERITY);
addSimpleStickyFacetIfNeeded(options, stickyFacetBuilder, esSearch,
- IssueFilterParameters.STATUSES, IssueIndexDefinition.FIELD_ISSUE_STATUS, Issue.STATUSES.toArray());
+ IssueFilterParameters.STATUSES, IssueIndexDefinition.FIELD_ISSUE_STATUS);
addSimpleStickyFacetIfNeeded(options, stickyFacetBuilder, esSearch,
IssueFilterParameters.PROJECT_UUIDS, IssueIndexDefinition.FIELD_ISSUE_PROJECT_UUID, query.projectUuids().toArray());
addSimpleStickyFacetIfNeeded(options, stickyFacetBuilder, esSearch,
@@ -582,7 +582,7 @@ public class IssueIndex extends BaseIndex {
StickyFacetBuilder assigneeFacetBuilder = newStickyFacetBuilder(query, resolutionFilters, esQuery);
BoolFilterBuilder facetFilter = assigneeFacetBuilder.getStickyFacetFilter(fieldName);
FilterAggregationBuilder facetTopAggregation = assigneeFacetBuilder.buildTopFacetAggregation(fieldName, facetName, facetFilter, DEFAULT_FACET_SIZE);
- facetTopAggregation = assigneeFacetBuilder.addSelectedItemsToFacet(fieldName, facetName, facetTopAggregation, Issue.RESOLUTIONS.toArray());
+ facetTopAggregation = assigneeFacetBuilder.addSelectedItemsToFacet(fieldName, facetName, facetTopAggregation);
// Add missing facet for unresolved issues
facetTopAggregation.subAggregation(
diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndexDefinition.java b/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndexDefinition.java
index 0157b9539ea..a5c8c3e15f5 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndexDefinition.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndexDefinition.java
@@ -107,11 +107,11 @@ public class IssueIndexDefinition implements IndexDefinition {
issueMapping.setAttribute("_id", ImmutableMap.of("path", FIELD_ISSUE_KEY));
issueMapping.setAttribute("_parent", ImmutableMap.of("type", TYPE_AUTHORIZATION));
issueMapping.setAttribute("_routing", ImmutableMap.of("required", true, "path", FIELD_ISSUE_PROJECT_UUID));
- issueMapping.stringFieldBuilder(FIELD_ISSUE_ACTION_PLAN).build();
+ issueMapping.stringFieldBuilder(FIELD_ISSUE_ACTION_PLAN).docValues().build();
issueMapping.stringFieldBuilder(FIELD_ISSUE_ASSIGNEE).enableSorting().build();
- issueMapping.stringFieldBuilder(FIELD_ISSUE_ATTRIBUTES).disableSearch().build();
- issueMapping.stringFieldBuilder(FIELD_ISSUE_AUTHOR_LOGIN).build();
- issueMapping.stringFieldBuilder(FIELD_ISSUE_COMPONENT_UUID).build();
+ issueMapping.stringFieldBuilder(FIELD_ISSUE_ATTRIBUTES).docValues().disableSearch().build();
+ issueMapping.stringFieldBuilder(FIELD_ISSUE_AUTHOR_LOGIN).docValues().build();
+ issueMapping.stringFieldBuilder(FIELD_ISSUE_COMPONENT_UUID).docValues().build();
issueMapping.createLongField(FIELD_ISSUE_DEBT);
issueMapping.createDoubleField(FIELD_ISSUE_EFFORT);
issueMapping.stringFieldBuilder(FIELD_ISSUE_FILE_PATH).enableSorting().build();
@@ -121,12 +121,12 @@ public class IssueIndexDefinition implements IndexDefinition {
issueMapping.stringFieldBuilder(FIELD_ISSUE_KEY).enableSorting().build();
issueMapping.stringFieldBuilder(FIELD_ISSUE_LANGUAGE).build();
issueMapping.createIntegerField(FIELD_ISSUE_LINE);
- issueMapping.stringFieldBuilder(FIELD_ISSUE_MESSAGE).build();
- issueMapping.stringFieldBuilder(FIELD_ISSUE_MODULE_UUID).build();
+ issueMapping.stringFieldBuilder(FIELD_ISSUE_MESSAGE).docValues().build();
+ issueMapping.stringFieldBuilder(FIELD_ISSUE_MODULE_UUID).docValues().build();
issueMapping.createUuidPathField(FIELD_ISSUE_MODULE_PATH);
issueMapping.stringFieldBuilder(FIELD_ISSUE_PROJECT_UUID).enableSorting().build();
- issueMapping.stringFieldBuilder(FIELD_ISSUE_DIRECTORY_PATH).build();
- issueMapping.stringFieldBuilder(FIELD_ISSUE_REPORTER).build();
+ issueMapping.stringFieldBuilder(FIELD_ISSUE_DIRECTORY_PATH).docValues().build();
+ issueMapping.stringFieldBuilder(FIELD_ISSUE_REPORTER).docValues().build();
issueMapping.stringFieldBuilder(FIELD_ISSUE_RESOLUTION).build();
issueMapping.stringFieldBuilder(FIELD_ISSUE_RULE_KEY).build();
issueMapping.stringFieldBuilder(FIELD_ISSUE_SEVERITY).build();
diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java
index ba7ba678e19..8fbc8f83cd1 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java
@@ -152,10 +152,10 @@ public class SearchResponseFormat {
ComponentDto project = data.getComponentByUuid(dto.getProjectUuid());
if (project != null) {
issueBuilder.setProject(project.getKey());
- }
- ComponentDto subProject = data.getComponentByUuid(dto.getModuleUuid());
- if (subProject != null) {
- issueBuilder.setSubProject(subProject.getKey());
+ ComponentDto subProject = data.getComponentByUuid(dto.getModuleUuid());
+ if (subProject != null && !subProject.getKey().equals(project.getKey())) {
+ issueBuilder.setSubProject(subProject.getKey());
+ }
}
issueBuilder.setRule(dto.getRuleKey().toString());
issueBuilder.setSeverity(Common.Severity.valueOf(dto.getSeverity()));
diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsMediumTest.java
index 88c1e8cfd18..57ad3a5a90c 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsMediumTest.java
@@ -20,6 +20,7 @@
package org.sonar.server.issue.ws;
+import java.io.IOException;
import java.util.List;
import org.junit.After;
import org.junit.Before;
@@ -45,15 +46,20 @@ import org.sonar.server.issue.filter.IssueFilterParameters;
import org.sonar.server.issue.index.IssueIndexer;
import org.sonar.server.permission.PermissionChange;
import org.sonar.server.permission.PermissionUpdater;
+import org.sonar.server.plugins.MimeTypes;
import org.sonar.server.rule.db.RuleDao;
import org.sonar.server.tester.ServerTester;
import org.sonar.server.tester.UserSessionRule;
import org.sonar.server.view.index.ViewDoc;
import org.sonar.server.view.index.ViewIndexer;
+import org.sonar.server.ws.TestResponse;
+import org.sonar.server.ws.WsActionTester;
import org.sonar.server.ws.WsTester;
import org.sonar.server.ws.WsTester.Result;
+import org.sonarqube.ws.Issues;
import static com.google.common.collect.Lists.newArrayList;
+import static org.assertj.core.api.Assertions.assertThat;
public class SearchActionComponentsMediumTest {
@@ -112,6 +118,36 @@ public class SearchActionComponentsMediumTest {
}
@Test
+ public void do_not_return_module_key_on_single_module_projects() throws IOException {
+ ComponentDto project = insertComponent(ComponentTesting.newProjectDto("P1").setKey("PK1"));
+ setDefaultProjectPermission(project);
+ ComponentDto module = insertComponent(ComponentTesting.newModuleDto("M1", project).setKey("MK1"));
+ ComponentDto file = insertComponent(ComponentTesting.newFileDto(module, "F1").setKey("FK1"));
+ RuleDto newRule = newRule();
+ IssueDto issueInModule = IssueTesting.newDto(newRule, file, project).setKee("ISSUE_IN_MODULE");
+ IssueDto issueInRootModule = IssueTesting.newDto(newRule, project, project).setKee("ISSUE_IN_ROOT_MODULE");
+ db.issueDao().insert(session, issueInModule, issueInRootModule);
+ session.commit();
+ tester.get(IssueIndexer.class).indexAll();
+
+ WsActionTester actionTester = new WsActionTester(tester.get(SearchAction.class));
+ TestResponse response = actionTester.newRequest()
+ .setMediaType(MimeTypes.PROTOBUF)
+ .execute();
+ Issues.Search searchResponse = Issues.Search.parseFrom(response.getInputStream());
+ assertThat(searchResponse.getIssuesCount()).isEqualTo(2);
+
+ for (Issues.Issue issue : searchResponse.getIssuesList()) {
+ assertThat(issue.getProject()).isEqualTo("PK1");
+ if (issue.getKey().equals("ISSUE_IN_MODULE")) {
+ assertThat(issue.getSubProject()).isEqualTo("MK1");
+ } else if (issue.getKey().equals("ISSUE_IN_ROOT_MODULE")) {
+ assertThat(issue.hasSubProject()).isFalse();
+ }
+ }
+ }
+
+ @Test
public void search_by_project_uuid() throws Exception {
ComponentDto project = insertComponent(ComponentTesting.newProjectDto("P1").setKey("PK1"));
setDefaultProjectPermission(project);
diff --git a/server/sonar-web/src/main/js/apps/issues/filters-view.js b/server/sonar-web/src/main/js/apps/issues/filters-view.js
index 50fdae86217..5556960a41b 100644
--- a/server/sonar-web/src/main/js/apps/issues/filters-view.js
+++ b/server/sonar-web/src/main/js/apps/issues/filters-view.js
@@ -19,6 +19,7 @@ export default Marionette.ItemView.extend({
var that = this;
this.listenTo(options.app.state, 'change:filter', this.render);
this.listenTo(options.app.state, 'change:changed', this.render);
+ this.listenTo(options.app.state, 'change:canManageFilters', this.render);
this.listenTo(options.app.filters, 'reset', this.render);
window.onSaveAs = window.onCopy = window.onEdit = function (id) {
$('#modal').dialog('close');
diff --git a/server/sonar-web/src/main/js/apps/quality-profiles/templates/quality-profile-comparison.hbs b/server/sonar-web/src/main/js/apps/quality-profiles/templates/quality-profile-comparison.hbs
index e6eeeb28eb5..0f920b43361 100644
--- a/server/sonar-web/src/main/js/apps/quality-profiles/templates/quality-profile-comparison.hbs
+++ b/server/sonar-web/src/main/js/apps/quality-profiles/templates/quality-profile-comparison.hbs
@@ -15,7 +15,7 @@
<button class="text-middle" id="quality-profile-comparison-form-submit">{{t 'compare'}}</button>
</form>
{{else}}
- <div class="alert alert-info">There is no profiles to compare with.</div>
+ <div class="alert alert-info">{{t 'quality_profiles.no_profiles_for_comparison'}}</div>
{{/notEmpty}}
{{#notNull comparison}}