diff --git a/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2.java b/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2.java index f9b5ec34f..903d4787e 100644 --- a/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2.java +++ b/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2.java @@ -10,7 +10,6 @@ import java.util.Arrays; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -140,8 +139,11 @@ public class GroupBy2 implements ResultTransformer> { public static class GMap extends AbstractGroupColumnDefinition, Map>{ + public GMap(QPair qpair) { + super(qpair); + } public GMap(Expression key, Expression value) { - super(new QPair(key, value)); + this(new QPair(key, value)); } @Override @@ -247,26 +249,28 @@ public class GroupBy2 implements ResultTransformer> { } } - private final List> columns = new ArrayList>(); - + private final List> columnDefinitions = new ArrayList>(); + + private final List> pairs = new ArrayList>(); + public static GroupBy2 groupBy(Expression expr) { return new GroupBy2(expr); } public GroupBy2(Expression groupBy) { - columns.add(new GOne(groupBy)); + withGroup(new GOne(groupBy)); } public GroupBy2(Expression groupBy, GroupColumnDefinition group, GroupColumnDefinition... groups) { this(groupBy); - columns.add(group); + withGroup(group); for (GroupColumnDefinition g : groups) { - columns.add(g); + withGroup(g); } } public GroupBy2 withGroup(GroupColumnDefinition g) { - columns.add(g); + columnDefinitions.add(g); return this; } @@ -283,31 +287,57 @@ public class GroupBy2 implements ResultTransformer> { } public GroupBy2 withMap(Expression key, Expression value) { - return withGroup(new GMap(key, value)); + QPair qpair = new QPair(key, value); + pairs.add(qpair); + return withGroup(new GMap(qpair)); + } + + @Override + public Map transform(Projectable projectable) { + final Map groups = new LinkedHashMap(); + + CloseableIterator iter = projectable.iterate(getExpressions()); + try { + while (iter.hasNext()) { + Object[] row = iter.next(); + S groupId = (S) row[0]; + GroupImpl group = (GroupImpl) groups.get(groupId); + if (group == null) { + group = new GroupImpl(); + groups.put(groupId, group); + } + group.add(row); + } + } finally { + iter.close(); + } + return groups; + } + + private Expression[] getExpressions() { + Expression[] unwrapped = new Expression[columnDefinitions.size()]; + for (int i=0; i < columnDefinitions.size(); i++) { + unwrapped[i] = columnDefinitions.get(i).getExpression(); + } + return unwrapped; } private class GroupImpl implements Group2 { - private final Map, GroupColumn> groupColumns = new LinkedHashMap, GroupColumn>(); - - private final List> pairs = new LinkedList>(); + private final Map, GroupColumn> groupColumns = new LinkedHashMap, GroupBy2.GroupColumn>(); public GroupImpl() { - for (int i=0; i < columns.size(); i++) { - GroupColumnDefinition coldef = columns.get(i); + for (int i=0; i < columnDefinitions.size(); i++) { + GroupColumnDefinition coldef = columnDefinitions.get(i); Expression expr = coldef.getExpression(); groupColumns.put(expr, coldef.createGroupColumn()); - // Optimized map access - if (expr instanceof QPair) { - pairs.add((QPair) expr); - } } } @Override public R getGroup(GroupColumnDefinition definition) { Iterator> iter = groupColumns.values().iterator(); - for (GroupColumnDefinition def : columns) { + for (GroupColumnDefinition def : columnDefinitions) { GroupColumn groupColumn = iter.next(); if (def.equals(definition)) { return (R) groupColumn.get(); @@ -358,35 +388,5 @@ public class GroupBy2 implements ResultTransformer> { } } - - @Override - public Map transform(Projectable projectable) { - final Map groups = new LinkedHashMap(); - - CloseableIterator iter = projectable.iterate(getExpressions()); - try { - while (iter.hasNext()) { - Object[] row = iter.next(); - S groupId = (S) row[0]; - GroupImpl group = (GroupImpl) groups.get(groupId); - if (group == null) { - group = new GroupImpl(); - groups.put(groupId, group); - } - group.add(row); - } - } finally { - iter.close(); - } - return groups; - } - - private Expression[] getExpressions() { - Expression[] unwrapped = new Expression[columns.size()]; - for (int i=0; i < columns.size(); i++) { - unwrapped[i] = columns.get(i).getExpression(); - } - return unwrapped; - } } diff --git a/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2Test.java b/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2Test.java index 3c36121e6..a8219fc74 100644 --- a/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2Test.java +++ b/querydsl-core/src/test/java/com/mysema/query/support/GroupBy2Test.java @@ -129,6 +129,19 @@ public class GroupBy2Test { assertEquals("comment 2", comments.get(2)); } + @Test + public void Array_Access() { + Map results = + GroupBy2.groupBy(postId).withOne(postName).withSet(commentId).withList(commentText).transform(BASIC_RESULTS); + + Group2 group = results.get(1); + Object[] array = group.toArray(); + assertEquals(toInt(1), array[0]); + assertEquals("post 1", array[1]); + assertEquals(toSet(1, 2, 3), array[2]); + assertEquals(Arrays.asList("comment 1", "comment 2", "comment 3"), array[3]); + } + private static Projectable projectable(final Object[]... rows) { return new AbstractProjectable(){ public CloseableIterator iterate(Expression[] args) {