Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @Autowired QueryService queryService // service dependency
- Page getFilteredPaginatedResults(int pageSize, Result result) {
- // stored results
- List<Result> results = new ArrayList<>();
- // initial query
- Page currentPage = queryService.query(pageSize, result);
- while(results.size() < pageSize) {
- // load each result into results list
- for (Result result : currentPage.getResults()) {
- if (test(result)) {
- results.add(result);
- }
- }
- if (currentPage.hasMore()) {
- Results currentLastResult = currentPage.getResults().get(currentPage.getResults().size() - 1);
- currentPage = querySerivce.query(pageSize, currentLastResult);
- } else {
- break;
- }
- }
- // potentially overshoot a little (max overshoot by pageSize) and then limit
- List<Result> finalResults = results.stream().limit(pageSize).collect(Collectors.toList());
- // determine hasMore state
- boolean hasMore;
- if (finalResults.size() < pageSize) { // no more since less than pageSize
- hasMore = false;
- } else if (results.size() > finalResults.size()) { // checks for rest of page has another positive filter case
- hasMore = true;
- } else {
- hasMore = checkIfFilteredhasMore(currentPage, pageSize); // pass in next page already queried
- }
- return new Page(results, hasMore);
- }
- boolean checkIfFilteredHasMore(Page currentPage, int pageSize) {
- // keep getting results and exit once a successful test is found else return false
- // check currentPage which has already been queried
- for (Result result : currentPage.getResults()) {
- if (test(result)) {
- return true;
- }
- }
- while(currentPage.hasMore()) {
- currentPage = queryService.query(pageSize, currentResults.get(currentResults.size() - 1));
- for (Result result : currentPage.getResults()) {
- if (test(result)) {
- return true;
- }
- }
- }
- return false;
- }
Add Comment
Please, Sign In to add comment