Skip to content

Commit

Permalink
JPA paging support.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Apr 29, 2016
1 parent dc28809 commit c03dd08
Show file tree
Hide file tree
Showing 13 changed files with 144 additions and 42 deletions.
5 changes: 5 additions & 0 deletions assets/rapidoid/rapidoid-extras.css
Expand Up @@ -363,6 +363,11 @@ div.rapidoid-card h6.rapidoid-card-caption {
margin: 0px; margin: 0px;
} }


/***** Pagination *****/
ul.pagination {
margin: 0px !important;
}

/***** Card widget *****/ /***** Card widget *****/
.bg-squares { .bg-squares {
background-image: background-image:
Expand Down
2 changes: 2 additions & 0 deletions rapidoid-commons/src/main/resources/rapidoid-classes.txt
Expand Up @@ -394,6 +394,8 @@ org.rapidoid.jpa.DAO
org.rapidoid.jpa.EM org.rapidoid.jpa.EM
org.rapidoid.jpa.EMFUtil org.rapidoid.jpa.EMFUtil
org.rapidoid.jpa.JPA org.rapidoid.jpa.JPA
org.rapidoid.jpa.JpaPage
org.rapidoid.jpa.JpaPageImpl
org.rapidoid.jpa.JPAPersisterProvider org.rapidoid.jpa.JPAPersisterProvider
org.rapidoid.jpa.JPAUtil org.rapidoid.jpa.JPAUtil
org.rapidoid.jpa.SharedContextAwareEntityManagerProxy org.rapidoid.jpa.SharedContextAwareEntityManagerProxy
Expand Down
4 changes: 4 additions & 0 deletions rapidoid-essentials/src/main/java/org/rapidoid/u/U.java
Expand Up @@ -525,6 +525,10 @@ public static int bounds(int min, int value, int max) {
return Math.min(Math.max(min, value), max); return Math.min(Math.max(min, value), max);
} }


public static long bounds(long min, long value, long max) {
return Math.min(Math.max(min, value), max);
}

public static <T> T single(Iterable<T> coll) { public static <T> T single(Iterable<T> coll) {
Iterator<T> it = coll.iterator(); Iterator<T> it = coll.iterator();
must(it.hasNext(), "Expected exactly 1 item, but didn't find any!"); must(it.hasNext(), "Expected exactly 1 item, but didn't find any!");
Expand Down
30 changes: 15 additions & 15 deletions rapidoid-gui/src/main/java/org/rapidoid/gui/Pager.java
Expand Up @@ -37,10 +37,10 @@ public class Pager extends AbstractWidget<Pager> {


private final String param; private final String param;


private volatile int min; private volatile long min;
private volatile int max; private volatile long max;
private volatile boolean right; private volatile boolean right;
private volatile Integer initial; private volatile Long initial;


public Pager(String param) { public Pager(String param) {
this.param = param; this.param = param;
Expand All @@ -51,7 +51,7 @@ protected Tag render() {
return shouldDisplay() ? pagination() : div(); return shouldDisplay() ? pagination() : div();
} }


protected String pageUri(int pageN) { protected String pageUri(long pageN) {
IReqInfo req = req(); IReqInfo req = req();


Map<String, String> query = U.map(req.params()); Map<String, String> query = U.map(req.params());
Expand All @@ -65,7 +65,7 @@ protected boolean shouldDisplay() {
} }


protected Tag pagination() { protected Tag pagination() {
int pageN = pageNumber(); long pageN = pageNumber();


ATag first = first().href(pageUri(min)); ATag first = first().href(pageUri(min));
ATag prev = prev().href(pageUri(pageN - 1)); ATag prev = prev().href(pageUri(pageN - 1));
Expand All @@ -82,15 +82,15 @@ protected Tag pagination() {
Tag pagination = GUI.nav(GUI.ul_li(firstLi, prevLi, currentLi, nextLi, lastLi).class_("pagination")); Tag pagination = GUI.nav(GUI.ul_li(firstLi, prevLi, currentLi, nextLi, lastLi).class_("pagination"));


if (right) { if (right) {
pagination = div(pagination).class_("pull-right"); pagination = GUI.right(pagination);
} }


return pagination; return pagination;
} }


protected int pageNumber() { protected long pageNumber() {
Integer pageNum = Cls.convert(req().params().get(param), Integer.class); Long pageNum = Cls.convert(req().params().get(param), Long.class);
int value = U.or(pageNum, initial, min, 1); long value = U.or(pageNum, initial, min, 1L);
return U.bounds(min, value, max); return U.bounds(min, value, max);
} }


Expand Down Expand Up @@ -122,20 +122,20 @@ public String param() {
return param; return param;
} }


public int min() { public long min() {
return min; return min;
} }


public Pager min(int min) { public Pager min(long min) {
this.min = min; this.min = min;
return this; return this;
} }


public int max() { public long max() {
return max; return max;
} }


public Pager max(int max) { public Pager max(long max) {
this.max = max; this.max = max;
return this; return this;
} }
Expand All @@ -149,11 +149,11 @@ public Pager right(boolean right) {
return this; return this;
} }


public Integer initial() { public Long initial() {
return initial; return initial;
} }


public Pager initial(Integer initial) { public Pager initial(long initial) {
this.initial = initial; this.initial = initial;
return this; return this;
} }
Expand Down
@@ -1,4 +1,4 @@
<div class="pull-right"> <span class="pull-right">
<nav> <nav>
<ul class="pagination"> <ul class="pagination">
<li class="disabled"> <li class="disabled">
Expand Down Expand Up @@ -30,4 +30,4 @@
</li> </li>
</ul> </ul>
</nav> </nav>
</div> </span>
Expand Up @@ -1385,6 +1385,11 @@ div.rapidoid-card h6.rapidoid-card-caption {
margin: 0px; margin: 0px;
} }


/***** Pagination *****/
ul.pagination {
margin: 0px !important;
}

/***** Card widget *****/ /***** Card widget *****/
.bg-squares { .bg-squares {
background-image: background-image:
Expand Down
Expand Up @@ -58,7 +58,7 @@ public void testBasicCRUD() {
List<Movie> movies = JPA.getAll(Movie.class); List<Movie> movies = JPA.getAll(Movie.class);
eq(Do.map(movies).to(Movie::getTitle), U.list("movie 1")); eq(Do.map(movies).to(Movie::getTitle), U.list("movie 1"));


eq(JPA.jpql("select title from Book where id = ?1", 2L), U.list("book 2")); eq(JPA.jpql("select title from Book where id = ?1", JpaPage.ALL, 2L), U.list("book 2"));
})); }));


eq(Jobs.errorCounter().get(), 0); eq(Jobs.errorCounter().get(), 0);
Expand Down
33 changes: 22 additions & 11 deletions rapidoid-jpa/src/main/java/org/rapidoid/jpa/EM.java
Expand Up @@ -6,10 +6,7 @@
import org.rapidoid.cls.Cls; import org.rapidoid.cls.Cls;
import org.rapidoid.u.U; import org.rapidoid.u.U;


import javax.persistence.EntityManager; import javax.persistence.*;
import javax.persistence.EntityTransaction;
import javax.persistence.Parameter;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.metamodel.EntityType; import javax.persistence.metamodel.EntityType;
Expand Down Expand Up @@ -133,20 +130,34 @@ public <E> List<E> getAll() {
List<E> all = U.list(); List<E> all = U.list();


for (EntityType<?> entityType : getEntityTypes()) { for (EntityType<?> entityType : getEntityTypes()) {
List<E> entities = (List<E>) getAll(entityType.getJavaType()); List<E> entities = (List<E>) getAll(entityType.getJavaType(), JpaPage.ALL);
all.addAll(entities); all.addAll(entities);
} }


return all; return all;
} }


public <T> List<T> getAll(Class<T> clazz) { public <T> List<T> getAll(Class<T> clazz, JpaPage page) {
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaBuilder cb = em.getCriteriaBuilder();


CriteriaQuery<T> query = cb.createQuery(clazz); CriteriaQuery<T> query = cb.createQuery(clazz);
CriteriaQuery<T> all = query.select(query.from(clazz)); CriteriaQuery<T> all = query.select(query.from(clazz));


return em.createQuery(all).getResultList(); return find(all, page);
}

public <T> List<T> find(CriteriaQuery<T> criteria, JpaPage page) {
TypedQuery<T> q = em.createQuery(criteria);
return find(q, page);
}

public <T> List<T> find(Query query, JpaPage page) {
if (page != null) {
query.setFirstResult(page.from());
query.setMaxResults(page.to() - page.from());
}

return query.getResultList();
} }


public long count(Class<?> clazz) { public long count(Class<?> clazz) {
Expand Down Expand Up @@ -248,11 +259,11 @@ public Object getIdentifier(Object entity) {
return em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(entity); return em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(entity);
} }


public <T> List<T> jpql(String jpql, Object... args) { public <T> List<T> jpql(String jpql, JpaPage page, Object... args) {
return jpql(jpql, null, args); return jpql(jpql, page, null, args);
} }


public <T> List<T> jpql(String jpql, Map<String, ?> namedArgs, Object... args) { public <T> List<T> jpql(String jpql, JpaPage page, Map<String, ?> namedArgs, Object... args) {
Query q = JPA.em().createQuery(jpql); Query q = JPA.em().createQuery(jpql);


for (int i = 0; i < args.length; i++) { for (int i = 0; i < args.length; i++) {
Expand All @@ -266,7 +277,7 @@ public <T> List<T> jpql(String jpql, Map<String, ?> namedArgs, Object... args) {
} }
} }


return q.getResultList(); return find(q, page);
} }


} }
28 changes: 23 additions & 5 deletions rapidoid-jpa/src/main/java/org/rapidoid/jpa/JPA.java
Expand Up @@ -8,6 +8,7 @@


import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory; import javax.persistence.EntityManagerFactory;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.metamodel.EntityType; import javax.persistence.metamodel.EntityType;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
Expand Down Expand Up @@ -69,7 +70,19 @@ public static <E> List<E> getAll(Class<E> clazz, List<String> ids) {
} }


public static <T> List<T> getAll(Class<T> clazz) { public static <T> List<T> getAll(Class<T> clazz) {
return with(em()).getAll(clazz); return with(em()).getAll(clazz, JpaPage.ALL);
}

public static <T> List<T> getAll(Class<T> clazz, JpaPage page) {
return with(em()).getAll(clazz, page);
}

public static <T> List<T> find(CriteriaQuery<T> criteria) {
return with(em()).find(criteria, null);
}

public static <T> List<T> find(CriteriaQuery<T> criteria, JpaPage page) {
return with(em()).find(criteria, page);
} }


public static long count(Class<?> clazz) { public static long count(Class<?> clazz) {
Expand Down Expand Up @@ -155,12 +168,12 @@ public static Object getIdentifier(Object entity) {
return with(em()).getIdentifier(entity); return with(em()).getIdentifier(entity);
} }


public static <T> List<T> jpql(String jpql, Object... args) { public static <T> List<T> jpql(String jpql, JpaPage page, Object... args) {
return with(em()).jpql(jpql, args); return with(em()).jpql(jpql, page, args);
} }


public static <T> List<T> jpql(String jpql, Map<String, ?> namedArgs, Object... args) { public static <T> List<T> jpql(String jpql, JpaPage page, Map<String, ?> namedArgs, Object... args) {
return with(em()).jpql(jpql, namedArgs, args); return with(em()).jpql(jpql, page, namedArgs, args);
} }


public static boolean isEntity(Object obj) { public static boolean isEntity(Object obj) {
Expand Down Expand Up @@ -194,4 +207,9 @@ public static <T> T unproxy(T entity) {
public static boolean isActive() { public static boolean isActive() {
return JPAUtil.emf() != null; return JPAUtil.emf() != null;
} }

public static JpaPage page(int from, int to) {
return JPAUtil.page(from, to);
}

} }
3 changes: 3 additions & 0 deletions rapidoid-jpa/src/main/java/org/rapidoid/jpa/JPAUtil.java
Expand Up @@ -142,4 +142,7 @@ public static EntityManagerFactory emf() {
return emf; return emf;
} }


public static JpaPage page(int from, int to) {
return new JpaPageImpl(from, to);
}
} }
16 changes: 16 additions & 0 deletions rapidoid-jpa/src/main/java/org/rapidoid/jpa/JpaPage.java
@@ -0,0 +1,16 @@
package org.rapidoid.jpa;

import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since;

@Authors("Nikolche Mihajlovski")
@Since("5.1.0")
public interface JpaPage {

JpaPage ALL = null;

int from();

int to();

}
29 changes: 29 additions & 0 deletions rapidoid-jpa/src/main/java/org/rapidoid/jpa/JpaPageImpl.java
@@ -0,0 +1,29 @@
package org.rapidoid.jpa;

import org.rapidoid.RapidoidThing;
import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since;

@Authors("Nikolche Mihajlovski")
@Since("5.1.0")
public class JpaPageImpl extends RapidoidThing implements JpaPage {

private final int from;
private final int to;

public JpaPageImpl(int from, int to) {
this.from = from;
this.to = to;
}

@Override
public int from() {
return from;
}

@Override
public int to() {
return to;
}

}

0 comments on commit c03dd08

Please sign in to comment.