FeedItemSpecification.java

package org.petify.feed.specification;

import org.petify.feed.model.FeedItem;

import jakarta.persistence.criteria.Predicate;
import org.springframework.data.jpa.domain.Specification;

import java.util.ArrayList;
import java.util.List;

public class FeedItemSpecification {
    public static <T extends FeedItem> Specification<T> hasContent(String content) {
        return (root, query, criteriaBuilder) -> {
            if (content == null || content.isEmpty()) {
                return criteriaBuilder.conjunction();
            }
            String[] words = content.toLowerCase().split("\\s+");
            List<Predicate> wordPredicates = new ArrayList<>();

            for (String word : words) {
                Predicate wordPredicate = criteriaBuilder.or(
                        criteriaBuilder.like(criteriaBuilder.lower(root.get("title")), "%" + word + "%"),
                        criteriaBuilder.like(criteriaBuilder.lower(root.get("shortDescription")), "%" + word + "%"),
                        criteriaBuilder.like(criteriaBuilder.lower(root.get("longDescription")), "%" + word + "%")
                );
                wordPredicates.add(wordPredicate);
            }
            return criteriaBuilder.and(wordPredicates.toArray(new Predicate[0]));
        };
    }
}