Homeautomation/src/main/java/de/ph87/homeautomation/RepositorySearchHelper.java
2024-09-11 15:59:26 +02:00

37 lines
1.5 KiB
Java

package de.ph87.homeautomation;
import jakarta.persistence.criteria.Expression;
import jakarta.persistence.criteria.Predicate;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.function.Function;
public class RepositorySearchHelper {
public static <T, D> List<D> search(final String term, final JpaSpecificationExecutor<T> repository, final String fieldName, final Function<T, D> map) {
final Specification<T> specification = (root, query, criteriaBuilder) -> {
final Expression<String> field = criteriaBuilder.lower(root.get(fieldName));
final String term2 = term
.replaceAll("([a-zA-Z])([0-9])", "$1 $2")
.replaceAll("([0-9])([a-zA-Z])", "$1 $2")
.replaceAll("([A-Z])([A-Z])", "$1 $2")
.replaceAll("([a-z])([A-Z])", "$1 $2")
.toLowerCase(Locale.ROOT);
final List<Predicate> predicates = Arrays.stream(term2.split("\\s"))
.filter(word -> !word.isEmpty())
.map(word -> criteriaBuilder.like(field, "%" + word + "%"))
.toList();
return criteriaBuilder.and(predicates.toArray(Predicate[]::new));
};
final PageRequest pageRequest = PageRequest.of(0, 20, Sort.by(Sort.Direction.ASC, fieldName));
return repository.findAll(specification, pageRequest).stream().map(map).toList();
}
}