diff --git a/pom.xml b/pom.xml index b1b35ff..add322c 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ de.infinimotion model-persistence - 0.0.76 + 0.0.83 diff --git a/src/main/java/de/infinimotion/persistence/processor/FilterQuery.java b/src/main/java/de/infinimotion/persistence/processor/FilterQuery.java new file mode 100644 index 0000000..5b5de7a --- /dev/null +++ b/src/main/java/de/infinimotion/persistence/processor/FilterQuery.java @@ -0,0 +1,66 @@ +package de.infinimotion.persistence.processor; + +import de.infinimotion.model.persistence.GenericFilterQuery; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import jakarta.persistence.criteria.*; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.*; + +@ApplicationScoped +public class FilterQuery implements GenericFilterQuery { + + @Inject + EntityManager em; + + // eq;hall.id;int;1 + @Override + public List query(Class clazz, List filters) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cr = cb.createQuery(clazz); + Root root = cr.from(clazz); + + List predicates = new LinkedList<>(); + if (filters != null) { + for (String filter : filters) { + String[] split = filter.split(";", 4); + String[] pathSplit = split[1].split("\\."); + Predicate predicate = switch (split[2]) { + case "int" -> filterGeneric(cb, root, pathSplit, split[0], Integer.parseInt(split[3])); + case "date" -> filterGeneric(cb, root, pathSplit, split[0], Date.from(Instant.parse(split[3]))); + case "localdate" -> filterGeneric(cb, root, pathSplit, split[0], LocalDate.parse(split[3])); + case "localtime" -> filterGeneric(cb, root, pathSplit, split[0], LocalTime.parse(split[3])); + default -> filterGeneric(cb, root, pathSplit, split[0], split[3]); + }; + predicates.add(predicate); + } + } + + cr.select(root).where(predicates); + return em.createQuery(cr).getResultList(); + } + + > Predicate filterGeneric(CriteriaBuilder cb, Root root, String[] pathSplit, String operator, Y value) { + Path path = root.get(pathSplit[0]); + for (int i = 1; i < pathSplit.length; i++) { + path = path.get(pathSplit[i]); + } + + return switch (operator) { + case "eq" -> cb.equal(path, value); + case "ne" -> cb.notEqual(path, value); + case "gt" -> cb.greaterThan(path, value); + case "ge" -> cb.greaterThanOrEqualTo(path, value); + case "lt" -> cb.lessThan(path, value); + case "le" -> cb.lessThanOrEqualTo(path, value); + case "null" -> cb.isNull(path); + case "nn" -> cb.isNotNull(path); + default -> throw new IllegalArgumentException("unknown filter: " + operator); + }; + } + +}