From: Jean-Baptiste Lievremont Date: Mon, 22 Jun 2015 15:32:16 +0000 (+0200) Subject: SONAR-6618 Enforce paging on issues search X-Git-Tag: 5.2-RC1~1332 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=7ff83ed88a1240c637127e58f7df7511d6bf10df;p=sonarqube.git SONAR-6618 Enforce paging on issues search --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java index 26c35fe6d8c..bcb2c9654af 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java @@ -83,7 +83,6 @@ public class IssueQuery { private final Date createdBefore; private final String sort; private final Boolean asc; - private final Boolean ignorePaging; private final String userLogin; private final Set userGroups; @@ -119,7 +118,6 @@ public class IssueQuery { this.createdBefore = builder.createdBefore; this.sort = builder.sort; this.asc = builder.asc; - this.ignorePaging = builder.ignorePaging; this.userLogin = builder.userLogin; this.userGroups = builder.userGroups; this.checkAuthorization = builder.checkAuthorization; @@ -258,11 +256,6 @@ public class IssueQuery { return asc; } - @CheckForNull - public Boolean ignorePaging() { - return ignorePaging; - } - @CheckForNull public String userLogin() { return userLogin; @@ -315,7 +308,6 @@ public class IssueQuery { private Date createdBefore; private String sort; private Boolean asc = false; - private Boolean ignorePaging = false; private String userLogin; private Set userGroups; private boolean checkAuthorization = true; @@ -511,11 +503,6 @@ public class IssueQuery { return new IssueQuery(this); } - public Builder ignorePaging(@Nullable Boolean ignorePaging) { - this.ignorePaging = ignorePaging; - return this; - } - public Builder userLogin(@Nullable String userLogin) { this.userLogin = userLogin; return this; diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java index 6396e61a71d..38f40ab43db 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java @@ -30,13 +30,20 @@ import com.google.common.collect.Collections2; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.annotation.CheckForNull; +import javax.annotation.Nullable; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.ObjectUtils; import org.joda.time.DateTime; import org.joda.time.format.ISOPeriodFormat; -import org.sonar.api.server.ServerSide; import org.sonar.api.resources.Qualifiers; import org.sonar.api.rule.RuleKey; +import org.sonar.api.server.ServerSide; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.System2; @@ -49,15 +56,6 @@ import org.sonar.server.issue.filter.IssueFilterParameters; import org.sonar.server.user.UserSession; import org.sonar.server.util.RubyUtils; -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; - -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; - import static com.google.common.collect.Lists.newArrayList; /** @@ -134,10 +132,6 @@ public class IssueQueryService { builder.sort(sort); builder.asc(RubyUtils.toBoolean(params.get(IssueFilterParameters.ASC))); } - String ignorePaging = (String) params.get(IssueFilterParameters.IGNORE_PAGING); - if (!Strings.isNullOrEmpty(ignorePaging)) { - builder.ignorePaging(RubyUtils.toBoolean(ignorePaging)); - } return builder.build(); } finally { @@ -174,8 +168,7 @@ public class IssueQueryService { .planned(request.paramAsBoolean(IssueFilterParameters.PLANNED)) .createdAt(request.paramAsDateTime(IssueFilterParameters.CREATED_AT)) .createdAfter(buildCreatedAfter(request.paramAsDateTime(IssueFilterParameters.CREATED_AFTER), request.param(IssueFilterParameters.CREATED_IN_LAST))) - .createdBefore(request.paramAsDateTime(IssueFilterParameters.CREATED_BEFORE)) - .ignorePaging(request.paramAsBoolean(IssueFilterParameters.IGNORE_PAGING)); + .createdBefore(request.paramAsDateTime(IssueFilterParameters.CREATED_BEFORE)); Set allComponentUuids = Sets.newHashSet(); boolean effectiveOnComponentOnly = mergeDeprecatedComponentParameters(session, diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterParameters.java b/server/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterParameters.java index d8fb99c16dc..96b5589eb16 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterParameters.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterParameters.java @@ -23,7 +23,6 @@ package org.sonar.server.issue.filter; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; - import java.util.List; import static com.google.common.collect.Lists.newArrayList; @@ -69,18 +68,17 @@ public class IssueFilterParameters { public static final String PAGE_INDEX = "pageIndex"; public static final String SORT = "sort"; public static final String ASC = "asc"; - public static final String IGNORE_PAGING = "ignorePaging"; public static final String FACET_ASSIGNED_TO_ME = "assigned_to_me"; public static final List ALL = ImmutableList.of(ISSUES, SEVERITIES, STATUSES, RESOLUTIONS, RESOLVED, COMPONENTS, COMPONENT_ROOTS, RULES, ACTION_PLANS, REPORTERS, TAGS, ASSIGNEES, LANGUAGES, ASSIGNED, PLANNED, HIDE_RULES, CREATED_AT, CREATED_AFTER, CREATED_BEFORE, CREATED_IN_LAST, COMPONENT_UUIDS, COMPONENT_ROOT_UUIDS, - PROJECTS, PROJECT_UUIDS, IGNORE_PAGING, PROJECT_KEYS, COMPONENT_KEYS, MODULE_UUIDS, DIRECTORIES, FILE_UUIDS, AUTHORS, HIDE_COMMENTS, PAGE_SIZE, PAGE_INDEX, SORT, ASC); + PROJECTS, PROJECT_UUIDS, PROJECT_KEYS, COMPONENT_KEYS, MODULE_UUIDS, DIRECTORIES, FILE_UUIDS, AUTHORS, HIDE_COMMENTS, PAGE_SIZE, PAGE_INDEX, SORT, ASC); public static final List ALL_WITHOUT_PAGINATION = newArrayList(Iterables.filter(ALL, new Predicate() { @Override public boolean apply(String input) { - return !PAGE_INDEX.equals(input) && !PAGE_SIZE.equals(input) && !IGNORE_PAGING.equals(input); + return !PAGE_INDEX.equals(input) && !PAGE_SIZE.equals(input); } })); diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java index 103fa37e612..e3253cc3e79 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java @@ -201,10 +201,6 @@ public class SearchAction implements IssuesWsAction { "Accepted units are 'y' for year, 'm' for month, 'w' for week and 'd' for day. " + "If this parameter is set, createdAfter must not be set") .setExampleValue("1m2w (1 month 2 weeks)"); - action.createParam(IssueFilterParameters.IGNORE_PAGING) - .setDescription("Return the full list of issues, regardless of paging. For internal use only") - .setBooleanPossibleValues() - .setDefaultValue("false"); action.createParam("format") .setDescription("Only json format is available. This parameter is kept only for backward compatibility and shouldn't be used anymore"); } @@ -273,9 +269,6 @@ public class SearchAction implements IssuesWsAction { public final void handle(Request request, Response response) throws Exception { SearchOptions options = new SearchOptions(); options.setPage(request.mandatoryParamAsInt(WebService.Param.PAGE), request.mandatoryParamAsInt(WebService.Param.PAGE_SIZE)); - if (shouldIgnorePaging(request)) { - options.disableLimit(); - } options.addFacets(request.paramAsStrings(WebService.Param.FACETS)); IssueQuery query = issueQueryService.createFromRequest(request); @@ -292,18 +285,7 @@ public class SearchAction implements IssuesWsAction { json.endObject().close(); } - private static boolean shouldIgnorePaging(Request request) { - List componentUuids = request.paramAsStrings(IssueFilterParameters.COMPONENT_UUIDS); - // Paging can be ignored only when querying issues for a single component (e.g in component viewer) - return componentUuids != null && componentUuids.size() == 1 - && BooleanUtils.isTrue(request.paramAsBoolean(IssueFilterParameters.IGNORE_PAGING)); - } - private SearchResult execute(IssueQuery query, SearchOptions options) { - Collection components = query.componentUuids(); - if (components != null && components.size() == 1 && BooleanUtils.isTrue(query.ignorePaging())) { - options.disableLimit(); - } return service.search(query, options); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java index bd6763106e2..48c1a3aa2f8 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java @@ -95,7 +95,7 @@ public class SearchActionMediumTest { assertThat(show.isPost()).isFalse(); assertThat(show.isInternal()).isFalse(); assertThat(show.responseExampleAsString()).isNotEmpty(); - assertThat(show.params()).hasSize(40); + assertThat(show.params()).hasSize(39); } @Test @@ -315,48 +315,6 @@ public class SearchActionMediumTest { assertThat(result.outputAsString()).contains("\"componentId\":" + file.getId() + ","); } - @Test - public void ignore_paging_with_one_component() throws Exception { - RuleDto rule = newRule(); - ComponentDto project = insertComponent(ComponentTesting.newProjectDto("ABCD").setKey("MyProject")); - setDefaultProjectPermission(project); - ComponentDto file = insertComponent(ComponentTesting.newFileDto(project, "BCDE").setKey("MyComponent")); - for (int i = 0; i < QueryContext.MAX_LIMIT + 1; i++) { - IssueDto issue = IssueTesting.newDto(rule, file, project); - tester.get(IssueDao.class).insert(session, issue); - } - session.commit(); - tester.get(IssueIndexer.class).indexAll(); - - WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION) - .setParam(IssueFilterParameters.COMPONENTS, file.getKey()) - .setParam(IssueFilterParameters.IGNORE_PAGING, "true") - .execute(); - result.assertJson(this.getClass(), "ignore_paging_with_one_component.json"); - } - - @Test - public void apply_paging_with_multiple_components() throws Exception { - RuleDto rule = newRule(); - ComponentDto project = insertComponent(ComponentTesting.newProjectDto("ABCD").setKey("MyProject")); - setDefaultProjectPermission(project); - ComponentDto file = insertComponent(ComponentTesting.newFileDto(project, "BCDE").setKey("MyComponent")); - for (int i = 0; i < QueryContext.MAX_LIMIT + 1; i++) { - IssueDto issue = IssueTesting.newDto(rule, file, project); - tester.get(IssueDao.class).insert(session, issue); - } - session.commit(); - tester.get(IssueIndexer.class).indexAll(); - - ComponentDto otherFile = insertComponent(ComponentTesting.newFileDto(project).setUuid("FEDC").setKey("OtherComponent")); - - WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION) - .setParam(IssueFilterParameters.COMPONENTS, file.getKey() + "," + otherFile.getKey()) - .setParam(IssueFilterParameters.IGNORE_PAGING, "true") - .execute(); - result.assertJson(this.getClass(), "apply_paging_with_multiple_components.json"); - } - @Test public void apply_paging_with_one_component() throws Exception { RuleDto rule = newRule();