'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