All Downloads are FREE. Search and download functionalities are using the official Maven repository.

paa.coder.noodleCriteriaBuilder.queryBuilder.expressions.OrderBuilder Maven / Gradle / Ivy

package paa.coder.noodleCriteriaBuilder.queryBuilder.expressions;

import paa.coder.noodleCriteriaBuilder.interfaces.*;

import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class OrderBuilder implements NoodleSelection> {

    private final LinkedList>> list = new LinkedList<>();

    public void add(Boolean asc, String... fields){
        Stream.of(fields).forEach(i -> add(asc,SampleColumn.build(i, null)));
    }


    private void add(Boolean asc, NoodleExpression i){
        NoodleSelection> ns = (p, c, cb) -> i.apply(p, c, cb).map(expression -> new Order() {
            private boolean ascending = asc;
            @Override
            public Order reverse(){
                this.ascending = ! this.ascending;
                return this;
            }
            @Override
            public boolean isAscending(){
                return this.ascending;
            }
            @Override
            public Expression getExpression(){
                return expression;
            }
        });
        list.add(ns);

    }

    private void add(Boolean asc, List i){
       i.forEach(ex->add(asc,ex));

    }

    public OrderBuilder add(Boolean asc, Function> uFunc){
        return addExpressions(asc,eb->uFunc.apply(eb).stream().collect(Collectors.toList()));
    }

    public OrderBuilder addExpressions(Boolean asc, Function> uFunc){
        add(asc,uFunc.apply(new ExpressionBuilder()));
        return this;
    }

    public OrderBuilder asc(Function> uFunc){
        return add(true,uFunc);
    }

    public OrderBuilder desc(Function> uFunc){
        return add(false,uFunc);
    }


    public OrderBuilder asc(String... fields){
        add(true, fields);
        return this;
    }

    public OrderBuilder desc(String... fields){
        add(false, fields);
        return this;
    }

    @Override
    public List apply(PathFinder pathFinder, CommonAbstractCriteria criteria, CriteriaBuilder cb){
        return list.stream().map(i -> i.apply(pathFinder, criteria, cb)).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());
    }

    public static class ExpressionBuilder{
        protected final NoodleExpression.Builder builder = new NoodleExpression.Builder() {};
        private  List complex = new ArrayList<>();

        public Optional coalesce(Function userFunc){
            return builder.coalesce(null,userFunc).peek(complex::add).findFirst();
        }

        public Optional custom(BiFunction>,CriteriaBuilder,Expression> userFunc){
            return builder.custom(null,userFunc).peek(complex::add).findFirst();
        }

        public Optional math(Function userFunc){
            return builder.math(null,userFunc).peek(complex::add).findFirst();
        }

        public Optional concat(Function userFunc){
            return builder.concat(null, userFunc).peek(complex::add).findFirst();
        }

        public Optional length(String field){
            return builder.length(field).peek(complex::add).findFirst();
        }

        public Optional field(String field){
            return builder.field(field).peek(complex::add).findFirst();
        }

        public Optional count(String fields){
            return builder.count(fields).findFirst();
        }
        public List build(){
            final ArrayList noodleExpressions = new ArrayList<>(complex);
            this.complex=new ArrayList<>();
            return noodleExpressions;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy