Skip to content

Commit

Permalink
Added support in GUI and DB for custom query filter and sort order.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Jan 5, 2015
1 parent 86b8f76 commit 777535b
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 47 deletions.
28 changes: 25 additions & 3 deletions rapidoid-app/src/main/java/org/rapidoid/app/AppGUI.java
Expand Up @@ -20,11 +20,15 @@
* #L%
*/

import java.util.Comparator;

import org.rapidoid.db.DB;
import org.rapidoid.db.model.DbItems;
import org.rapidoid.lambda.Predicate;
import org.rapidoid.model.Item;
import org.rapidoid.model.Items;
import org.rapidoid.model.Models;
import org.rapidoid.util.Cls;
import org.rapidoid.util.U;
import org.rapidoid.widget.BootstrapWidgets;
import org.rapidoid.widget.DataManager;
Expand All @@ -34,25 +38,43 @@
public class AppGUI extends BootstrapWidgets {

public static <T> Items all(Class<T> type) {
return new DbItems<T>(type, "id");
return new DbItems<T>(type, null, Cls.<T> comparator("id"));
}

public static <T> Items all(Class<T> type, String orderBy) {
return new DbItems<T>(type, orderBy);
return new DbItems<T>(type, null, Cls.<T> comparator(orderBy));
}

public static <T> Items all(Class<T> type, Predicate<T> match, String orderBy) {
return new DbItems<T>(type, match, Cls.<T> comparator(orderBy));
}

public static <T> Items all(Class<T> type, Predicate<T> match, Comparator<T> orderBy) {
return new DbItems<T>(type, match, orderBy);
}

public static Item item(Object value) {
return Models.item(value);
}

public static <T> Items beanItems(Class<T> beanType, Object... beans) {
public static <T> Items beanItems(Class<T> beanType, T... beans) {
return Models.beanItems(beanType, beans);
}

public static <T> GridWidget grid(Class<T> type, String sortOrder, int pageSize, String... properties) {
return grid(all(type, sortOrder), sortOrder, pageSize, properties);
}

public static <T> GridWidget grid(Class<T> type, Predicate<T> match, String sortOrder, int pageSize,
String... properties) {
return grid(all(type, match, sortOrder), sortOrder, pageSize, properties);
}

public static <T> GridWidget grid(Class<T> type, Predicate<T> match, Comparator<T> orderBy, int pageSize,
String... properties) {
return grid(all(type, match, orderBy), null, pageSize, properties);
}

public static FormWidget show(Object bean, String... properties) {
return show(Models.item(bean), properties);
}
Expand Down
11 changes: 6 additions & 5 deletions rapidoid-db-inmem/src/main/java/org/rapidoid/db/DbImpl.java
Expand Up @@ -23,6 +23,7 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Set;

Expand Down Expand Up @@ -103,11 +104,6 @@ public <E> List<E> getAll(Class<E> clazz) {
return inmem.getAll(clazz);
}

@Override
public <E> List<E> getAll(Class<E> clazz, String orderBy) {
return inmem.getAll(clazz, orderBy);
}

@Override
public <E> List<E> getAll(long... ids) {
return inmem.getAll(ids);
Expand All @@ -123,6 +119,11 @@ public <E> List<E> find(Predicate<E> match) {
return inmem.find(match);
}

@Override
public <E> List<E> find(Class<E> clazz, Predicate<E> match, Comparator<E> orderBy) {
return inmem.find(clazz, match, orderBy);
}

@Override
public <E> List<E> find(String searchPhrase) {
return inmem.find(searchPhrase);
Expand Down
9 changes: 5 additions & 4 deletions rapidoid-db/src/main/java/org/rapidoid/db/DB.java
Expand Up @@ -21,6 +21,7 @@
*/
import java.io.File;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;

import org.rapidoid.lambda.Callback;
Expand Down Expand Up @@ -85,10 +86,6 @@ public static <E> List<E> getAll(Class<E> clazz) {
return db().getAll(clazz);
}

public static <E> List<E> getAll(Class<E> clazz, String orderBy) {
return db().getAll(clazz, orderBy);
}

public static <E> List<E> getAll(long... ids) {
return db().getAll(ids);
}
Expand Down Expand Up @@ -121,6 +118,10 @@ public static <E> List<E> find(Predicate<E> match) {
return db().find(match);
}

public static <E> List<E> find(Class<E> clazz, Predicate<E> match, Comparator<E> orderBy) {
return db().find(clazz, match, orderBy);
}

public static <E> List<E> find(String searchPhrase) {
return db().find(searchPhrase);
}
Expand Down
5 changes: 3 additions & 2 deletions rapidoid-db/src/main/java/org/rapidoid/db/Db.java
Expand Up @@ -23,6 +23,7 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;

import org.rapidoid.activity.Activity;
Expand All @@ -42,8 +43,6 @@ public interface Db extends Activity<Db> {

<E> List<E> getAll(Class<E> clazz);

<E> List<E> getAll(Class<E> clazz, String orderBy);

<E> List<E> getAll(long... ids);

<E> List<E> getAll(Collection<Long> ids);
Expand All @@ -62,6 +61,8 @@ public interface Db extends Activity<Db> {

<E> List<E> find(Predicate<E> match);

<E> List<E> find(Class<E> clazz, Predicate<E> match, Comparator<E> orderBy);

<E> List<E> find(String searchPhrase);

<E> List<E> find(Class<E> clazz, String query, Object... args);
Expand Down
15 changes: 11 additions & 4 deletions rapidoid-db/src/main/java/org/rapidoid/db/model/DbItems.java
Expand Up @@ -20,22 +20,28 @@
* #L%
*/

import java.util.Comparator;
import java.util.List;

import org.rapidoid.db.DB;
import org.rapidoid.lambda.Predicate;
import org.rapidoid.model.Item;
import org.rapidoid.model.Items;
import org.rapidoid.model.Models;
import org.rapidoid.model.impl.BeanListItems;
import org.rapidoid.util.Cls;
import org.rapidoid.util.U;

@SuppressWarnings("serial")
public class DbItems<T> extends BeanListItems<T> {

private final String orderBy;
private final Predicate<T> match;

public DbItems(Class<T> type, String orderBy) {
private final Comparator<T> orderBy;

public DbItems(Class<T> type, Predicate<T> match, Comparator<T> orderBy) {
super(type);
this.match = match;
this.orderBy = orderBy;
}

Expand All @@ -56,7 +62,7 @@ public Item get(int index) {

@Override
protected List<Item> data() {
List<T> all = DB.getAll(beanType, orderBy);
List<T> all = DB.find(beanType, match, orderBy);
List<Item> records = U.list();

for (T t : all) {
Expand All @@ -78,7 +84,8 @@ public void set(int index, Item item) {

@Override
public Items orderedBy(String sortOrder) {
return new DbItems<T>(beanType, sortOrder);
Comparator<T> orderBy = Cls.comparator(sortOrder);
return new DbItems<T>(beanType, match, orderBy);
}

}
Expand Up @@ -20,23 +20,46 @@
* #L%
*/

import java.util.Comparator;

import org.rapidoid.app.Screen;
import org.rapidoid.demo.taskplanner.model.Task;
import org.rapidoid.demo.taskplanner.model.User;
import org.rapidoid.html.Tag;
import org.rapidoid.http.HttpExchange;
import org.rapidoid.lambda.Predicate;
import org.rapidoid.security.annotation.LoggedIn;
import org.rapidoid.util.Cls;
import org.rapidoid.widget.GridWidget;

@LoggedIn
public class MyTasksScreen extends Screen {

public Object content() {
public Object content(final HttpExchange x) {
Tag c1 = titleBox("Tasks owned by me");
GridWidget grid1 = grid(Task.class, "-priority", 10, "id", "title", "priority");

GridWidget grid1 = grid(Task.class, new Predicate<Task>() {
@Override
public boolean eval(Task t) throws Exception {
User user = t.owner.get();
return user != null && user.username.equals(x.username());
}
}, "-priority", 10, "id", "title", "priority");

Tag c2 = titleBox("Tasks shared with me");
GridWidget grid2 = grid(Task.class, "-priority", 10, "id", "title", "priority", "owner");

GridWidget grid2 = grid(Task.class, new Predicate<Task>() {
@Override
public boolean eval(Task t) throws Exception {
return Cls.projection(t.sharedWith, "username").contains(x.username());
}
}, new Comparator<Task>() {
@Override
public int compare(Task t1, Task t2) {
return t1.sharedWith.size() - t2.sharedWith.size();
}
}, 10, "id", "title", "priority");

return row(col6(c1, grid1), col6(c2, grid2));
}

}
47 changes: 22 additions & 25 deletions rapidoid-inmem/src/main/java/org/rapidoid/inmem/InMem.java
Expand Up @@ -496,30 +496,11 @@ public boolean eval(E record) throws Exception {
});
}

public <E> List<E> getAll(final Class<E> clazz, String orderBy) {
List<E> results = getAll(clazz);

final int sign = orderBy.startsWith("-") ? -1 : 1;
final String order = sign == 1 ? orderBy : orderBy.substring(1);

Comparator<E> comparator = new Comparator<E>() {
@SuppressWarnings("unchecked")
@Override
public int compare(E o1, E o2) {

E val1 = getProperty(o1, order, true);
E val2 = getProperty(o2, order, true);

must(val1 instanceof Comparable && val2 instanceof Comparable, "The property '%s' is not comparable!",
order);

return sign * ((Comparable<E>) val1).compareTo(val2);
}
};

Collections.sort(results, comparator);

return results;
protected <E> List<E> sorted(List<E> records, Comparator<E> orderBy) {
if (orderBy != null) {
Collections.sort(records, orderBy);
}
return records;
}

@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -560,7 +541,6 @@ public <E> List<E> find(final Predicate<E> match) {
final List<E> results = new ArrayList<E>();

each(new Operation<E>() {

@Override
public void execute(E record) throws Exception {
if (match.eval(record)) {
Expand All @@ -572,6 +552,23 @@ public void execute(E record) throws Exception {
return results;
}

public <E> List<E> find(final Class<E> clazz, final Predicate<E> match, final Comparator<E> orderBy) {
final List<E> results = new ArrayList<E>();

each(new Operation<E>() {
@Override
public void execute(E record) throws Exception {
if (clazz.isAssignableFrom(record.getClass())) {
if (match == null || match.eval(record)) {
results.add(record);
}
}
}
});

return sorted(results, orderBy);
}

public <E> List<E> find(String searchPhrase) {
final String search = searchPhrase.toLowerCase();

Expand Down

0 comments on commit 777535b

Please sign in to comment.