package com.querydsl.collections;
import static com.querydsl.core.group.GroupBy.list;
import static com.querydsl.core.group.GroupBy.map;
import static org.junit.Assert.assertEquals;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.Lists;
import com.querydsl.core.annotations.QueryEntity;
import com.querydsl.core.annotations.QueryProjection;
import com.querydsl.core.group.GroupBy;
public class GroupBy2Test {
// select u1.id,u1.name,r1.id,r1.name,s1.name from users u1
// join roles r1 on u1.role = r1.id
// join security_groups s1 on r1.secgroup = s1.id
@QueryEntity
public static class User {
public Long id;
public String name;
public List<Role> roles;
}
@QueryEntity
public static class Role {
public Long id;
public String name;
public List<SecurityGroup> groups;
}
@QueryEntity
public static class SecurityGroup {
public Long id;
public String name;
public SecurityGroup(Long id, String name) {
this.id = id;
this.name = name;
}
}
public static class UserDto {
public Long id;
public String name;
public List<Long> roleIds;
public List<String> roleNames;
public List<Long> secIds;
@QueryProjection
public UserDto(Long id, String name, List<Long> roleIds, List<String> roleNames, List<Long> secIds) {
this.id = id;
this.name = name;
this.roleIds = roleIds;
this.roleNames = roleNames;
this.secIds = secIds;
}
@QueryProjection
public UserDto(Long id, String name, Map<Long, String> roles, Map<Long, String> groups) {
this.id = id;
this.name = name;
this.roleIds = Lists.newArrayList(roles.keySet());
this.roleNames = Lists.newArrayList(roles.values());
this.secIds = Lists.newArrayList(groups.keySet());
}
}
private List<User> users;
@Before
public void setUp() {
Role r1 = new Role();
r1.id = 1L;
r1.name = "User";
r1.groups = Lists.newArrayList(new SecurityGroup(1L, "User 1"));
Role r2 = new Role();
r2.id = 2L;
r2.name = null; // NOTE this is null on purpose
r2.groups = Lists.newArrayList(new SecurityGroup(2L, "Admin 1"),
new SecurityGroup(3L, "Admin 2"));
User u1 = new User();
u1.id = 3L;
u1.name = "Bob";
u1.roles = Lists.newArrayList(r1);
User u2 = new User();
u2.id = 32L;
u2.name = "Ann";
u2.roles = Lists.newArrayList(r1, r2);
users = Lists.newArrayList(u1, u2);
}
@Test
public void test() {
QGroupBy2Test_User user = QGroupBy2Test_User.user;
QGroupBy2Test_Role role = QGroupBy2Test_Role.role;
QGroupBy2Test_SecurityGroup group = QGroupBy2Test_SecurityGroup.securityGroup;
Map<Long, UserDto> userDtos = CollQueryFactory.from(user, users)
.innerJoin(user.roles, role)
.innerJoin(role.groups, group)
.transform(GroupBy.groupBy(user.id)
.as(new QGroupBy2Test_UserDto(
user.id,
user.name,
list(role.id),
list(role.name),
list(group.id))));
UserDto dto1 = userDtos.get(3L);
assertEquals(1, dto1.roleIds.size());
assertEquals(1, dto1.roleNames.size());
assertEquals(1, dto1.secIds.size());
UserDto dto2 = userDtos.get(32L);
assertEquals(3, dto2.roleIds.size());
assertEquals(1, dto2.roleNames.size());
assertEquals(3, dto2.secIds.size());
}
@Test
public void test2() {
QGroupBy2Test_User user = QGroupBy2Test_User.user;
QGroupBy2Test_Role role = QGroupBy2Test_Role.role;
QGroupBy2Test_SecurityGroup group = QGroupBy2Test_SecurityGroup.securityGroup;
Map<Long, UserDto> userDtos = CollQueryFactory.from(user, users)
.innerJoin(user.roles, role)
.innerJoin(role.groups, group)
.transform(GroupBy.groupBy(user.id)
.as(new QGroupBy2Test_UserDto(
user.id,
user.name,
map(role.id, role.name),
map(group.id, group.name))));
UserDto dto1 = userDtos.get(3L);
assertEquals(1, dto1.roleIds.size());
assertEquals(1, dto1.roleNames.size());
assertEquals(1, dto1.secIds.size());
UserDto dto2 = userDtos.get(32L);
assertEquals(2, dto2.roleIds.size());
assertEquals(2, dto2.roleNames.size());
assertEquals(3, dto2.secIds.size());
}
}