AssignmentSpecification.java
package com.nashtech.rookie.asset_management_0701.services.assignment;
import java.time.LocalDate;
import java.util.Set;
import org.springframework.data.jpa.domain.Specification;
import com.nashtech.rookie.asset_management_0701.entities.Asset;
import com.nashtech.rookie.asset_management_0701.entities.Assignment;
import com.nashtech.rookie.asset_management_0701.entities.Location;
import com.nashtech.rookie.asset_management_0701.entities.User;
import com.nashtech.rookie.asset_management_0701.enums.EAssignmentState;
import jakarta.persistence.criteria.Join;
import jakarta.persistence.criteria.JoinType;
public final class AssignmentSpecification {
private AssignmentSpecification (){
}
public static Specification<Assignment> hasStates (Set<EAssignmentState> states) {
return (root, query, criteriaBuilder) -> {
if (states == null || states.isEmpty()) {
return null;
}
return root.get("state").in(states);
};
}
public static Specification<Assignment> hasLocation (Location location) {
return (root, query, criteriaBuilder) -> {
if (location == null){
return null;
}
Join<Assignment, Asset> assignmentAsset = root.join("asset");
return criteriaBuilder.equal(assignmentAsset.get("location"), location);
};
}
public static Specification<Assignment> hasAssetName (String assetName){
String lowerCaseName = assetName == null? "":assetName.trim().toLowerCase();
return (root, query, criteriaBuilder) -> {
Join<Assignment, Asset> assignmentAsset = root.join("asset");
return criteriaBuilder.like(criteriaBuilder.lower(assignmentAsset.get("name")), "%"+lowerCaseName+"%");
};
}
public static Specification<Assignment> hasAssetCode (String assetCode){
String lowerCaseName = assetCode == null? "": assetCode.trim().toLowerCase();
return (root, query, criteriaBuilder) -> {
Join<Assignment, Asset> assignmentAsset = root.join("asset");
return criteriaBuilder.like(criteriaBuilder.lower(assignmentAsset.get("assetCode")), "%"+lowerCaseName+"%");
};
}
public static Specification<Assignment> hasAssigneeUsername (String username){
String lowerCaseName = username == null? "":username.trim().toLowerCase();
return (root, query, criteriaBuilder) -> {
Join<Assignment, User> assignmentAsset = root.join("assignTo");
return criteriaBuilder.like(criteriaBuilder.lower(assignmentAsset.get("username")), "%"+lowerCaseName+"%");
};
}
public static Specification<Assignment> assignOnDate (LocalDate assignDate){
return (root, query, criteriaBuilder) -> {
if (assignDate == null) {
return null;
}
return criteriaBuilder.equal(root.get("assignedDate"), assignDate);
};
}
public static Specification<Assignment> notStateReturned (){
return (root, query, criteriaBuilder) -> criteriaBuilder.notEqual(root.get("state"), EAssignmentState.RETURNED);
}
public static Specification<Assignment> notStateDeclined (){
return (root, query, criteriaBuilder) -> criteriaBuilder.notEqual(root.get("state"), EAssignmentState.DECLINED);
}
public static Specification<Assignment> assignToIdEquals (Long assignToId) {
return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("assignTo").get("id"), assignToId);
}
public static Specification<Assignment> assignedDateLessThanEqual (LocalDate assignedDate) {
return (root, query, criteriaBuilder)
-> criteriaBuilder.lessThanOrEqualTo(root.get("assignedDate"), assignedDate);
}
public static Specification<Assignment> joinFetch (String property) {
return (root, query, criteriaBuilder) -> {
if (Long.class != query.getResultType()){
root.fetch(property, JoinType.LEFT);
}
return criteriaBuilder.conjunction();
};
}
}