//package kr.re.etri.autoflow.specification; // //import jakarta.annotation.PostConstruct; //import jakarta.persistence.EntityManager; //import jakarta.persistence.metamodel.Attribute; //import jakarta.persistence.metamodel.EntityType; //import jakarta.persistence.metamodel.Metamodel; //import kr.re.etri.autoflow.entity.KubeflowRunEntity; //import lombok.extern.slf4j.Slf4j; //import org.springframework.data.jpa.domain.Specification; //import org.springframework.stereotype.Component; // //import jakarta.persistence.criteria.Predicate; //import java.util.Set; //import java.util.stream.Collectors; // //@Slf4j //@Component //public class KubeflowRunSpecification { // // private final EntityManager entityManager; // private Set stringFields; // // public KubeflowRunSpecification(EntityManager entityManager) { // this.entityManager = entityManager; // } // // @PostConstruct // public void init() { // Metamodel metamodel = entityManager.getMetamodel(); // EntityType entityType = metamodel.entity(KubeflowRunEntity.class); // // stringFields = entityType.getAttributes().stream() // .filter(attr -> attr.getJavaType().equals(String.class)) // .map(Attribute::getName) // .collect(Collectors.toSet()); // // log.info("KubeflowRunEntity string fields: {}", stringFields); // } // // public Specification searchByConditions( // String experimentId, String searchType, String keyword) { // // return (root, query, cb) -> { // Predicate predicate = cb.conjunction(); // // // experimentId는 항상 조건으로 추가 // predicate = cb.and(predicate, // cb.equal(root.get("experimentId"), experimentId)); // // if (keyword != null && !keyword.isEmpty()) { // if (searchType == null || searchType.isEmpty() || // "전체".equalsIgnoreCase(searchType) || "all".equalsIgnoreCase(searchType)) { // // Predicate orPredicate = cb.disjunction(); // for (String field : stringFields) { // orPredicate = cb.or(orPredicate, // cb.like(cb.lower(root.get(field)), "%" + keyword.toLowerCase() + "%")); // } // predicate = cb.and(predicate, orPredicate); // // } else if (stringFields.contains(searchType)) { // predicate = cb.and(predicate, // cb.like(cb.lower(root.get(searchType)), "%" + keyword.toLowerCase() + "%")); // } // } // // return predicate; // }; // } //} package kr.re.etri.autoflow.specification; import jakarta.annotation.PostConstruct; import jakarta.persistence.EntityManager; import jakarta.persistence.metamodel.Attribute; import jakarta.persistence.metamodel.EntityType; import jakarta.persistence.metamodel.Metamodel; import kr.re.etri.autoflow.entity.ProjectEntity; import kr.re.etri.autoflow.entity.KubeflowRunEntity; import lombok.extern.slf4j.Slf4j; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import jakarta.persistence.criteria.Predicate; import java.time.LocalDate; import java.util.Set; import java.util.stream.Collectors; @Slf4j @Component public class KubeflowRunSpecification { private final EntityManager entityManager; private Set stringFields; public KubeflowRunSpecification(EntityManager entityManager) { this.entityManager = entityManager; } // 스프링 빈 초기화 후 실행 @PostConstruct public void init() { Metamodel metamodel = entityManager.getMetamodel(); EntityType entityType = metamodel.entity(KubeflowRunEntity.class); // 문자열 타입 필드명만 추출 stringFields = entityType.getAttributes().stream() .filter(attr -> attr.getJavaType().equals(String.class)) .map(Attribute::getName) .collect(Collectors.toSet()); log.info("KubeflowRunEntity string fields: {}", stringFields); } public Specification searchByConditions( String experimentId, String searchType, String keyword, LocalDate startDate, LocalDate endDate) { return (root, query, cb) -> { Predicate predicate = cb.conjunction(); predicate = cb.and(predicate, cb.equal(root.get("experimentId"), experimentId)); if (keyword != null && !keyword.isEmpty()) { if (searchType == null || searchType.isEmpty() || "전체".equalsIgnoreCase(searchType) || "all".equalsIgnoreCase(searchType)) { Predicate orPredicate = cb.disjunction(); for (String field : stringFields) { orPredicate = cb.or(orPredicate, cb.like(cb.lower(root.get(field)), "%" + keyword.toLowerCase() + "%")); } predicate = cb.and(predicate, orPredicate); } else if (stringFields.contains(searchType)) { predicate = cb.and(predicate, cb.like(cb.lower(root.get(searchType)), "%" + keyword.toLowerCase() + "%")); } } if (startDate != null) { predicate = cb.and(predicate, cb.greaterThanOrEqualTo(root.get("createdAt"), startDate)); } if (endDate != null) { predicate = cb.and(predicate, cb.lessThanOrEqualTo(root.get("createdAt"), endDate)); } return predicate; }; } }