'How to paginate and sort with 2 combine query results
I have an user and he wants to display "order history" and "return order history" in customer details screen. "Order history" and "return order history" is from 2 tables of an other service. I merged 2 query results and it worked well on the first page.
According to my old way, I get "limit"(variable) first data in page "page"(variable) (If limit is 10, we will have 20 record. 10 with order, 10 with return order). Then I sort 2 query results by date. But it will have 10 records redundant and its will never appear in any page.
The code like this:
try {
data1 = orderClient.getOrderHistories(limit, page, id, null, null).getData();
data2 = orderClient.getOrderReturnHistories(id, page, limit).getData();
} catch (Exception ex) {
ex.printStackTrace();
}
assert data1 != null;
List<OrderDto> orderDto = data1.getItems();
assert data2 != null;
List<OrderReturnDto> orderReturnDto = data2.getItems();
List<OrderCombineDto> orderCombineDto = new ArrayList<>();
long totalOrder = data1.getMetadata().getTotal();
long totalReturn = data2.getMetadata().getTotal();
int indexOrder = 0;
int indexReturn = 0;
long listCombineSize =
limit.longValue() < (totalOrder + totalReturn) ? limit : (totalOrder + totalReturn);
for (int i = 0; i < listCombineSize; i++) {
OrderDto orders = indexOrder < totalOrder ? orderDto.get(indexOrder) : new OrderDto();
OrderReturnDto returns =
indexReturn < totalReturn ? orderReturnDto.get(indexReturn) : new OrderReturnDto();
if (orders.getFinalizedOn().after(returns.getReceiveDate())
&& !orders.getFinalizedOn().before(returns.getReceiveDate())
&& !(indexOrder >= totalOrder)) {
OrderCombineDto combineItem = ModelMappers.map(orders, OrderCombineDto.class);
orderCombineDto.add(combineItem);
indexOrder = indexOrder < totalOrder - 1 ? indexOrder + 1 : indexOrder;
} else if (!orders.getFinalizedOn().after(returns.getReceiveDate())
&& orders.getFinalizedOn().before(returns.getReceiveDate())
&& !(indexReturn >= totalReturn)) {
OrderCombineDto combineItem = ModelMappers.map(returns, OrderCombineDto.class);
orderCombineDto.add(combineItem);
indexReturn = indexReturn < totalReturn - 1 ? indexReturn + 1 : indexReturn;
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
