]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6618 Enforce paging on issues search 395/head
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Mon, 22 Jun 2015 15:32:16 +0000 (17:32 +0200)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Thu, 25 Jun 2015 08:20:19 +0000 (10:20 +0200)
server/sonar-server/src/main/java/org/sonar/server/issue/IssueQuery.java
server/sonar-server/src/main/java/org/sonar/server/issue/IssueQueryService.java
server/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterParameters.java
server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java
server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java

index 26c35fe6d8c0f1f01fff9ac0ff4940f5eb8ef31d..bcb2c9654af29fce75b414b06006050187528908 100644 (file)
@@ -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<String> 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<String> 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;
index 6396e61a71d4de34c8571dafbbe6738693552647..38f40ab43db11a30e58c2fc1ad43d4c7d9accf03 100644 (file)
@@ -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<String> allComponentUuids = Sets.newHashSet();
       boolean effectiveOnComponentOnly = mergeDeprecatedComponentParameters(session,
index d8fb99c16dc53bf102863f5b86060976acc5a4c8..96b5589eb160874572d24a60249aef59459c2eba 100644 (file)
@@ -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<String> 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<String> ALL_WITHOUT_PAGINATION = newArrayList(Iterables.filter(ALL, new Predicate<String>() {
     @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);
     }
   }));
 
index 103fa37e6122298c064fb46b8143210ff29c6cbf..e3253cc3e79d1eb66deec4f8131c0bfdee8b732d 100644 (file)
@@ -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<String> 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<IssueDoc> execute(IssueQuery query, SearchOptions options) {
-    Collection<String> components = query.componentUuids();
-    if (components != null && components.size() == 1 && BooleanUtils.isTrue(query.ignorePaging())) {
-      options.disableLimit();
-    }
     return service.search(query, options);
   }
 
index bd6763106e261627f897d23f7f2920c3aca2fa47..48c1a3aa2f8ea960672f18c61073e05f6025ce77 100644 (file)
@@ -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();