OPENJPA-551 Support Range Query

git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@627645 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Pinaki Poddar 2008-02-14 03:27:26 +00:00
parent 763fd3e5a3
commit 68f25ced84
2 changed files with 32 additions and 6 deletions

View File

@ -34,6 +34,7 @@ import org.apache.openjpa.kernel.QueryContext;
import org.apache.openjpa.kernel.StoreQuery;
import org.apache.openjpa.kernel.exps.ExpressionParser;
import org.apache.openjpa.lib.rop.MergedResultObjectProvider;
import org.apache.openjpa.lib.rop.RangeResultObjectProvider;
import org.apache.openjpa.lib.rop.ResultObjectProvider;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.util.StoreException;
@ -135,16 +136,23 @@ class DistributedStoreQuery extends JDBCStoreQuery {
boolean[] ascending = getAscending(q);
boolean isAscending = ascending.length > 0;
boolean isUnique = q.getContext().isUnique();
boolean hasRange = q.getContext().getEndRange() != Long.MAX_VALUE;
ResultObjectProvider result = null;
if (isUnique) {
return new UniqueResultObjectProvider(tmp, q,
result = new UniqueResultObjectProvider(tmp, q,
getQueryExpressions());
}
if (isAscending) {
return new OrderingMergedResultObjectProvider(tmp, ascending,
} else if (isAscending) {
result = new OrderingMergedResultObjectProvider(tmp, ascending,
(Executor[])executors.toArray(new Executor[executors.size()]),
q, params);
} else {
result = new MergedResultObjectProvider(tmp);
}
return new MergedResultObjectProvider(tmp);
if (hasRange)
result = new RangeResultObjectProvider(result,
q.getContext().getStartRange(),
q.getContext().getEndRange());
return result;
}
public Number executeDelete(StoreQuery q, Object[] params) {

View File

@ -31,7 +31,7 @@ public class TestQuery extends SliceTestCase {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
long id = System.currentTimeMillis();
for (int i=0;i<0;i++) {
for (int i=0;i<10;i++) {
PObject pc = new PObject(id++);
pc.setValue(i);
em.persist(pc);
@ -65,6 +65,24 @@ public class TestQuery extends SliceTestCase {
for (Object r:result)
System.err.println(r);
}
public void testSetMaxResult() {
EntityManager em = emf.createEntityManager();
int limit = 3;
em.getTransaction().begin();
List result = em.createQuery("SELECT p.value,p FROM PObject p ORDER BY p.value ASC")
.setMaxResults(limit).getResultList();
int i = 0;
for (Object row:result) {
Object[] line = (Object[])row;
int value = ((Integer)line[0]).intValue();
PObject pc = (PObject)line[1];
System.err.println(++i + "." + SlicePersistence.getSlice(pc) + ":" + pc.getId() + "," + pc.getValue());
}
em.getTransaction().rollback();
assertEquals(limit, result.size());
}
protected String getPersistenceUnitName() {
return "ordering";
}