package gr.cite.annotation.query.utils; import gr.cite.tools.data.query.QueryContext; import jakarta.persistence.criteria.*; import java.util.function.BiFunction; import java.util.function.Function; public class BuildSubQueryInput { private final AbstractQuery query; private final CriteriaBuilder criteriaBuilder; private final Class entityType; private final Class keyType; private final Function, Expression> keyPathFunc; private final BiFunction, CriteriaBuilder, Predicate> filterFunc; public BuildSubQueryInput(Builder builder) { query = builder.query; criteriaBuilder = builder.criteriaBuilder; entityType = builder.entityType; keyType = builder.keyType; keyPathFunc = builder.keyPathFunc; filterFunc = builder.filterFunc; } public AbstractQuery getQuery() { return query; } public CriteriaBuilder getCriteriaBuilder() { return criteriaBuilder; } public Class getEntityType() { return entityType; } public Class getKeyType() { return keyType; } public Function, Expression> getKeyPathFunc() { return keyPathFunc; } public BiFunction, CriteriaBuilder, Predicate> getFilterFunc() { return filterFunc; } public static class Builder { private final Class entityType; private final Class keyType; private AbstractQuery query; private CriteriaBuilder criteriaBuilder; private Function, Expression> keyPathFunc; private BiFunction, CriteriaBuilder, Predicate> filterFunc; public Builder(Class entityType, Class keyType) { this.entityType = entityType; this.keyType = keyType; } public Builder(Class entityType, Class keyType, QueryContext queryContext) { this.entityType = entityType; this.keyType = keyType; this.query = queryContext.Query; this.criteriaBuilder = queryContext.CriteriaBuilder; } public Builder query(AbstractQuery query) { this.query = query; return this; } public Builder criteriaBuilder(CriteriaBuilder criteriaBuilder) { this.criteriaBuilder = criteriaBuilder; return this; } public Builder keyPathFunc(Function, Expression> keyPathFunc) { this.keyPathFunc = keyPathFunc; return this; } public Builder filterFunc(BiFunction, CriteriaBuilder, Predicate> filterFunc) { this.filterFunc = filterFunc; return this; } } }