/** * 依設定執行多階段分頁 * * @param <T> 回傳的 List Generic Type * @param filter 實作取得資料的 Closure * @param resultBean 分頁的資料物件 * @param fetchPhase 要執行的階段 * @return 可能為 Empty List 的結果 * @see #runTwoPhasePagingFilter(TwoPhasePagingFilter, PagingResultBean) */ public static <T> List<T> runTwoPhasePagingFilter( TwoPhasePagingFilter<T> filter, PagingResultBean resultBean, FetchPhase fetchPhase) { checkValidPagingResultBean(resultBean); fetchPhase = processFetchPhase(fetchPhase); /** 要求最後一頁,直接查詢全部資料,有以下特性 1. 最後一筆往前取得每頁筆數為所在資料 2. 請求後 N 頁一律為 0 3. 不會進行第二次查詢 */ PagingRequestBean pagingRequestBean = resultBean.getPagingRequestBean(); if (pagingRequestBean.getPageNumberOfTarget() == PagingRequestBean.LAST_PAGE) { List<T> resultData = filter.lastPhasePaging(resultBean); resultBean.setResultSize(resultData.size(), FetchPhase.LastFetch); return FetchPhase.LastFetch.filterToPage(resultData, pagingRequestBean.getPageSize()); } // :~) /** 兩階段查詢 */ // ================================================== /** 第一次查詢 */ List<T> resultData = filter.firstPhasePaging(resultBean); resultBean.setResultSize(resultData.size()); // :~) /** 判斷是否要執行第二次查詢,需滿足以下條件 1. 第一階段沒有任何資料 2. 設定為二階段查詢 3. 請求的分頁大於 1 */ if (resultBean.getResultStatus() == ResultStatus.EmptyData && fetchPhase == FetchPhase.LastFetch && pagingRequestBean.hasPreviousPage()) { /** 第二階段查詢以「最後一頁」為查詢策略 */ pagingRequestBean.setPageNumberOfTarget(PagingRequestBean.LAST_PAGE); resultBean.setPagingRequestBean(pagingRequestBean); // :~) return runTwoPhasePagingFilter(filter, resultBean); // 遞迴呼叫請求「最後一頁」 } // :~) return FetchPhase.FirstFetch.filterToPage( resultData, resultBean.getPagingRequestBean().getPageSize()); // ================================================== :~) }
private static void checkValidPagingResultBean(PagingResultBean pagingResultBean) { notNull(pagingResultBean, "Paging result bean is null"); notNull(pagingResultBean.getPagingRequestBean(), "Request paging data is null"); }