From 99c422d2cfc31dfdf44791bed5190b6dc7db9ce4 Mon Sep 17 00:00:00 2001 From: Samppa Saarela Date: Wed, 14 Sep 2011 15:07:11 +0300 Subject: [PATCH] Added getRow(int) to Group --- .../java/com/mysema/query/support/Group.java | 10 +++ .../com/mysema/query/support/GroupBy.java | 31 ++++++++++ .../com/mysema/query/support/GroupByTest.java | 61 ++++++++++++++++--- 3 files changed, 93 insertions(+), 9 deletions(-) diff --git a/querydsl-core/src/main/java/com/mysema/query/support/Group.java b/querydsl-core/src/main/java/com/mysema/query/support/Group.java index a001fbad6..7388cb095 100644 --- a/querydsl-core/src/main/java/com/mysema/query/support/Group.java +++ b/querydsl-core/src/main/java/com/mysema/query/support/Group.java @@ -9,6 +9,7 @@ import java.util.List; import javax.annotation.Nullable; +import com.mysema.query.Tuple; import com.mysema.query.types.Expression; /** @@ -61,6 +62,15 @@ public interface Group { @Nullable List getList(Expression expr); + /** + * Returns the i'th row of this group. + * + * @param i 0 <= i < size() + * @throws IndexOutOfBoundsException if i < 0 or size() <= i + * @return i'th row as a tuple of this group + */ + Tuple getRow(int i); + int size(); } diff --git a/querydsl-core/src/main/java/com/mysema/query/support/GroupBy.java b/querydsl-core/src/main/java/com/mysema/query/support/GroupBy.java index 4f1a467f4..f77244080 100644 --- a/querydsl-core/src/main/java/com/mysema/query/support/GroupBy.java +++ b/querydsl-core/src/main/java/com/mysema/query/support/GroupBy.java @@ -13,6 +13,7 @@ import java.util.List; import com.mysema.commons.lang.CloseableIterator; import com.mysema.query.Projectable; import com.mysema.query.ResultTransformer; +import com.mysema.query.Tuple; import com.mysema.query.types.Expression; /** @@ -114,10 +115,40 @@ public class GroupBy implements ResultTransformer> { } } + @Override + public Tuple getRow(int i) { + return new TupleImpl(values.get(i)); + } + @Override public int size() { return values.size(); } } + + @SuppressWarnings("unchecked") + private class TupleImpl implements Tuple { + + final Object[] row; + + public TupleImpl(Object[] row) { + this.row = row; + } + @Override + public T get(int index, Class type) { + return (T) row[index]; + } + @Override + public T get(Expression expr) { + int index = indexOf(expr); + return index != -1 ? (T) row[index] : null; + } + + @Override + public Object[] toArray() { + return row; + } + } + } diff --git a/querydsl-core/src/test/java/com/mysema/query/support/GroupByTest.java b/querydsl-core/src/test/java/com/mysema/query/support/GroupByTest.java index 5e2e48fac..5ae815e4d 100644 --- a/querydsl-core/src/test/java/com/mysema/query/support/GroupByTest.java +++ b/querydsl-core/src/test/java/com/mysema/query/support/GroupByTest.java @@ -11,7 +11,9 @@ import java.util.List; import org.junit.Test; import com.mysema.commons.lang.CloseableIterator; +import com.mysema.commons.lang.EmptyCloseableIterator; import com.mysema.commons.lang.IteratorAdapter; +import com.mysema.query.Tuple; import com.mysema.query.types.Expression; import com.mysema.query.types.expr.NumberExpression; import com.mysema.query.types.expr.StringExpression; @@ -20,12 +22,23 @@ import com.mysema.query.types.path.StringPath; public class GroupByTest { - private final NumberExpression postId = new NumberPath(Integer.class, null, "postId"); + private final NumberExpression postId = new NumberPath(Integer.class, null, "postId"); private final StringExpression postName = new StringPath(null, "postName"); - private final NumberExpression commentId = new NumberPath(Integer.class, null, "commentId"); + private final NumberExpression commentId = new NumberPath(Integer.class, null, "commentId"); + @Test + public void Expression_Order() { + new GroupBy(postId, postName, commentId).transform(new AbstractProjectable(){ + public CloseableIterator iterate(Expression[] args) { + assertEquals(postId, args[0]); + assertEquals(postName, args[1]); + assertEquals(commentId, args[2]); + return new EmptyCloseableIterator(); + } + }); + } /** *
    *
  1. Order of groups by first row of a group @@ -34,13 +47,9 @@ public class GroupByTest { *
*/ @Test - public void Group_By() { + public void Multiple_Groups() { Collection results = new GroupBy(postId, postName, commentId).transform(new AbstractProjectable(){ public CloseableIterator iterate(Expression[] args) { - assertEquals(postId, args[0]); - assertEquals(postName, args[1]); - assertEquals(commentId, args[2]); - return iterator( row(1, "post 1", 1), row(2, "post 2", 4), @@ -90,6 +99,40 @@ public class GroupByTest { assertEquals(toInt(8), comments.get(1)); } + @Test + public void Get_Row() { + Collection results = new GroupBy(postId, postName, commentId).transform(new AbstractProjectable(){ + public CloseableIterator iterate(Expression[] args) { + return iterator( + row(1, "post 1", 1), + row(null, "null post", 2) + ); + } + }); + assertEquals(2, results.size()); + Iterator iter = results.iterator(); + + Group group = iter.next(); + Tuple row = group.getRow(0); + assertEquals(toInt(1), row.get(postId)); + assertEquals("post 1", row.get(postName)); + assertEquals(toInt(1), row.get(commentId)); + + group = iter.next(); + row = group.getRow(0); + assertEquals(null, row.get(postId)); + } + + @Test(expected=IndexOutOfBoundsException.class) + public void Row_Out_of_Bounds() { + Collection results = new GroupBy(postId, postName, commentId).transform(new AbstractProjectable(){ + public CloseableIterator iterate(Expression[] args) { + return iterator(row(1, "post 1", 1)); + } + }); + results.iterator().next().getRow(1); + } + private Integer toInt(int i) { return Integer.valueOf(i); } @@ -98,7 +141,7 @@ public class GroupByTest { return row; } - private static CloseableIterator iterator(Object[]... rows) { - return new IteratorAdapter(Arrays.asList(rows).iterator()); + private static CloseableIterator iterator(Object[]... rows) { + return new IteratorAdapter(Arrays.asList(rows).iterator()); } }