Skip to content

Commit 7ccfbfc

Browse files
Delete dependency on elements order from list transformation (#516)
Co-authored-by: kholysz <[email protected]>
1 parent 02a3818 commit 7ccfbfc

File tree

2 files changed

+36
-42
lines changed

2 files changed

+36
-42
lines changed

querydsl-core/src/main/java/com/querydsl/core/group/GroupByList.java

Lines changed: 18 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,12 @@
1313
*/
1414
package com.querydsl.core.group;
1515

16-
import com.mysema.commons.lang.CloseableIterator;
1716
import com.querydsl.core.FetchableQuery;
18-
import com.querydsl.core.Tuple;
1917
import com.querydsl.core.types.Expression;
20-
import com.querydsl.core.types.FactoryExpression;
21-
import com.querydsl.core.types.FactoryExpressionUtils;
22-
import com.querydsl.core.types.Projections;
2318
import java.util.ArrayList;
19+
import java.util.LinkedHashMap;
2420
import java.util.List;
25-
import java.util.Objects;
21+
import java.util.Map;
2622

2723
/**
2824
* Provides aggregated results as a list
@@ -33,44 +29,28 @@
3329
*/
3430
public class GroupByList<K, V> extends AbstractGroupByTransformer<K, List<V>> {
3531

32+
private final GroupByMap<K, V> mapTransformer;
33+
3634
GroupByList(Expression<K> key, Expression<?>... expressions) {
3735
super(key, expressions);
36+
mapTransformer =
37+
new GroupByMap<K, V>(key, expressions) {
38+
@Override
39+
protected Map<K, V> transform(Map<K, Group> groups) {
40+
Map<K, V> results =
41+
new LinkedHashMap<K, V>((int) Math.ceil(groups.size() / 0.75), 0.75f);
42+
for (Map.Entry<K, Group> entry : groups.entrySet()) {
43+
results.put(entry.getKey(), GroupByList.this.transform(entry.getValue()));
44+
}
45+
return results;
46+
}
47+
};
3848
}
3949

4050
@Override
4151
public List<V> transform(FetchableQuery<?, ?> query) {
42-
// create groups
43-
FactoryExpression<Tuple> expr = FactoryExpressionUtils.wrap(Projections.tuple(expressions));
44-
boolean hasGroups = false;
45-
for (Expression<?> e : expr.getArgs()) {
46-
hasGroups |= e instanceof GroupExpression;
47-
}
48-
if (hasGroups) {
49-
expr = withoutGroupExpressions(expr);
50-
}
51-
final CloseableIterator<Tuple> iter = query.select(expr).iterate();
52-
53-
List<V> list = new ArrayList<>();
54-
GroupImpl group = null;
55-
K groupId = null;
56-
while (iter.hasNext()) {
57-
@SuppressWarnings("unchecked") // This type is mandated by the key type
58-
K[] row = (K[]) iter.next().toArray();
59-
if (group == null) {
60-
group = new GroupImpl(groupExpressions, maps);
61-
groupId = row[0];
62-
} else if (!Objects.equals(groupId, row[0])) {
63-
list.add(transform(group));
64-
group = new GroupImpl(groupExpressions, maps);
65-
groupId = row[0];
66-
}
67-
group.add(row);
68-
}
69-
if (group != null) {
70-
list.add(transform(group));
71-
}
72-
iter.close();
73-
return list;
52+
Map<K, V> result = mapTransformer.transform(query);
53+
return new ArrayList<V>(result.values());
7454
}
7555

7656
@SuppressWarnings("unchecked")

querydsl-core/src/test/java/com/querydsl/core/group/GroupByListTest.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,21 +122,35 @@ public void map3() {
122122
Object[] array = tuple.toArray();
123123

124124
if (posts == null || !(postId == array[0] || postId != null && postId.equals(array[0]))) {
125-
posts = new LinkedHashMap<Integer, Map<Integer, String>>();
126-
expected.add(posts);
125+
posts = findPostsById(expected, array[0]);
126+
if (posts == null) {
127+
posts = new LinkedHashMap<Integer, Map<Integer, String>>();
128+
expected.add(posts);
129+
}
127130
}
128131
postId = array[0];
129132
@SuppressWarnings("unchecked")
130133
Pair<Integer, Pair<Integer, String>> pair = (Pair<Integer, Pair<Integer, String>>) array[1];
131134
Integer first = pair.getFirst();
132-
Map<Integer, String> comments =
133-
posts.computeIfAbsent(first, k -> new LinkedHashMap<Integer, String>());
135+
Map<Integer, String> comments = posts.get(first);
136+
if (comments == null) {
137+
comments = new LinkedHashMap<Integer, String>();
138+
posts.put(first, comments);
139+
}
134140
Pair<Integer, String> second = pair.getSecond();
135141
comments.put(second.getFirst(), second.getSecond());
136142
}
137143
assertEquals(expected.toString(), actual.toString());
138144
}
139145

146+
private Map<Integer, Map<Integer, String>> findPostsById(
147+
List<Map<Integer, Map<Integer, String>>> allPosts, Object postId) {
148+
for (Map<Integer, Map<Integer, String>> posts : allPosts) {
149+
if (posts.containsKey(postId)) return posts;
150+
}
151+
return null;
152+
}
153+
140154
@Test
141155
public void map4() {
142156
CloseableIterator<Map<Map<Integer, String>, String>> results =

0 commit comments

Comments
 (0)