From 9091ba365a9b8b32cd6ee58c0d5fa3c8f6341858 Mon Sep 17 00:00:00 2001 From: Francesco Date: Tue, 26 Sep 2023 20:01:20 +0200 Subject: [PATCH] WIP --- .../controller/DefaultDbAdminController.java | 9 +++-- .../dbmapping/AdvancedJpaRepository.java | 25 ++++++------ .../external/dbmapping/DbFieldType.java | 2 + .../dbadmin/external/dto/QueryFilter.java | 38 ++++++++++++------- .../ailef/dbadmin/external/misc/Utils.java | 7 ++-- .../resources/templates/fragments/forms.html | 20 +++++++--- src/main/resources/templates/model/list.html | 2 +- 7 files changed, 64 insertions(+), 39 deletions(-) diff --git a/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java index ea27765..256f1b9 100644 --- a/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java +++ b/src/main/java/tech/ailef/dbadmin/external/controller/DefaultDbAdminController.java @@ -123,17 +123,20 @@ public class DefaultDbAdminController { if (page == null) page = 1; if (pageSize == null) pageSize = 50; - Set queryFilters = Utils.computeFilters(otherParams); + DbObjectSchema schema = dbAdmin.findSchemaByClassName(className); + + Set queryFilters = Utils.computeFilters(schema, otherParams); if (otherParams.containsKey("remove_field")) { List fields = otherParams.get("remove_field"); for (int i = 0; i < fields.size(); i++) { QueryFilter toRemove = new QueryFilter( - fields.get(i), + schema.getFieldByJavaName(fields.get(i)), CompareOperator.valueOf(otherParams.get("remove_op").get(i).toUpperCase()), otherParams.get("remove_value").get(i) ); + System.out.println("TOREMOVE = " + toRemove); queryFilters.removeIf(f -> f.equals(toRemove)); } @@ -159,8 +162,6 @@ public class DefaultDbAdminController { return "redirect:" + redirectUrl.trim(); } - DbObjectSchema schema = dbAdmin.findSchemaByClassName(className); - try { PaginatedResult result = null; if (query != null || !otherParams.isEmpty()) { diff --git a/src/main/java/tech/ailef/dbadmin/external/dbmapping/AdvancedJpaRepository.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/AdvancedJpaRepository.java index 7e40c84..86603ce 100644 --- a/src/main/java/tech/ailef/dbadmin/external/dbmapping/AdvancedJpaRepository.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/AdvancedJpaRepository.java @@ -104,48 +104,51 @@ public class AdvancedJpaRepository extends SimpleJpaRepository { if (queryFilters == null) queryFilters = new HashSet<>(); for (QueryFilter filter : queryFilters) { CompareOperator op = filter.getOp(); - String field = filter.getField(); + DbField dbField = filter.getField(); + String fieldName = dbField.getJavaName(); String v = filter.getValue(); - DbField dbField = schema.getFieldByJavaName(field); Object value = dbField.getType().parseValue(v); if (op == CompareOperator.STRING_EQ) { - finalPredicates.add(cb.equal(cb.lower(cb.toString(root.get(field))), value.toString().toLowerCase())); + if (value == null) + finalPredicates.add(cb.isNull(root.get(fieldName))); + else + finalPredicates.add(cb.equal(cb.lower(cb.toString(root.get(fieldName))), value.toString().toLowerCase())); } else if (op == CompareOperator.CONTAINS) { finalPredicates.add( - cb.like(cb.lower(cb.toString(root.get(field))), "%" + value.toString().toLowerCase() + "%") + cb.like(cb.lower(cb.toString(root.get(fieldName))), "%" + value.toString().toLowerCase() + "%") ); } else if (op == CompareOperator.EQ) { finalPredicates.add( - cb.equal(root.get(field), Double.parseDouble(value.toString())) + cb.equal(root.get(fieldName), value) ); } else if (op == CompareOperator.GT) { finalPredicates.add( - cb.greaterThan(root.get(field), Double.parseDouble(value.toString())) + cb.greaterThan(root.get(fieldName), value.toString()) ); } else if (op == CompareOperator.LT) { finalPredicates.add( - cb.lessThan(root.get(field), Double.parseDouble(value.toString())) + cb.lessThan(root.get(fieldName), value.toString()) ); } else if (op == CompareOperator.AFTER) { if (value instanceof LocalDate) finalPredicates.add( - cb.greaterThan(root.get(field), (LocalDate)value) + cb.greaterThan(root.get(fieldName), (LocalDate)value) ); else if (value instanceof LocalDateTime) finalPredicates.add( - cb.greaterThan(root.get(field), (LocalDateTime)value) + cb.greaterThan(root.get(fieldName), (LocalDateTime)value) ); } else if (op == CompareOperator.BEFORE) { if (value instanceof LocalDate) finalPredicates.add( - cb.lessThan(root.get(field), (LocalDate)value) + cb.lessThan(root.get(fieldName), (LocalDate)value) ); else if (value instanceof LocalDateTime) finalPredicates.add( - cb.lessThan(root.get(field), (LocalDateTime)value) + cb.lessThan(root.get(fieldName), (LocalDateTime)value) ); } diff --git a/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldType.java b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldType.java index bfebae7..8cf1634 100644 --- a/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldType.java +++ b/src/main/java/tech/ailef/dbadmin/external/dbmapping/DbFieldType.java @@ -108,6 +108,7 @@ public enum DbFieldType { @Override public Object parseValue(Object value) { + if (value == null) return null; return LocalDate.parse(value.toString()); } @@ -129,6 +130,7 @@ public enum DbFieldType { @Override public Object parseValue(Object value) { + if (value == null || value.toString().isBlank()) return null; return LocalDateTime.parse(value.toString()); } diff --git a/src/main/java/tech/ailef/dbadmin/external/dto/QueryFilter.java b/src/main/java/tech/ailef/dbadmin/external/dto/QueryFilter.java index 63a77e9..9449516 100644 --- a/src/main/java/tech/ailef/dbadmin/external/dto/QueryFilter.java +++ b/src/main/java/tech/ailef/dbadmin/external/dto/QueryFilter.java @@ -2,20 +2,22 @@ package tech.ailef.dbadmin.external.dto; import java.util.Objects; +import tech.ailef.dbadmin.external.dbmapping.DbField; + public class QueryFilter { - private String field; + private DbField field; private CompareOperator op; private String value; - public QueryFilter(String field, CompareOperator op, String value) { + public QueryFilter(DbField field, CompareOperator op, String value) { this.field = field; this.op = op; this.value = value; } - public String getField() { + public DbField getField() { return field; } @@ -27,20 +29,28 @@ public class QueryFilter { return value; } + @Override + public String toString() { + if (value != null && !value.toString().isBlank()) { + String displayValue = value; + if (value.length() > 10) { + displayValue = value.substring(0, 4) + "..." + value.substring(value.length() - 4); + } + return "'" + field.getName() + "' " + op.getDisplayName() + " '" + displayValue + "'"; + } else { + if (op != CompareOperator.STRING_EQ && op != CompareOperator.EQ) { + return "'" + field.getName() + "' " + op.getDisplayName() + " NULL"; + } else { + return "'" + field.getName() + "' IS NULL"; + } + } + } + @Override public int hashCode() { return Objects.hash(field, op, value); } - @Override - public String toString() { - String displayValue = value; - if (value.length() > 10) { - displayValue = value.substring(0, 4) + "..." + value.substring(value.length() - 4); - } - return "'" + field + "' " + op.getDisplayName() + " '" + displayValue + "'"; - } - @Override public boolean equals(Object obj) { if (this == obj) @@ -50,8 +60,8 @@ public class QueryFilter { if (getClass() != obj.getClass()) return false; QueryFilter other = (QueryFilter) obj; - return Objects.equals(field, other.field) && Objects.equals(op, other.op) && Objects.equals(value, other.value); + return Objects.equals(field, other.field) && op == other.op && Objects.equals(value, other.value); } - + } diff --git a/src/main/java/tech/ailef/dbadmin/external/misc/Utils.java b/src/main/java/tech/ailef/dbadmin/external/misc/Utils.java index 6000746..7fcfc93 100644 --- a/src/main/java/tech/ailef/dbadmin/external/misc/Utils.java +++ b/src/main/java/tech/ailef/dbadmin/external/misc/Utils.java @@ -8,6 +8,7 @@ import java.util.Set; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import tech.ailef.dbadmin.external.dbmapping.DbObjectSchema; import tech.ailef.dbadmin.external.dto.CompareOperator; import tech.ailef.dbadmin.external.dto.QueryFilter; import tech.ailef.dbadmin.external.exceptions.DbAdminException; @@ -32,7 +33,7 @@ public interface Utils { r.put("filter_value", new ArrayList<>()); for (QueryFilter filter : filters) { - r.get("filter_field").add(filter.getField()); + r.get("filter_field").add(filter.getField().getJavaName()); r.get("filter_op").add(filter.getOp().toString()); r.get("filter_value").add(filter.getValue()); } @@ -40,7 +41,7 @@ public interface Utils { return r; } - public static Set computeFilters(MultiValueMap params) { + public static Set computeFilters(DbObjectSchema schema, MultiValueMap params) { if (params == null) return new HashSet<>(); @@ -62,7 +63,7 @@ public interface Utils { String field = fields.get(i); String value = values.get(i); - QueryFilter queryFilter = new QueryFilter(field, CompareOperator.valueOf(op.toUpperCase()), value); + QueryFilter queryFilter = new QueryFilter(schema.getFieldByJavaName(field), CompareOperator.valueOf(op.toUpperCase()), value); filters.add(queryFilter); } diff --git a/src/main/resources/templates/fragments/forms.html b/src/main/resources/templates/fragments/forms.html index 4035955..d17c5e6 100644 --- a/src/main/resources/templates/fragments/forms.html +++ b/src/main/resources/templates/fragments/forms.html @@ -46,15 +46,16 @@
- Propagate queryParams containing other filters with hidden fields - - - Handle non categorical filter
+ Propagate queryParams containing other filters with hidden fields + + + +
@@ -102,6 +103,13 @@
  • + Propagate queryParams containing other filters with hidden fields + + + + diff --git a/src/main/resources/templates/model/list.html b/src/main/resources/templates/model/list.html index a3e3bb3..fa68632 100644 --- a/src/main/resources/templates/model/list.html +++ b/src/main/resources/templates/model/list.html @@ -88,7 +88,7 @@ - +