From dddfb6f8511a44ed0462a40c6ec39fc0ff68df98 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Mon, 5 Jun 2017 17:26:23 +0200 Subject: [PATCH] SONAR-8061 speed up set issue severity removing duplicate SQ --- .../server/issue/ws/SetSeverityAction.java | 13 ++++++---- .../issue/ws/SetSeverityActionTest.java | 25 ++++++++++++++----- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SetSeverityAction.java b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SetSeverityAction.java index 8af7217ce4b..a5aa09a7118 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SetSeverityAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SetSeverityAction.java @@ -31,6 +31,7 @@ import org.sonar.core.issue.IssueChangeContext; import org.sonar.core.util.Uuids; import org.sonar.db.DbClient; import org.sonar.db.DbSession; +import org.sonar.db.issue.IssueDto; import org.sonar.server.issue.IssueFieldsSetter; import org.sonar.server.issue.IssueFinder; import org.sonar.server.issue.IssueUpdater; @@ -94,18 +95,20 @@ public class SetSeverityAction implements IssuesWsAction { String issueKey = request.mandatoryParam(PARAM_ISSUE); String severity = request.mandatoryParam(PARAM_SEVERITY); try (DbSession session = dbClient.openSession(false)) { - setType(session, issueKey, severity); + SearchResponseData preloadedSearchResponseData = setType(session, issueKey, severity); + responseWriter.write(issueKey, preloadedSearchResponseData, request, response); } - responseWriter.write(issueKey, request, response); } - private void setType(DbSession session, String issueKey, String severity) { - DefaultIssue issue = issueFinder.getByKey(session, issueKey).toDefaultIssue(); + private SearchResponseData setType(DbSession session, String issueKey, String severity) { + IssueDto issueDto = issueFinder.getByKey(session, issueKey); + DefaultIssue issue = issueDto.toDefaultIssue(); userSession.checkComponentUuidPermission(ISSUE_ADMIN, issue.projectUuid()); IssueChangeContext context = IssueChangeContext.createUser(new Date(), userSession.getLogin()); if (issueFieldsSetter.setManualSeverity(issue, severity, context)) { - issueUpdater.saveIssue(session, issue, context, null); + return issueUpdater.saveIssueAndPreloadSearchResponseData(session, issue, context, null); } + return new SearchResponseData(issueDto); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SetSeverityActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SetSeverityActionTest.java index 901ea23a3df..8e2bfa92268 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SetSeverityActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SetSeverityActionTest.java @@ -24,6 +24,7 @@ import javax.annotation.Nullable; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.mockito.ArgumentCaptor; import org.sonar.api.config.MapSettings; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; @@ -35,6 +36,7 @@ import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.issue.IssueDbTester; import org.sonar.db.issue.IssueDto; +import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleDto; import org.sonar.server.es.EsTester; import org.sonar.server.exceptions.ForbiddenException; @@ -73,13 +75,10 @@ public class SetSeverityActionTest { @Rule public ExpectedException expectedException = ExpectedException.none(); - @Rule public DbTester dbTester = DbTester.create(); - @Rule public EsTester esTester = new EsTester(new IssueIndexDefinition(new MapSettings())); - @Rule public UserSessionRule userSession = UserSessionRule.standalone(); @@ -87,10 +86,9 @@ public class SetSeverityActionTest { private DbClient dbClient = dbTester.getDbClient(); private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); - private IssueDbTester issueDbTester = new IssueDbTester(dbTester); - private OperationResponseWriter responseWriter = mock(OperationResponseWriter.class); + private ArgumentCaptor preloadedSearchResponseDataCaptor = ArgumentCaptor.forClass(SearchResponseData.class); private IssueIndexer issueIndexer = new IssueIndexer(esTester.client(), new IssueIteratorFactory(dbClient)); private WsActionTester tester = new WsActionTester(new SetSeverityAction(userSession, dbClient, new IssueFinder(dbClient, userSession), new IssueFieldsSetter(), @@ -105,7 +103,9 @@ public class SetSeverityActionTest { call(issueDto.getKey(), MINOR); - verify(responseWriter).write(eq(issueDto.getKey()), any(Request.class), any(Response.class)); + verify(responseWriter).write(eq(issueDto.getKey()), preloadedSearchResponseDataCaptor.capture(), any(Request.class), any(Response.class)); + verifyContentOfPreloadedSearchResponseData(issueDto); + IssueDto issueReloaded = dbClient.issueDao().selectByKey(dbTester.getSession(), issueDto.getKey()).get(); assertThat(issueReloaded.getSeverity()).isEqualTo(MINOR); assertThat(issueReloaded.isManualSeverity()).isTrue(); @@ -193,4 +193,17 @@ public class SetSeverityActionTest { .addProjectPermission(ISSUE_ADMIN, project) .addProjectPermission(USER, project); } + + private void verifyContentOfPreloadedSearchResponseData(IssueDto issue) { + SearchResponseData preloadedSearchResponseData = preloadedSearchResponseDataCaptor.getValue(); + assertThat(preloadedSearchResponseData.getIssues()) + .extracting(IssueDto::getKey) + .containsOnly(issue.getKey()); + assertThat(preloadedSearchResponseData.getRules()) + .extracting(RuleDefinitionDto::getKey) + .containsOnly(issue.getRuleKey()); + assertThat(preloadedSearchResponseData.getComponents()) + .extracting(ComponentDto::uuid) + .containsOnly(issue.getComponentUuid(), issue.getProjectUuid()); + } } -- 2.39.5