Skip to content

Commit db10585

Browse files
authored
Merge branch 'master' into java17
2 parents 6617a0d + 139a59a commit db10585

File tree

6 files changed

+74
-26
lines changed

6 files changed

+74
-26
lines changed

querydsl-libraries/querydsl-core/src/main/java/com/querydsl/core/group/GroupByGenericCollection.java

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
*/
1414
package com.querydsl.core.group;
1515

16+
import static com.querydsl.core.util.TupleUtils.toTuple;
17+
1618
import com.querydsl.core.FetchableQuery;
1719
import com.querydsl.core.Tuple;
1820
import com.querydsl.core.types.Expression;
@@ -53,29 +55,30 @@ public RES transform(FetchableQuery<?, ?> query) {
5355
if (hasGroups) {
5456
expr = withoutGroupExpressions(expr);
5557
}
56-
final var iter = query.select(expr).iterate();
58+
try (final var iter = query.select(expr).iterate(); ) {
5759

58-
var list = resultFactory.get();
59-
GroupImpl group = null;
60-
K groupId = null;
61-
while (iter.hasNext()) {
62-
@SuppressWarnings("unchecked") // This type is mandated by the key type
63-
var row = (K[]) iter.next().toArray();
64-
if (group == null) {
65-
group = new GroupImpl(groupExpressions, maps);
66-
groupId = row[0];
67-
} else if (!Objects.equals(groupId, row[0])) {
60+
var list = resultFactory.get();
61+
GroupImpl group = null;
62+
K groupId = null;
63+
while (iter.hasNext()) {
64+
var tuple = toTuple(iter.next(), expressions);
65+
@SuppressWarnings("unchecked") // This type is mandated by the key type
66+
var row = (K[]) tuple.toArray();
67+
if (group == null) {
68+
group = new GroupImpl(groupExpressions, maps);
69+
groupId = row[0];
70+
} else if (!Objects.equals(groupId, row[0])) {
71+
list.add(transform(group));
72+
group = new GroupImpl(groupExpressions, maps);
73+
groupId = row[0];
74+
}
75+
group.add(row);
76+
}
77+
if (group != null) {
6878
list.add(transform(group));
69-
group = new GroupImpl(groupExpressions, maps);
70-
groupId = row[0];
7179
}
72-
group.add(row);
73-
}
74-
if (group != null) {
75-
list.add(transform(group));
80+
return list;
7681
}
77-
iter.close();
78-
return list;
7982
}
8083

8184
@SuppressWarnings("unchecked")

querydsl-libraries/querydsl-core/src/main/java/com/querydsl/core/group/GroupByGenericMap.java

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

16+
import static com.querydsl.core.util.TupleUtils.toTuple;
17+
1618
import com.querydsl.core.FetchableQuery;
1719
import com.querydsl.core.Tuple;
1820
import com.querydsl.core.types.Expression;
@@ -53,11 +55,11 @@ public RES transform(FetchableQuery<?, ?> query) {
5355
if (hasGroups) {
5456
expr = withoutGroupExpressions(expr);
5557
}
56-
var iter = query.select(expr).iterate();
57-
try {
58+
try (var iter = query.select(expr).iterate()) {
5859
while (iter.hasNext()) {
60+
var tuple = toTuple(iter.next(), expressions);
5961
@SuppressWarnings("unchecked") // This type is mandated by the key type
60-
var row = (K[]) iter.next().toArray();
62+
var row = (K[]) tuple.toArray();
6163
var groupId = row[0];
6264
var group = (GroupImpl) groups.get(groupId);
6365
if (group == null) {
@@ -66,8 +68,6 @@ public RES transform(FetchableQuery<?, ?> query) {
6668
}
6769
group.add(row);
6870
}
69-
} finally {
70-
iter.close();
7171
}
7272

7373
// transform groups

querydsl-libraries/querydsl-core/src/main/java/com/querydsl/core/group/GroupByIterate.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
*/
1414
package com.querydsl.core.group;
1515

16+
import static com.querydsl.core.util.TupleUtils.toTuple;
17+
1618
import com.mysema.commons.lang.CloseableIterator;
1719
import com.querydsl.core.FetchableQuery;
1820
import com.querydsl.core.Tuple;
@@ -73,8 +75,9 @@ public V next() {
7375
}
7476

7577
while (iter.hasNext()) {
78+
var tuple = toTuple(iter.next(), expressions);
7679
@SuppressWarnings("unchecked") // This type is mandated by the key type
77-
var row = (K[]) iter.next().toArray();
80+
var row = (K[]) tuple.toArray();
7881
if (group == null) {
7982
group = new GroupImpl(groupExpressions, maps);
8083
groupId = row[0];

querydsl-libraries/querydsl-core/src/main/java/com/querydsl/core/group/GroupByMap.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
*/
1414
package com.querydsl.core.group;
1515

16+
import static com.querydsl.core.util.TupleUtils.toTuple;
17+
1618
import com.querydsl.core.FetchableQuery;
1719
import com.querydsl.core.Tuple;
1820
import com.querydsl.core.types.Expression;
@@ -50,8 +52,9 @@ public Map<K, V> transform(FetchableQuery<?, ?> query) {
5052
}
5153
try (var iter = query.select(expr).iterate()) {
5254
while (iter.hasNext()) {
55+
var tuple = toTuple(iter.next(), expressions);
5356
@SuppressWarnings("unchecked") // This type is mandated by the key type
54-
var row = (K[]) iter.next().toArray();
57+
var row = (K[]) tuple.toArray();
5558
var groupId = row[0];
5659
var group = (GroupImpl) groups.get(groupId);
5760
if (group == null) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.querydsl.core.util;
2+
3+
import com.querydsl.core.Tuple;
4+
import com.querydsl.core.types.Expression;
5+
import com.querydsl.core.types.Projections;
6+
7+
/** TupleUtils provides tuple related utility functionality */
8+
public final class TupleUtils {
9+
10+
public static Tuple toTuple(Object next, Expression<?>[] expressions) {
11+
// workaround from https://github.com/querydsl/querydsl/issues/3264
12+
Tuple tuple;
13+
if (next instanceof Tuple) {
14+
tuple = (Tuple) next;
15+
} else if (next instanceof Object[]) {
16+
tuple = Projections.tuple(expressions).newInstance((Object[]) next);
17+
} else {
18+
throw new IllegalArgumentException(String.format("Could not translate %s into tuple", next));
19+
}
20+
return tuple;
21+
}
22+
}

querydsl-libraries/querydsl-jpa/src/test/java/com/querydsl/jpa/HibernateBase.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@
1414
package com.querydsl.jpa;
1515

1616
import static org.assertj.core.api.Assertions.assertThat;
17+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
1718

1819
import com.mysema.commons.lang.CloseableIterator;
1920
import com.querydsl.core.DefaultQueryMetadata;
21+
import com.querydsl.core.Target;
2022
import com.querydsl.core.Tuple;
23+
import com.querydsl.core.group.GroupBy;
24+
import com.querydsl.core.testutil.ExcludeIn;
2125
import com.querydsl.core.types.EntityPath;
2226
import com.querydsl.core.types.Expression;
2327
import com.querydsl.jpa.domain.Cat;
@@ -159,4 +163,17 @@ public void createQuery3() {
159163
assertThat(row instanceof String).isTrue();
160164
}
161165
}
166+
167+
@Test
168+
@ExcludeIn(Target.DERBY)
169+
public void createQuery4() {
170+
assertDoesNotThrow(
171+
() ->
172+
query()
173+
.from(cat)
174+
.leftJoin(cat.kittens)
175+
.fetchJoin()
176+
.distinct()
177+
.transform(GroupBy.groupBy(cat.id).as(cat)));
178+
}
162179
}

0 commit comments

Comments
 (0)