diff --git a/querydsl-jdoql/doc/TODO.txt b/querydsl-jdoql/doc/TODO.txt index 0d29c35e0..44aeeefb0 100644 --- a/querydsl-jdoql/doc/TODO.txt +++ b/querydsl-jdoql/doc/TODO.txt @@ -1,5 +1,3 @@ -* make sure queries and results are properly closed +* closing results and queries -* make the following things work - - tabular results in projection - - distinct results \ No newline at end of file +* distinct results \ No newline at end of file diff --git a/querydsl-jdoql/src/main/java/com/mysema/query/jdoql/JDOQLQueryImpl.java b/querydsl-jdoql/src/main/java/com/mysema/query/jdoql/JDOQLQueryImpl.java index 165fefefd..9b125afda 100644 --- a/querydsl-jdoql/src/main/java/com/mysema/query/jdoql/JDOQLQueryImpl.java +++ b/querydsl-jdoql/src/main/java/com/mysema/query/jdoql/JDOQLQueryImpl.java @@ -29,47 +29,47 @@ import com.mysema.query.types.path.PEntity; * Default implementation of the JDOQLQuery interface * * @author tiwe - * + * * @param */ class JDOQLQueryImpl extends QueryBaseWithProjection implements Projectable, JDOQLQuery { - + private static final Logger logger = LoggerFactory.getLogger(JDOQLQueryImpl.class); - + private List constants; - + private List> sources = new ArrayList>(); - + private String filter; - + private final JDOQLOps ops; - + private final PersistenceManager pm; - + public JDOQLQueryImpl(PersistenceManager pm) { this(pm, JDOQLOps.DEFAULT); } - + public JDOQLQueryImpl(PersistenceManager pm, JDOQLOps ops) { this.ops = ops; this.pm = pm; } - + @Override protected JDOQLQueryImpl addToProjection(Expr... o) { for (Expr expr : o) { - if (expr instanceof EConstructor){ - EConstructor constructor = (EConstructor)expr; - for (Expr arg : constructor.getArgs()){ + if (expr instanceof EConstructor) { + EConstructor constructor = (EConstructor) expr; + for (Expr arg : constructor.getArgs()) { super.addToProjection(arg); } - }else{ + } else { super.addToProjection(expr); - } + } } return this; } - + @Override public JDOQLQueryImpl from(PEntity... o) { for (PEntity expr : o) { @@ -79,167 +79,167 @@ class JDOQLQueryImpl extends QueryBaseWithProjection imp } private String buildFilterString(boolean forCountRow) { - if (getMetadata().getWhere() == null){ - return null; - } + if (getMetadata().getWhere() == null) { + return null; + } JDOQLSerializer serializer = new JDOQLSerializer(ops, sources.get(0)); - serializer.handle(getMetadata().getWhere()); - constants = serializer.getConstants(); + serializer.handle(getMetadata().getWhere()); + constants = serializer.getConstants(); System.err.println("SERIALIZED : " + serializer.toString()); return serializer.toString(); } - + @Override - protected void clear(){ + protected void clear() { super.clear(); filter = null; } - - public long count(){ - String filterString = getFilterString(); + + public long count() { + String filterString = getFilterString(); logger.debug("query : {}", filterString); Query query = createQuery(filterString, null, true); query.setUnique(true); query.setResult("count(this)"); return (Long) execute(query); } - + private Query createQuery(String filterString, QueryModifiers modifiers, boolean forCount) { - Query query = pm.newQuery(sources.get(0).getType()); - if (filterString != null){ - query.setFilter(filterString); - } - - // variables - if (sources.size() > 1){ - StringBuffer buffer = new StringBuffer(); - for (int i = 1; i < sources.size(); i++){ - if (buffer.length() > 0){ - buffer.append(", "); - } - PEntity source = sources.get(i); - buffer.append(source.getType().getName()).append(" ").append(source.toString()); - } - } - - // explicit parameters - if (constants != null){ - StringBuilder builder = new StringBuilder(); - for (int i=0; i < constants.size(); i++){ - if (builder.length() > 0){ - builder.append(", "); + Query query = pm.newQuery(sources.get(0).getType()); + if (filterString != null) { + query.setFilter(filterString); + } + + // variables + if (sources.size() > 1) { + StringBuffer buffer = new StringBuffer(); + for (int i = 1; i < sources.size(); i++) { + if (buffer.length() > 0) { + buffer.append(", "); + } + PEntity source = sources.get(i); + buffer.append(source.getType().getName()).append(" ").append(source.toString()); + } + } + + // explicit parameters + if (constants != null) { + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < constants.size(); i++) { + if (builder.length() > 0) { + builder.append(", "); } Object val = constants.get(i); - builder.append(val.getClass().getName()).append(" ").append("a"+(i+1)); + builder.append(val.getClass().getName()).append(" ").append("a" + (i + 1)); } - query.declareParameters(builder.toString()); - } - + query.declareParameters(builder.toString()); + } + // range (not for count) - if (modifiers != null && modifiers.isRestricting() && !forCount){ - long fromIncl = 0; - long toExcl = Long.MAX_VALUE; - if (modifiers.getOffset() != null){ - fromIncl = modifiers.getOffset().longValue(); + if (modifiers != null && modifiers.isRestricting() && !forCount) { + long fromIncl = 0; + long toExcl = Long.MAX_VALUE; + if (modifiers.getOffset() != null) { + fromIncl = modifiers.getOffset().longValue(); + } + if (modifiers.getLimit() != null) { + toExcl = fromIncl + modifiers.getLimit().longValue(); } - if (modifiers.getLimit() != null){ - toExcl = fromIncl + modifiers.getLimit().longValue(); - } query.setRange(fromIncl, toExcl); - } - + } + // projection (not for count) - if (!getMetadata().getProjection().isEmpty() && !forCount){ - List> projection = getMetadata().getProjection(); - if (!projection.get(0).equals(sources.get(0))){ - JDOQLSerializer serializer = new JDOQLSerializer(ops, sources.get(0)); - serializer.handle(", ", projection); - query.setResult(serializer.toString()); - } + if (!getMetadata().getProjection().isEmpty() && !forCount) { + List> projection = getMetadata().getProjection(); + if (!projection.get(0).equals(sources.get(0))) { + JDOQLSerializer serializer = new JDOQLSerializer(ops, sources.get(0)); + serializer.handle(", ", projection); + query.setResult(serializer.toString()); + } } - + // order (not for count) - if (!getMetadata().getOrderBy().isEmpty() && !forCount){ - List> order = getMetadata().getOrderBy(); - JDOQLSerializer serializer = new JDOQLSerializer(ops, sources.get(0)); - boolean first = true; - for (OrderSpecifier os : order){ - if (!first){ - serializer.append(", "); - } - serializer.handle(os.getTarget()); - serializer.append(os.getOrder() == Order.ASC ? " ascending" : "descending"); - first = false; - } - query.setOrdering(serializer.toString()); + if (!getMetadata().getOrderBy().isEmpty() && !forCount) { + List> order = getMetadata().getOrderBy(); + JDOQLSerializer serializer = new JDOQLSerializer(ops, sources.get(0)); + boolean first = true; + for (OrderSpecifier os : order) { + if (!first) { + serializer.append(", "); + } + serializer.handle(os.getTarget()); + serializer.append(os.getOrder() == Order.ASC ? " ascending" : "descending"); + first = false; + } + query.setOrdering(serializer.toString()); } - + return query; } - + protected List getConstants() { return constants; } - + public Iterator iterate(Expr e1, Expr e2, Expr... rest) { // TODO : optimize return list(e1, e2, rest).iterator(); } - + public Iterator iterate(Expr projection) { // TODO : optimize return list(projection).iterator(); } - + @SuppressWarnings("unchecked") - public List list(Expr expr1, Expr expr2, Expr...rest){ + public List list(Expr expr1, Expr expr2, Expr... rest) { addToProjection(expr1, expr2); addToProjection(rest); String filterString = getFilterString(); - return (List) execute(createQuery(filterString, getMetadata().getModifiers(), false)); + return (List) execute(createQuery(filterString, getMetadata().getModifiers(), false)); } - - private Object execute(Query query){ - Object rv; - if (constants != null){ - rv = query.executeWithArray(constants.toArray()); - }else{ - rv = query.execute(); - } -// query.closeAll(); - return rv; + + private Object execute(Query query) { + Object rv; + if (constants != null) { + rv = query.executeWithArray(constants.toArray()); + } else { + rv = query.execute(); + } + // query.closeAll(); + return rv; } - + @SuppressWarnings("unchecked") - public List list(Expr expr){ + public List list(Expr expr) { addToProjection(expr); String filterString = getFilterString(); logger.debug("query : {}", filterString); - return (List) execute(createQuery(filterString, getMetadata().getModifiers(), false)); + return (List) execute(createQuery(filterString, getMetadata().getModifiers(), false)); } - - @SuppressWarnings("unchecked") - public SearchResults listResults(Expr expr) { + + @SuppressWarnings("unchecked") + public SearchResults listResults(Expr expr) { addToProjection(expr); Query countQuery = createQuery(getFilterString(), null, true); countQuery.setUnique(true); + countQuery.setResult("count(this)"); long total = (Long) execute(countQuery); if (total > 0) { - QueryModifiers modifiers = getMetadata().getModifiers(); + QueryModifiers modifiers = getMetadata().getModifiers(); String filterString = getFilterString(); logger.debug("query : {}", filterString); - Query query = createQuery(filterString, modifiers,false); - List list = (List) execute(query); - return new SearchResults(list, modifiers, total); + Query query = createQuery(filterString, modifiers, false); + return new SearchResults((List)execute(query), modifiers, total); } else { return SearchResults.emptyResults(); } } - - private String getFilterString(){ - if (filter == null){ - filter = buildFilterString(false); - } + + private String getFilterString() { + if (filter == null) { + filter = buildFilterString(false); + } return filter; } @@ -248,7 +248,7 @@ class JDOQLQueryImpl extends QueryBaseWithProjection imp addToProjection(expr); String filterString = getFilterString(); logger.debug("query : {}", filterString); - Query query = createQuery(filterString, QueryModifiers.limit(1),false); + Query query = createQuery(filterString, QueryModifiers.limit(1), false); query.setUnique(true); return (RT) execute(query); } diff --git a/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/QueryBasicsTest.java b/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/QueryBasicsTest.java index 7f38bf8ef..38f52d8fd 100644 --- a/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/QueryBasicsTest.java +++ b/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/QueryBasicsTest.java @@ -26,7 +26,7 @@ public class QueryBasicsTest extends AbstractJDOTest{ // FIXME assertEquals("count", 2, query().from(product).count()); // returns 1, why? } - + @Test public void projectionTests(){ assertEquals("Sony Discman", query().from(product) diff --git a/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/QueryOrderingTest.java b/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/QueryOrderingTest.java index 06db6930f..3830ee0a9 100644 --- a/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/QueryOrderingTest.java +++ b/querydsl-jdoql/src/test/java/com/mysema/query/jdoql/QueryOrderingTest.java @@ -3,6 +3,7 @@ package com.mysema.query.jdoql; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import java.util.Arrays; import java.util.List; import javax.jdo.PersistenceManager; @@ -12,76 +13,106 @@ import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; +import com.mysema.query.SearchResults; import com.mysema.query.jdoql.testdomain.Product; import com.mysema.query.jdoql.testdomain.QProduct; -public class QueryOrderingTest extends AbstractJDOTest{ - - private QProduct product = QProduct.product; - - @Test - public void testOrderAsc(){ - List namesAsc = query().from(product) - .orderBy(product.name.asc(), product.description.desc()) - .list(product.name); - assertEquals(30, namesAsc.size()); - String prev = null; - for (String name : namesAsc){ - if (prev != null){ - assertTrue(prev.compareTo(name) < 0); - } - prev = name; - } - } - - @Test - public void testOrderDesc(){ - List namesDesc = query().from(product) - .orderBy(product.name.desc()) - .list(product.name); - assertEquals(30, namesDesc.size()); - String prev = null; - for (String name : namesDesc){ - if (prev != null){ - assertTrue(prev.compareTo(name) > 0); - } - prev = name; - } - } - - @Test - @Ignore - public void searchResults(){ - // TODO - } - - @Test - @Ignore - public void testDistinct(){ - // TODO - } - - @BeforeClass - public static void doPersist() { - // Persistence of a Product and a Book. - PersistenceManager pm = pmf.getPersistenceManager(); - Transaction tx = pm.currentTransaction(); - try { - tx.begin(); - for (int i=0; i < 10; i++){ - pm.makePersistent(new Product("C"+i,"F"+i, 200.00)); - pm.makePersistent(new Product("B"+i,"E"+i, 200.00)); - pm.makePersistent(new Product("A"+i,"D"+i, 200.00)); - } - tx.commit(); - } finally { - if (tx.isActive()) { - tx.rollback(); - } - pm.close(); - } - System.out.println(""); +public class QueryOrderingTest extends AbstractJDOTest { - } + private QProduct product = QProduct.product; + + @Test + public void testOrderAsc() { + List namesAsc = query().from(product).orderBy( + product.name.asc(), product.description.desc()).list( + product.name); + assertEquals(30, namesAsc.size()); + String prev = null; + for (String name : namesAsc) { + if (prev != null) { + assertTrue(prev.compareTo(name) < 0); + } + prev = name; + } + } + + @Test + public void testOrderDesc() { + List namesDesc = query().from(product).orderBy( + product.name.desc()).list(product.name); + assertEquals(30, namesDesc.size()); + String prev = null; + for (String name : namesDesc) { + if (prev != null) { + assertTrue(prev.compareTo(name) > 0); + } + prev = name; + } + } + + @Test + public void testTabularResults() { + List rows = query().from(product).orderBy(product.name.asc()) + .list(product.name, product.description); + assertEquals(30, rows.size()); + for (Object[] row : rows) { + assertEquals(row[0].toString().substring(1), row[1].toString() + .substring(1)); + } + } + + @Test + public void paging(){ + assertEquals( + Arrays.asList("A0", "A1"), + query().from(product).orderBy(product.name.asc()).limit(2).list(product.name)); + assertEquals( + Arrays.asList("A2", "A3", "A4"), + query().from(product).orderBy(product.name.asc()).offset(2).limit(3).list(product.name)); + assertEquals( + Arrays.asList("C9", "C8"), + query().from(product).orderBy(product.name.desc()).limit(2).list(product.name)); + } + + @Test + public void searchResults() { + SearchResults results = query() + .from(product) + .orderBy(product.name.asc()) + .limit(2) + .listResults(product.name); + assertEquals(Arrays.asList("A0","A1"), results.getResults()); + assertEquals(30, results.getTotal()); + + } + + @Test + @Ignore + public void testDistinct() { + // TODO + } + + @BeforeClass + public static void doPersist() { + // Persistence of a Product and a Book. + PersistenceManager pm = pmf.getPersistenceManager(); + Transaction tx = pm.currentTransaction(); + try { + tx.begin(); + for (int i = 0; i < 10; i++) { + pm.makePersistent(new Product("C" + i, "F" + i, 200.00)); + pm.makePersistent(new Product("B" + i, "E" + i, 200.00)); + pm.makePersistent(new Product("A" + i, "D" + i, 200.00)); + } + tx.commit(); + } finally { + if (tx.isActive()) { + tx.rollback(); + } + pm.close(); + } + System.out.println(""); + + } }