From 36d74f1c84521f3114cba2bc1981c8b339d6dd26 Mon Sep 17 00:00:00 2001 From: Piyush Date: Tue, 25 Feb 2025 14:40:41 +0530 Subject: [PATCH 1/5] Done ticket GEPAFINBE-173 --- .../constants/GepafinConstant.java | 19 +++- .../tendermanagement/dao/ApplicationDao.java | 100 ++++++++++++++++-- .../ApplicationPageableRequestBean.java | 3 + .../model/request/FilterCriteria.java | 10 ++ 4 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 8e469734..1c31a2c7 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -426,7 +426,24 @@ public class GepafinConstant { public static final String APPOINTMENT_CANNOT_BE_CREATED = "appointment.cannot.be.created"; public static final String APPOINTMENT_NOT_CREATED = "appointment.not.created"; -} + public static final String CONTAINS = "contains"; + public static final String EQUALS = "equals"; + public static final String STARTS_WITH = "starts_with"; + public static final String ENDS_WITH = "ends_with"; + public static final String CALL_TITLE = "callTitle"; + public static final String CALL_ID="callId"; + public static final String CALL_END_DATE="callEndDate"; + public static final String END_DATE="endDate"; + public static final String PROTOCOL="protocol"; + public static final String PROTOCOL_NUMBER="protocolNumber"; + public static final String MODIFIED_DATE="modifiedDate"; + public static final String CALL_END_TIME="callEndTime"; + public static final String END_TIME="endTime"; + public static final String UPDATED_DATE="updatedDate"; + public static final String BEFORE="before"; + public static final String AFTER="after"; + + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index a8e1ca8d..d749897b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1,7 +1,6 @@ package net.gepafin.tendermanagement.dao; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.Root; +import jakarta.persistence.criteria.*; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; @@ -42,7 +41,6 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; -import jakarta.persistence.criteria.Predicate; import jakarta.servlet.http.HttpServletRequest; import java.io.ByteArrayOutputStream; @@ -55,6 +53,7 @@ import java.text.ParseException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -1444,7 +1443,7 @@ public class ApplicationDao { Integer pageLimit = null; UserWithCompanyEntity userWithCompany= userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), companyId).orElse(null); - + Long userWithCompanyId = userWithCompany!=null?userWithCompany.getId():null; if (applicationPageableRequestBean.getGlobalFilters() != null) { pageNo = applicationPageableRequestBean.getGlobalFilters().getPage(); pageLimit = applicationPageableRequestBean.getGlobalFilters().getLimit(); @@ -1455,7 +1454,7 @@ public class ApplicationDao { if (pageNo == null || pageNo <= 0) { pageNo = GepafinConstant.DEFAULT_PAGE; } - Specification spec = search(callId,companyId, userWithCompany.getId(), applicationPageableRequestBean, userEntity); + Specification spec = search(callId,companyId, userWithCompanyId, applicationPageableRequestBean, userEntity); Page entityPage = applicationRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); // Prepare the response @@ -1510,11 +1509,15 @@ public class ApplicationDao { Integer year = null; String search = null; Integer daysRange = null; + Map filters = new HashMap<>(); if (applicationPageableRequestBean.getGlobalFilters() != null) { year = applicationPageableRequestBean.getGlobalFilters().getYear(); search = applicationPageableRequestBean.getGlobalFilters().getSearch(); daysRange = applicationPageableRequestBean.getDaysRange(); } + if (applicationPageableRequestBean.getFilters() != null) { + filters = applicationPageableRequestBean.getFilters(); + } List predicates = new ArrayList<>(); Boolean isBeneficiary = validator.checkIsBeneficiary(); @@ -1567,13 +1570,98 @@ public class ApplicationDao { LocalDateTime pastDate = today.minusDays(daysRange); predicates.add(criteriaBuilder.between(root.get(GepafinConstant.CREATED_DATE), pastDate, today)); } - predicates.add(criteriaBuilder.isFalse(root.get(GepafinConstant.IS_DELETED))); + applyFilters(root, criteriaBuilder, predicates, filters); + + predicates.add(criteriaBuilder.isFalse(root.get(GepafinConstant.IS_DELETED))); predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB_ID), userEntity.getHub().getId())); return predicates; } + private void applyFilters(Root root, CriteriaBuilder criteriaBuilder, List predicates, Map filters) { + if (Boolean.FALSE.equals(filters.isEmpty())) { + for (Map.Entry entry : filters.entrySet()) { + String fieldName = entry.getKey(); + FilterCriteria filterCriteria = entry.getValue(); + Object value = filterCriteria.getValue(); + String matchMode = filterCriteria.getMatchMode(); + + if (value != null && matchMode != null) { + Path fieldPath = getFieldPath(root, fieldName); + if (fieldPath != null) { + applyStringFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); + applyNumberFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); + // applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); // Date filter is commented + } + } + } + } + } + + private void applyStringFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, String matchMode) { + if (value instanceof String) { + String valueStr = (String) value; + if (fieldPath.getJavaType().equals(String.class)) { + switch (matchMode.toLowerCase()) { + case GepafinConstant.CONTAINS -> + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase() + "%")); + case GepafinConstant.EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, valueStr)); + case GepafinConstant.STARTS_WITH -> + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), valueStr.toLowerCase() + "%")); + case GepafinConstant.ENDS_WITH -> + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase())); + } + } + } + } + + private void applyNumberFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, String matchMode) { + if (Number.class.isAssignableFrom(fieldPath.getJavaType())) { + Number numberValue = null; + if (value instanceof Number) { + numberValue = (Number) value; + } + switch (matchMode.toLowerCase()) { + case GepafinConstant.EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, numberValue)); + } + } + } + +/* +private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, String matchMode) { + if (fieldPath.getJavaType().equals(LocalDateTime.class)) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + LocalDateTime dateValue = LocalDateTime.parse(value.toString(), formatter); + + Expression fieldAsString = criteriaBuilder.function("TO_CHAR", String.class, fieldPath, criteriaBuilder.literal("YYYY-MM-DD HH24:MI:SS.MS")); + + switch (matchMode.toLowerCase()) { + case GepafinConstant.EQUALS -> predicates.add(criteriaBuilder.equal(fieldAsString, value.toString())); + case GepafinConstant.BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(LocalDateTime.class), dateValue)); + case GepafinConstant.AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(LocalDateTime.class), dateValue)); + } + } +} +*/ + + private Path getFieldPath(Root root, String fieldName) { + try { + return switch (fieldName) { + case GepafinConstant.CALL_ID -> root.get(GepafinConstant.CALL).get(GepafinConstant.ID); + case GepafinConstant.CALL_TITLE -> root.get(GepafinConstant.CALL).get(GepafinConstant.NAME); + case GepafinConstant.CALL_END_DATE -> root.get(GepafinConstant.CALL).get(GepafinConstant.END_DATE); + case GepafinConstant.CALL_END_TIME -> root.get(GepafinConstant.CALL).get(GepafinConstant.END_TIME); + case GepafinConstant.MODIFIED_DATE -> root.get(GepafinConstant.CALL).get(GepafinConstant.UPDATED_DATE); + case GepafinConstant.PROTOCOL_NUMBER-> root.get(GepafinConstant.PROTOCOL).get(GepafinConstant.PROTOCOL_NUMBER); + default -> root.get(fieldName); + }; + } catch (IllegalArgumentException e) { + return null; + } + } + + public void checkCallEndDate(CallEntity call) { LocalDateTime now = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java index 153164d6..d6468973 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java @@ -4,6 +4,7 @@ import lombok.Data; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import java.util.List; +import java.util.Map; @Data public class ApplicationPageableRequestBean { @@ -13,4 +14,6 @@ public class ApplicationPageableRequestBean { private Integer daysRange; private List status; + + private Map filters; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java b/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java new file mode 100644 index 00000000..df7eaf69 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class FilterCriteria { + + private Object value; + private String matchMode; +} From 10afb623a730bb9a5193e5ec0d669bc0ac7f1339 Mon Sep 17 00:00:00 2001 From: Piyush Date: Tue, 25 Feb 2025 16:08:01 +0530 Subject: [PATCH 2/5] Updated code --- .../constants/GepafinConstant.java | 8 ++--- .../tendermanagement/dao/ApplicationDao.java | 34 +++++++++++-------- .../tendermanagement/enums/MatchModeEnum.java | 25 ++++++++++++++ .../model/request/FilterCriteria.java | 3 +- 4 files changed, 48 insertions(+), 22 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 1c31a2c7..efd6bcda 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -426,10 +426,7 @@ public class GepafinConstant { public static final String APPOINTMENT_CANNOT_BE_CREATED = "appointment.cannot.be.created"; public static final String APPOINTMENT_NOT_CREATED = "appointment.not.created"; - public static final String CONTAINS = "contains"; - public static final String EQUALS = "equals"; - public static final String STARTS_WITH = "starts_with"; - public static final String ENDS_WITH = "ends_with"; + public static final String CALL_TITLE = "callTitle"; public static final String CALL_ID="callId"; public static final String CALL_END_DATE="callEndDate"; @@ -440,8 +437,7 @@ public class GepafinConstant { public static final String CALL_END_TIME="callEndTime"; public static final String END_TIME="endTime"; public static final String UPDATED_DATE="updatedDate"; - public static final String BEFORE="before"; - public static final String AFTER="after"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index d749897b..205ff89a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1585,7 +1585,7 @@ public class ApplicationDao { String fieldName = entry.getKey(); FilterCriteria filterCriteria = entry.getValue(); Object value = filterCriteria.getValue(); - String matchMode = filterCriteria.getMatchMode(); + MatchModeEnum matchMode = filterCriteria.getMatchMode(); if (value != null && matchMode != null) { Path fieldPath = getFieldPath(root, fieldName); @@ -1599,47 +1599,51 @@ public class ApplicationDao { } } - private void applyStringFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, String matchMode) { + private void applyStringFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { if (value instanceof String) { String valueStr = (String) value; if (fieldPath.getJavaType().equals(String.class)) { - switch (matchMode.toLowerCase()) { - case GepafinConstant.CONTAINS -> + MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); + switch (mode) { + case CONTAINS -> predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase() + "%")); - case GepafinConstant.EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, valueStr)); - case GepafinConstant.STARTS_WITH -> + case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, valueStr)); + case STARTSWITH -> predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), valueStr.toLowerCase() + "%")); - case GepafinConstant.ENDS_WITH -> + case ENDSWITH -> predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase())); } } } } - private void applyNumberFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, String matchMode) { + private void applyNumberFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { if (Number.class.isAssignableFrom(fieldPath.getJavaType())) { Number numberValue = null; if (value instanceof Number) { numberValue = (Number) value; } - switch (matchMode.toLowerCase()) { - case GepafinConstant.EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, numberValue)); + MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); + switch (mode) { + case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, numberValue)); } } } /* -private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, String matchMode) { +private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { if (fieldPath.getJavaType().equals(LocalDateTime.class)) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); LocalDateTime dateValue = LocalDateTime.parse(value.toString(), formatter); Expression fieldAsString = criteriaBuilder.function("TO_CHAR", String.class, fieldPath, criteriaBuilder.literal("YYYY-MM-DD HH24:MI:SS.MS")); - switch (matchMode.toLowerCase()) { - case GepafinConstant.EQUALS -> predicates.add(criteriaBuilder.equal(fieldAsString, value.toString())); - case GepafinConstant.BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(LocalDateTime.class), dateValue)); - case GepafinConstant.AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(LocalDateTime.class), dateValue)); + MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); + switch (mode) { + + case EQUALS -> predicates.add(criteriaBuilder.equal(fieldAsString, value.toString())); + case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(LocalDateTime.class), dateValue)); + case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(LocalDateTime.class), dateValue)); } } } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java new file mode 100644 index 00000000..dc2383c0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java @@ -0,0 +1,25 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + + +public enum MatchModeEnum { + STARTSWITH("STARTSWITH"), + ENDSWITH("ENDSWITH"), + CONTAINS("CONTAINS"), + EQUALS("EQUALS"), + BEFORE("BEFORE"), + AFTER("AFTER"), + EXPIRED("EXPIRED"); + + private String value; + + MatchModeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java b/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java index df7eaf69..25690086 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FilterCriteria.java @@ -1,10 +1,11 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; +import net.gepafin.tendermanagement.enums.MatchModeEnum; @Data public class FilterCriteria { private Object value; - private String matchMode; + private MatchModeEnum matchMode; } From 73e5eca44c6201ef5a2e6c2179844f7ba1e6e347 Mon Sep 17 00:00:00 2001 From: Piyush Date: Tue, 25 Feb 2025 16:18:43 +0530 Subject: [PATCH 3/5] Updated code --- .../java/net/gepafin/tendermanagement/enums/MatchModeEnum.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java index dc2383c0..836eb592 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java @@ -9,8 +9,7 @@ public enum MatchModeEnum { CONTAINS("CONTAINS"), EQUALS("EQUALS"), BEFORE("BEFORE"), - AFTER("AFTER"), - EXPIRED("EXPIRED"); + AFTER("AFTER"); private String value; From 28137422db9bfe4fd42ae00e4fa6ca6701c8028f Mon Sep 17 00:00:00 2001 From: Piyush Date: Thu, 27 Feb 2025 11:50:14 +0530 Subject: [PATCH 4/5] Added date filter in pagination endpoint --- .../tendermanagement/dao/ApplicationDao.java | 41 +++++++++++-------- .../tendermanagement/enums/MatchModeEnum.java | 27 +++++++++--- 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 205ff89a..63e399b0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -2,7 +2,6 @@ package net.gepafin.tendermanagement.dao; import jakarta.persistence.criteria.*; import net.gepafin.tendermanagement.config.Translator; -import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; @@ -47,6 +46,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; +import java.sql.Timestamp; import java.text.MessageFormat; import java.text.NumberFormat; import java.text.ParseException; @@ -54,6 +54,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -63,6 +64,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import static org.apache.commons.lang3.StringUtils.isEmpty; +import static org.hibernate.validator.internal.engine.messageinterpolation.el.RootResolver.FORMATTER; @Component public class ApplicationDao { @@ -1592,7 +1594,7 @@ public class ApplicationDao { if (fieldPath != null) { applyStringFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); applyNumberFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); - // applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); // Date filter is commented + applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode,root); } } } @@ -1603,7 +1605,7 @@ public class ApplicationDao { if (value instanceof String) { String valueStr = (String) value; if (fieldPath.getJavaType().equals(String.class)) { - MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); switch (mode) { case CONTAINS -> predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase() + "%")); @@ -1623,31 +1625,36 @@ public class ApplicationDao { if (value instanceof Number) { numberValue = (Number) value; } - MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); switch (mode) { case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, numberValue)); } } } -/* -private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { - if (fieldPath.getJavaType().equals(LocalDateTime.class)) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); - LocalDateTime dateValue = LocalDateTime.parse(value.toString(), formatter); - Expression fieldAsString = criteriaBuilder.function("TO_CHAR", String.class, fieldPath, criteriaBuilder.literal("YYYY-MM-DD HH24:MI:SS.MS")); + public static LocalDateTime parseStringToLocalDateTime(String timestampStr) { + // Use ISO_LOCAL_DATE_TIME to parse the input string + return LocalDateTime.parse(timestampStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME); + } - MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); - switch (mode) { + private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode, Root root) { + if (fieldPath.getJavaType().equals(LocalDateTime.class)) { + LocalDateTime testDateTime = parseStringToLocalDateTime(value.toString()); + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); - case EQUALS -> predicates.add(criteriaBuilder.equal(fieldAsString, value.toString())); - case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(LocalDateTime.class), dateValue)); - case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(LocalDateTime.class), dateValue)); + + switch (mode) { +// case DATEIS -> predicates.add(criteriaBuilder.equal(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + case DATEISNOT -> predicates.add(criteriaBuilder.notEqual(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + } } } -} -*/ + + + private Path getFieldPath(Root root, String fieldName) { try { diff --git a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java index 836eb592..f3ee252c 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java @@ -4,18 +4,33 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum MatchModeEnum { - STARTSWITH("STARTSWITH"), - ENDSWITH("ENDSWITH"), - CONTAINS("CONTAINS"), - EQUALS("EQUALS"), - BEFORE("BEFORE"), - AFTER("AFTER"); + STARTSWITH("Starts with"), + ENDSWITH("Ends with"), + CONTAINS("Contains"), + EQUALS("Equals"), + DATEIS("Date is"), + DATEISNOT("Date is not"), + BEFORE("Date is before"), + AFTER("Date is after"); private String value; MatchModeEnum(String value) { this.value = value; } + public static MatchModeEnum fromObject(Object value) { + if (value instanceof String) { + String strValue = ((String) value).trim(); + for (MatchModeEnum mode : MatchModeEnum.values()) { + if (mode.getValue().equalsIgnoreCase(strValue)) { + return mode; + } + } + } + throw new IllegalArgumentException("Invalid MatchModeEnum: " + value); + } + + @JsonValue public String getValue() { From bc2a546012da148c52e7de26539ad816b3632753 Mon Sep 17 00:00:00 2001 From: Piyush Date: Thu, 27 Feb 2025 12:17:47 +0530 Subject: [PATCH 5/5] Updated code --- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 7 ++----- .../net/gepafin/tendermanagement/util/DateTimeUtil.java | 4 ++++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 390fbd89..92ffc2d3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1649,14 +1649,11 @@ public class ApplicationDao { } - public static LocalDateTime parseStringToLocalDateTime(String timestampStr) { - // Use ISO_LOCAL_DATE_TIME to parse the input string - return LocalDateTime.parse(timestampStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME); - } + private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode, Root root) { if (fieldPath.getJavaType().equals(LocalDateTime.class)) { - LocalDateTime testDateTime = parseStringToLocalDateTime(value.toString()); + LocalDateTime testDateTime = DateTimeUtil.parseStringToLocalDateTime(value.toString()); MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); diff --git a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java index ec7fe7d9..1a68818f 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java +++ b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java @@ -92,6 +92,10 @@ public class DateTimeUtil { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); return LocalDateTime.parse(dateTimeStr, formatter); } + public static LocalDateTime parseStringToLocalDateTime(String timestampStr) { + // Use ISO_LOCAL_DATE_TIME to parse the input string + return LocalDateTime.parse(timestampStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME); + } public static String parseLocalTimeToString(LocalTime time, String format) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);