Explorar el Código

add support for sort functions

tags/2.0.1
Jonathan Cobb hace 4 años
padre
commit
44a97a43ef
Se han modificado 3 ficheros con 36 adiciones y 8 borrados
  1. +4
    -4
      wizard-common/src/main/java/org/cobbzilla/wizard/model/search/SearchQuery.java
  2. +10
    -1
      wizard-common/src/main/java/org/cobbzilla/wizard/model/search/SearchSort.java
  3. +22
    -3
      wizard-server/src/main/java/org/cobbzilla/wizard/dao/SqlViewSearchHelper.java

+ 4
- 4
wizard-common/src/main/java/org/cobbzilla/wizard/model/search/SearchQuery.java Ver fichero

@@ -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();
}


+ 10
- 1
wizard-common/src/main/java/org/cobbzilla/wizard/model/search/SearchSort.java Ver fichero

@@ -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(" ")) {


+ 22
- 3
wizard-server/src/main/java/org/cobbzilla/wizard/dao/SqlViewSearchHelper.java Ver fichero

@@ -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<E> comparator = (E o1, E o2) -> compareSelectedItems(o1, o2, sqlViewField);
final String func = searchQuery.getSorts()[i].getFunc();
final Comparator<E> 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 <E extends Identifiable> int compareSelectedItems(E o1, E o2, SqlViewField field) {
private static <E extends Identifiable> 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);


Cargando…
Cancelar
Guardar