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 List search(final String term, final JpaSpecificationExecutor repository, final String fieldName, final Function map) { final Specification specification = (root, query, criteriaBuilder) -> { final Expression 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 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(); } }