From 0bd5ce19f1f53dd606f031043433cfab38cf51b4 Mon Sep 17 00:00:00 2001 From: Francesco Date: Mon, 18 Sep 2023 16:28:10 +0200 Subject: [PATCH] WIP --- src/main/java/tech/ailef/dbadmin/DbAdmin.java | 1 - .../ailef/dbadmin/annotations/Filterable.java | 11 +++++ .../controller/DefaultDbAdminController.java | 4 ++ .../dbmapping/AdvancedJpaRepository.java | 16 +++++++ .../dbadmin/dbmapping/DbObjectSchema.java | 13 ++++++ src/main/resources/templates/model/list.html | 42 +++++++++++++------ 6 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 src/main/java/tech/ailef/dbadmin/annotations/Filterable.java diff --git a/src/main/java/tech/ailef/dbadmin/DbAdmin.java b/src/main/java/tech/ailef/dbadmin/DbAdmin.java index f92e22d..c0c3427 100644 --- a/src/main/java/tech/ailef/dbadmin/DbAdmin.java +++ b/src/main/java/tech/ailef/dbadmin/DbAdmin.java @@ -95,7 +95,6 @@ public class DbAdmin { field.setSchema(schema); schema.addField(field); - System.out.println(field); } return schema; diff --git a/src/main/java/tech/ailef/dbadmin/annotations/Filterable.java b/src/main/java/tech/ailef/dbadmin/annotations/Filterable.java new file mode 100644 index 0000000..5b72c56 --- /dev/null +++ b/src/main/java/tech/ailef/dbadmin/annotations/Filterable.java @@ -0,0 +1,11 @@ +package tech.ailef.dbadmin.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Filterable { +} \ No newline at end of file diff --git a/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java b/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java index 99942d1..6c9e890 100644 --- a/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java +++ b/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java @@ -45,6 +45,10 @@ import tech.ailef.dbadmin.exceptions.InvalidPageException; * - Pagination in one to many results? * - BLOB upload (WIP: check edit not working) * - AI console (PRO) + * - Action logs + * - Boolean icons + * - @Filterable + * - Boolean in create/edit is checkbox * - SQL console (PRO) * - JPA Validation (PRO) * - Logging diff --git a/src/main/java/tech/ailef/dbadmin/dbmapping/AdvancedJpaRepository.java b/src/main/java/tech/ailef/dbadmin/dbmapping/AdvancedJpaRepository.java index 6eb67c8..c2d9c97 100644 --- a/src/main/java/tech/ailef/dbadmin/dbmapping/AdvancedJpaRepository.java +++ b/src/main/java/tech/ailef/dbadmin/dbmapping/AdvancedJpaRepository.java @@ -74,4 +74,20 @@ public class AdvancedJpaRepository extends SimpleJpaRepository { return entityManager.createQuery(query).setMaxResults(pageSize) .setFirstResult((page - 1) * pageSize).getResultList(); } + + public List distinctFieldValues(DbField field) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + + Class outputType = field.getType().getJavaClass(); + if (field.getConnectedType() != null) { + outputType = field.getConnectedSchema().getPrimaryKey().getType().getJavaClass(); + } + + CriteriaQuery query = cb.createQuery(outputType); + Root root = query.from(schema.getJavaClass()); + + query.select(root.get(field.getJavaName()).as(outputType)).distinct(true); + + return entityManager.createQuery(query).getResultList(); + } } diff --git a/src/main/java/tech/ailef/dbadmin/dbmapping/DbObjectSchema.java b/src/main/java/tech/ailef/dbadmin/dbmapping/DbObjectSchema.java index 99c613f..c9c8f17 100644 --- a/src/main/java/tech/ailef/dbadmin/dbmapping/DbObjectSchema.java +++ b/src/main/java/tech/ailef/dbadmin/dbmapping/DbObjectSchema.java @@ -1,6 +1,7 @@ package tech.ailef.dbadmin.dbmapping; import java.lang.reflect.Method; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -19,6 +20,7 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import tech.ailef.dbadmin.DbAdmin; import tech.ailef.dbadmin.annotations.ComputedColumn; +import tech.ailef.dbadmin.annotations.Filterable; import tech.ailef.dbadmin.exceptions.DbAdminException; import tech.ailef.dbadmin.misc.Utils; @@ -173,6 +175,17 @@ public class DbObjectSchema { public Method getComputedColumn(String name) { return computedColumns.get(name); } + + public List getFilterableFields() { + return getSortedFields().stream().filter(f -> { + return !f.isBinary() && !f.isPrimaryKey() + && f.getPrimitiveField().getAnnotation(Filterable.class) != null; + }).toList(); + } + + public List getFieldValues(DbField field) { + return jpaRepository.distinctFieldValues(field); + } public Object[] getInsertArray(Map params, Map files) { int currentIndex = 0; diff --git a/src/main/resources/templates/model/list.html b/src/main/resources/templates/model/list.html index d5e5c2b..6c8eb8a 100644 --- a/src/main/resources/templates/model/list.html +++ b/src/main/resources/templates/model/list.html @@ -15,7 +15,7 @@ [[ ${schema.getJavaClass().getSimpleName()} ]]