Untitled

 avatar
unknown
java
a month ago
5.7 kB
2
Indexable
// Custom Filter
public class CustomFilter {
    private Predicate<TransactionEntity> condition;

    public CustomFilter(Predicate<TransactionEntity> condition) {
        this.condition = condition;
    }

    public Predicate<TransactionEntity> getCondition(){
        return this.condition;
    }
}

// Transaction Manager

public class TransactionManager {
    TransactionRepository repository;
    PaginationStrategy strategy;

    public TransactionManager() {
        this.repository = new TransactionRepository();
        this.strategy = new CursorPagination();
    }

    public List<TransactionEntity> filterTxns(List<TransactionEntity> txns, List<CustomFilter> filters){
        Predicate<TransactionEntity> combinedPredicate = filters.stream().map(CustomFilter::getCondition).reduce(x -> true, Predicate::and);
        return txns.stream().filter(combinedPredicate).collect(Collectors.toList());
    }

    public void createTxns(int num){
        for(int i = 0;i<num;i++){
            int random = new Random().nextInt(0,10);
            int amount = new Random().nextInt(1, 100);
            LocalDateTime time = LocalDateTime.now().minusDays(random);
            repository.createTransaction(new TransactionEntity(i, time, random,  amount));
        }
    }

    public List<TransactionEntity> getAllTxns(){
        return repository.getAllTxns();
    }

    public List<PaginationResponse> getPaginatedResponse(List<TransactionEntity> txns){
        PaginationRequest request = new PaginationRequest(10, 0, null);
        List<PaginationResponse> responses = new ArrayList<>();
        PaginationResponse response = strategy.paginate(txns, request);
        responses.add(response);
        while (response.isHasNextPage()){
//            int newOffset = request.getOffset() + 10;
//            request.setOffset(newOffset);
            int newCursor = response.getNextCursor();
            request.setCursor(newCursor);

            response = strategy.paginate(txns, request);
            responses.add(response);
        }

        for(PaginationResponse res: responses){
            System.out.println(res.getData());
        }

        return responses;
    }
}


// Repository

public class TransactionRepository {
    private HashMap<Integer, TransactionEntity> transactionDataBase;

    public TransactionRepository(){
        this.transactionDataBase = new HashMap<>();
    }

    public void createTransaction(TransactionEntity entity){
        this.transactionDataBase.put(entity.getId(), entity);
    }

    public void deleteTransaction(int id){
        this.transactionDataBase.remove(id);
    }

    public TransactionEntity getTransaction(int id){
        return this.transactionDataBase.getOrDefault(id, null);
    }

    public List<TransactionEntity> getAllTxns(){
        return this.transactionDataBase.values().stream().toList();
    }
}

// Cursor Pagination

public class CursorPagination implements PaginationStrategy {
    @Override
    public PaginationResponse paginate(List<TransactionEntity> txns, PaginationRequest request) {
        int cursor = request.getCursor() == null ? 0 : request.getCursor();
        int limit = request.getLimit() == null ? txns.size(): request.getLimit();
        List<TransactionEntity> sortedTxn = txns.stream().sorted(Comparator.comparing(TransactionEntity::getAmount)).toList();
        List<TransactionEntity> data = sortedTxn.stream().filter( txn -> txn.getAmount() > cursor).limit(limit).toList();

        boolean hasNext = data.getLast().getId() != sortedTxn.getLast().getId();
        Integer nextCursor = null;
        if(hasNext){
            nextCursor = data.getLast().getAmount();
        }
        System.out.println("\nNext Cursor: " + nextCursor);
        return new PaginationResponse(hasNext, data, nextCursor);
    }



}


// Limit pagination

public class LimitPS implements PaginationStrategy {
    @Override
    public PaginationResponse paginate(List<TransactionEntity> txns, PaginationRequest request) {
        int limit = request.getLimit() == null ? txns.size() : request.getLimit();
        int offset = request.getOffset() == null ? 0 : request.getOffset();

        List<TransactionEntity> data = txns.stream().skip(offset).limit(limit).toList();
        boolean hasNextPage = data.size() == limit;
        return new PaginationResponse(hasNextPage, data, null);
    }
}


// Pagination Request

public class PaginationRequest {
    private Integer limit;
    private Integer offset;
    private Integer cursor;

    public PaginationRequest(Integer limit, Integer offset, Integer cursor) {
        this.limit = limit;
        this.offset = offset;
        this.cursor = cursor;
    }

    public Integer getLimit() {
        return limit;
    }

    public void setLimit(int limit) {
        this.limit = limit;
    }

    public Integer getOffset() {
        return offset;
    }

    public void setOffset(int offset) {
        this.offset = offset;
    }

    public Integer getCursor() {
        return cursor;
    }

    public void setCursor(int cursor) {
        this.cursor = cursor;
    }
}


// Paginatio Response

public class PaginationResponse {
    private boolean hasNextPage;
    private List<TransactionEntity> data;
    private Integer nextCursor;

    public Integer getNextCursor() {
        return nextCursor;
    }

    public List<TransactionEntity> getData() {
        return data;
    }

    public boolean isHasNextPage() {
        return hasNextPage;
    }

    public PaginationResponse(boolean hasNextPage, List<TransactionEntity> data, Integer nextCursor) {
        this.hasNextPage = hasNextPage;
        this.data = data;
        this.nextCursor = nextCursor;
    }
}

Editor is loading...
Leave a Comment