diff options
author | Jenkins CI <ci@sonarsource.com> | 2015-10-19 16:35:34 +0200 |
---|---|---|
committer | Jenkins CI <ci@sonarsource.com> | 2015-10-19 16:35:34 +0200 |
commit | 26817f2f1b31d777b681cc08f3a06db201521007 (patch) | |
tree | 5810a84e091fc6cc4c14f8ab88e941f5ac45c928 /server | |
parent | 04dd8ed3ace12b889258c7b07d1bb5abca673c6e (diff) | |
parent | 5ad6fee42b1b74f36c3df201fe37d14c969dec44 (diff) | |
download | sonarqube-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')
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}} |