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

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

package paa.coder.noodleCriteriaBuilder.queryBuilder.expressions;

import paa.coder.noodleCriteriaBuilder.NoodleFactory;
import paa.coder.noodleCriteriaBuilder.interfaces.ArithmeticBuilder;
import paa.coder.noodleCriteriaBuilder.interfaces.CoalesceBuilder;
import paa.coder.noodleCriteriaBuilder.interfaces.NoodleExpression;
import paa.coder.noodleCriteriaBuilder.interfaces.PathFinder;
import paa.coder.noodleCriteriaBuilder.queryBuilder.SubqueryBuilder;

import javax.persistence.criteria.CommonAbstractCriteria;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.stream.Collectors;

public class SelectStore implements NoodleExpression.Items {

    protected final List items = new ArrayList<>();
    protected final NoodleExpression.Builder builder;

    public SelectStore(){
        this.builder = new NoodleExpression.Builder() {};
    }

    public SelectStore select(String... fields){
        items.addAll(builder.select(fields).collect(Collectors.toList()));
        return this;
    }

    @Override
    public List> apply(PathFinder root, CommonAbstractCriteria query, CriteriaBuilder criteriaBuilder){
        return items.stream().map(i->i.apply(root,query,criteriaBuilder)).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());
    }

    public static class Multiply extends SelectStore{

        private final NoodleFactory factory;

        public Multiply(NoodleFactory factory){
            this.factory = factory;
        }

        public Multiply select(Class clazz){
            return selectWithPrefix(null, clazz);
        }

        public Multiply selectWithPrefix(String prefix, Class clazz){
            items.addAll(builder.getColumns(prefix, factory.getEntityColumnNames(clazz).toArray(new String[0])).collect(Collectors.toList()));
            return this;
        }

        @Override
        public Multiply select(String... fields){
            super.select(fields);
            return this;
        }

        public Multiply coalesce(String alias, Function userFunc){
            items.addAll(builder.coalesce(alias,userFunc).collect(Collectors.toList()));
            return this;
        }

        public Multiply custom(String alias, BiFunction>,CriteriaBuilder,Expression> userFunc){
            items.addAll(builder.custom(alias,userFunc).collect(Collectors.toList()));
            return this;
        }

        public Multiply math(String alias, Function userFunc){
            items.addAll(builder.math(alias,userFunc).collect(Collectors.toList()));
            return this;
        }

        public Multiply concat(String alias, Function userFunc){
            items.addAll(builder.concat(alias, userFunc).collect(Collectors.toList()));
            return this;
        }

        public Multiply length(String... fields){
            items.addAll(builder.length(fields).collect(Collectors.toList()));
            return this;
        }

        public Multiply sum(String... fields){
            items.addAll(builder.sum(fields).collect(Collectors.toList()));
            return this;
        }

        public Multiply sum(String alias, Function userFunc){
            items.addAll(builder.sum(alias,userFunc).collect(Collectors.toList()));
            return this;

        }

        public Multiply count(String... fields){
            items.addAll(builder.count(fields).collect(Collectors.toList()));
            return this;
        }

        public Multiply avg(String... fields){
            items.addAll(builder.avg(fields).collect(Collectors.toList()));
            return this;
        }

        public Multiply avg(String alias, Function userFunc){
            items.addAll(builder.avg(alias,userFunc).collect(Collectors.toList()));
            return this;

        }

        public Multiply max(String... fields){
            items.addAll(builder.max(fields).collect(Collectors.toList()));
            return this;
        }

        public Multiply max(String alias, Function userFunc){
            items.addAll(builder.max(alias,userFunc).collect(Collectors.toList()));
            return this;

        }

        public Multiply min(String... fields){
            items.addAll(builder.min(fields).collect(Collectors.toList()));
            return this;
        }

        public Multiply min(String alias, Function userFunc){
            items.addAll(builder.min(alias,userFunc).collect(Collectors.toList()));
            return this;
        }

        public Multiply subquery(String alias, SubqueryBuilder.Initiator.Runner userFunc){
            NoodleExpression wrap = (pathFinder, query,criteriaBuilder) -> {
                Expression expression = new SubqueryBuilder.NoodleSubquery<>(userFunc.apply(new SubqueryBuilder.Initiator(factory)),pathFinder,query.subquery(Object.class)).build();
                expression.alias(alias);
                return Optional.of(expression);
            };
            items.add(wrap);
            return this;
        }
    }

    public static class Single implements NoodleExpression{

        private NoodleExpression expression;
        protected final NoodleExpression.Builder builder;

        public Single(){this.builder = new NoodleExpression.Builder() {};}

        private void setExpression(NoodleExpression expression){
            this.expression = expression;
        }

        public NoodleExpression getExpression(){
            return expression;
        }

        public void select(String fields){
           builder.select(fields).findFirst().ifPresent(this::setExpression);
        }

        public void coalesce(String alias, Function userFunc){
            builder.coalesce(alias,userFunc).findFirst().ifPresent(this::setExpression);
        }

        public void custom(String alias, BiFunction>,CriteriaBuilder,Expression> userFunc){
            builder.custom(alias,userFunc).findFirst().ifPresent(this::setExpression);
        }

        public void math(String alias, Function userFunc){
            builder.math(alias,userFunc).findFirst().ifPresent(this::setExpression);
        }

        public void concat(String alias, Function userFunc){
            builder.concat(alias, userFunc).findFirst().ifPresent(this::setExpression);
        }

        public void length(String field){
            builder.length(field).findFirst().ifPresent(this::setExpression);
        }

        public void sum(String fields){
            builder.sum(fields).findFirst().ifPresent(this::setExpression);
        }

        public void sum(String alias, Function userFunc){
            builder.sum(alias,userFunc).findFirst().ifPresent(this::setExpression);

        }

        public void count(String fields){
            builder.count(fields).findFirst().ifPresent(this::setExpression);
        }

        public void avg(String fields){
            builder.avg(fields).findFirst().ifPresent(this::setExpression);
        }

        public void avg(String alias, Function userFunc){
            builder.avg(alias,userFunc).findFirst().ifPresent(this::setExpression);
        }

        public void max(String fields){
            builder.max(fields).findFirst().ifPresent(this::setExpression);
        }

        public void max(String alias, Function userFunc){
            builder.max(alias,userFunc).findFirst().ifPresent(this::setExpression);
        }

        public void min(String... fields){
            builder.min(fields).findFirst().ifPresent(this::setExpression);
        }

        public void min(String alias, Function userFunc){
            builder.min(alias,userFunc).findFirst().ifPresent(this::setExpression);
        }

        @Override
        public Optional> apply(PathFinder pathFinder, CommonAbstractCriteria query, CriteriaBuilder criteriaBuilder){
            return Optional.ofNullable(expression).flatMap(e->e.apply(pathFinder,query,criteriaBuilder));
        }
    }
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy