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% * #L%
*/ */


import java.util.Comparator;

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


public static <T> Items all(Class<T> type) { 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) { 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) { public static Item item(Object value) {
return Models.item(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); return Models.beanItems(beanType, beans);
} }


public static <T> GridWidget grid(Class<T> type, String sortOrder, int pageSize, String... properties) { public static <T> GridWidget grid(Class<T> type, String sortOrder, int pageSize, String... properties) {
return grid(all(type, sortOrder), sortOrder, pageSize, 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) { public static FormWidget show(Object bean, String... properties) {
return show(Models.item(bean), 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.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Collection; import java.util.Collection;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;


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


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

@Override @Override
public <E> List<E> getAll(long... ids) { public <E> List<E> getAll(long... ids) {
return inmem.getAll(ids); return inmem.getAll(ids);
Expand All @@ -123,6 +119,11 @@ public <E> List<E> find(Predicate<E> match) {
return inmem.find(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 @Override
public <E> List<E> find(String searchPhrase) { public <E> List<E> find(String searchPhrase) {
return inmem.find(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.io.File;
import java.util.Collection; import java.util.Collection;
import java.util.Comparator;
import java.util.List; import java.util.List;


import org.rapidoid.lambda.Callback; 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); 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) { public static <E> List<E> getAll(long... ids) {
return db().getAll(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); 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) { public static <E> List<E> find(String searchPhrase) {
return db().find(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.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Collection; import java.util.Collection;
import java.util.Comparator;
import java.util.List; import java.util.List;


import org.rapidoid.activity.Activity; 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);


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

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


<E> List<E> getAll(Collection<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(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(String searchPhrase);


<E> List<E> find(Class<E> clazz, String query, Object... args); <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% * #L%
*/ */


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


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


@SuppressWarnings("serial") @SuppressWarnings("serial")
public class DbItems<T> extends BeanListItems<T> { 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); super(type);
this.match = match;
this.orderBy = orderBy; this.orderBy = orderBy;
} }


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


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


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


@Override @Override
public Items orderedBy(String sortOrder) { 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% * #L%
*/ */


import java.util.Comparator;

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


@LoggedIn @LoggedIn
public class MyTasksScreen extends Screen { public class MyTasksScreen extends Screen {


public Object content() { public Object content(final HttpExchange x) {
Tag c1 = titleBox("Tasks owned by me"); 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"); 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)); 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) { protected <E> List<E> sorted(List<E> records, Comparator<E> orderBy) {
List<E> results = getAll(clazz); if (orderBy != null) {

Collections.sort(records, orderBy);
final int sign = orderBy.startsWith("-") ? -1 : 1; }
final String order = sign == 1 ? orderBy : orderBy.substring(1); return records;

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;
} }


@SuppressWarnings("unchecked") @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>(); final List<E> results = new ArrayList<E>();


each(new Operation<E>() { each(new Operation<E>() {

@Override @Override
public void execute(E record) throws Exception { public void execute(E record) throws Exception {
if (match.eval(record)) { if (match.eval(record)) {
Expand All @@ -572,6 +552,23 @@ public void execute(E record) throws Exception {
return results; 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) { public <E> List<E> find(String searchPhrase) {
final String search = searchPhrase.toLowerCase(); final String search = searchPhrase.toLowerCase();


Expand Down

0 comments on commit 777535b

Please sign in to comment.