From 44a97a43efcc88eb4577350edebdf9cdb2a4216e Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Wed, 29 Jan 2020 01:03:59 -0500 Subject: [PATCH] add support for sort functions --- .../wizard/model/search/SearchQuery.java | 8 +++--- .../wizard/model/search/SearchSort.java | 11 +++++++- .../wizard/dao/SqlViewSearchHelper.java | 25 ++++++++++++++++--- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/wizard-common/src/main/java/org/cobbzilla/wizard/model/search/SearchQuery.java b/wizard-common/src/main/java/org/cobbzilla/wizard/model/search/SearchQuery.java index cc29329..4fa635e 100644 --- a/wizard-common/src/main/java/org/cobbzilla/wizard/model/search/SearchQuery.java +++ b/wizard-common/src/main/java/org/cobbzilla/wizard/model/search/SearchQuery.java @@ -19,9 +19,6 @@ import static org.cobbzilla.wizard.model.Identifiable.CTIME; @NoArgsConstructor @Accessors(chain=true) @ToString public class SearchQuery { - public static final String ASC = SortOrder.ASC.toString(); - public static final String DESC = SortOrder.DESC.toString(); - public static final String PARAM_USE_PAGINATION = "page"; public static final String PARAM_PAGE_NUMBER = "pn"; public static final String PARAM_PAGE_SIZE = "ps"; @@ -184,7 +181,10 @@ public class SearchQuery { final StringBuilder b = new StringBuilder(); for (SearchSort s : sorts) { if (b.length() > 0) b.append(", "); - b.append(entityAlias).append(".").append(s.getSortField()).append(" ").append(s.getSortOrder().name()); + b.append(s.hasFunc() ? s.getFunc()+"(" : "") + .append(entityAlias).append(".").append(s.getSortField()) + .append(s.hasFunc() ? ")" : "") + .append(" ").append(s.getSortOrder().name()); } return b.toString(); } diff --git a/wizard-common/src/main/java/org/cobbzilla/wizard/model/search/SearchSort.java b/wizard-common/src/main/java/org/cobbzilla/wizard/model/search/SearchSort.java index 91c5315..9d47cf6 100644 --- a/wizard-common/src/main/java/org/cobbzilla/wizard/model/search/SearchSort.java +++ b/wizard-common/src/main/java/org/cobbzilla/wizard/model/search/SearchSort.java @@ -2,11 +2,20 @@ package org.cobbzilla.wizard.model.search; import lombok.*; -@NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(of={"sortField", "sortOrder"}) +import static org.cobbzilla.util.daemon.ZillaRuntime.empty; + +@NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(of={"sortField", "sortOrder", "func"}) public class SearchSort { @Getter @Setter private String sortField; @Getter @Setter private SortOrder sortOrder = SortOrder.ASC; + @Getter @Setter private String func; + public boolean hasFunc () { return !empty(func); } + + public SearchSort(String sortField, SortOrder sortOrder) { + this.sortField = sortField; + this.sortOrder = sortOrder; + } public SearchSort(String sort) { if (sort.startsWith("+") || sort.startsWith(" ")) { diff --git a/wizard-server/src/main/java/org/cobbzilla/wizard/dao/SqlViewSearchHelper.java b/wizard-server/src/main/java/org/cobbzilla/wizard/dao/SqlViewSearchHelper.java index a2e8762..5633ca9 100644 --- a/wizard-server/src/main/java/org/cobbzilla/wizard/dao/SqlViewSearchHelper.java +++ b/wizard-server/src/main/java/org/cobbzilla/wizard/dao/SqlViewSearchHelper.java @@ -66,7 +66,10 @@ public class SqlViewSearchHelper { final String sortField = dao.getSortField(s.getSortField()); sortedFields.add(sortField); if (sort.length() > 0) sort.append(", "); - sort.append(sortField).append(" ").append(s.getSortOrder().name()); + sort.append(s.hasFunc() ? s.getFunc()+"(" : "") + .append(sortField) + .append(s.hasFunc() ? ")" : "") + .append(" ").append(s.getSortOrder().name()); } } else { final String defaultSort = dao.getDefaultSort(); @@ -161,7 +164,8 @@ public class SqlViewSearchHelper { final SqlViewField sqlViewField = Arrays.stream(fields).filter(a -> a.getName().equals(sortField)).findFirst().orElse(null); if (sqlViewField == null) return die("search: sort field not defined/mapped: " + sortField); - final Comparator comparator = (E o1, E o2) -> compareSelectedItems(o1, o2, sqlViewField); + final String func = searchQuery.getSorts()[i].getFunc(); + final Comparator comparator = (E o1, E o2) -> compareSelectedItems(o1, o2, sqlViewField, func); if (searchQuery.getSorts()[i].getSortOrder() == ASC) { matched.sort(comparator); @@ -185,7 +189,7 @@ public class SqlViewSearchHelper { } } - private static int compareSelectedItems(E o1, E o2, SqlViewField field) { + private static int compareSelectedItems(E o1, E o2, SqlViewField field, String func) { Object fieldObject1; Object fieldObject2; @@ -203,6 +207,21 @@ public class SqlViewSearchHelper { if (fieldObject1 == null && fieldObject2 != null) return 1; if (fieldObject1 != null && fieldObject2 == null) return -1; + if (func != null) { + switch (func) { + case "lower": + fieldObject1 = fieldObject1.toString().toLowerCase(); + fieldObject2 = fieldObject2.toString().toLowerCase(); + break; + case "upper": + fieldObject1 = fieldObject1.toString().toUpperCase(); + fieldObject2 = fieldObject2.toString().toUpperCase(); + break; + default: + return die("compareSelectedItems: unsupported function: "+func); + } + } + Class sortedFieldClass = ReflectionUtil.getSimpleClass(fieldObject1); if (sortedFieldClass.equals(String.class)) { return ((String) fieldObject1).compareTo((String) fieldObject2);