start backend
This commit is contained in:
58
src/main/java/com/krylov/refound/util/PostSpecification.java
Normal file
58
src/main/java/com/krylov/refound/util/PostSpecification.java
Normal file
@@ -0,0 +1,58 @@
|
||||
package com.krylov.refound.util;
|
||||
|
||||
import com.krylov.refound.dto.PostFilter;
|
||||
import com.krylov.refound.entity.Post;
|
||||
import jakarta.persistence.criteria.Expression;
|
||||
import jakarta.persistence.criteria.Predicate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
|
||||
public class PostSpecification {
|
||||
public static Specification<Post> withFilter(PostFilter filter) {
|
||||
return (root, query, cb) -> {
|
||||
|
||||
List<Predicate> predicates = new ArrayList<>();
|
||||
|
||||
|
||||
|
||||
if (filter.getType() != null) {
|
||||
predicates.add(cb.equal(root.get("type"), filter.getType()));
|
||||
}
|
||||
|
||||
if (filter.getCity() != null) {
|
||||
predicates.add(cb.equal(root.get("city"), filter.getCity()));
|
||||
}
|
||||
|
||||
if (filter.getCategory() != null) {
|
||||
predicates.add(cb.equal(root.get("category"), filter.getCategory()));
|
||||
}
|
||||
|
||||
if (filter.getDistrict() != null) {
|
||||
predicates.add(cb.equal(root.get("district"), filter.getDistrict()));
|
||||
}
|
||||
if (filter.getSearch() != null && !filter.getSearch().isBlank()) {
|
||||
String search = "%" + filter.getSearch().toLowerCase() + "%";
|
||||
|
||||
predicates.add(cb.or(
|
||||
cb.like(cb.lower(root.get("title")), search),
|
||||
cb.like(cb.lower(root.get("description")), search)
|
||||
));
|
||||
}
|
||||
if (filter.getLat() != null && filter.getLng() != null && filter.getRadius() != null) {
|
||||
|
||||
Expression<Double> distance = cb.function(
|
||||
"6371 * acos(cos(radians(?1)) * cos(radians(latitude)) * " +
|
||||
"cos(radians(longitude) - radians(?2)) + sin(radians(?1)) * sin(radians(latitude)))",
|
||||
Double.class,
|
||||
cb.literal(filter.getLat()),
|
||||
cb.literal(filter.getLng())
|
||||
);
|
||||
|
||||
predicates.add(cb.lessThanOrEqualTo(distance, filter.getRadius()));
|
||||
}
|
||||
|
||||
return cb.and(predicates.toArray(new Predicate[0]));
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user