package com.querydsl.collections; import static com.querydsl.core.group.GroupBy.groupBy; import static com.querydsl.core.group.GroupBy.set; import static org.easymock.EasyMock.*; import java.util.Map; import java.util.Set; import org.junit.Test; import com.mysema.commons.lang.CloseableIterator; import com.querydsl.core.FetchableQuery; import com.querydsl.core.ResultTransformer; import com.querydsl.core.annotations.QueryEntity; import com.querydsl.core.group.Group; import com.querydsl.core.types.Projections; public class GroupBy3Test { @QueryEntity public static class RiskAnalysis { public String id; public Set<AssetThreat> assetThreats; } @QueryEntity public static class AssetThreat { public String id; public Set<Threat> threats; } @QueryEntity public static class Threat { public String id; } @Test public void nested_expressions() { QGroupBy3Test_RiskAnalysis riskAnalysis = QGroupBy3Test_RiskAnalysis.riskAnalysis; QGroupBy3Test_AssetThreat assetThreat = QGroupBy3Test_AssetThreat.assetThreat; QGroupBy3Test_Threat threat = QGroupBy3Test_Threat.threat; ResultTransformer<Map<String,RiskAnalysis>> transformer = groupBy(riskAnalysis.id) .as(Projections.bean(RiskAnalysis.class, riskAnalysis.id, set(Projections.bean(AssetThreat.class, assetThreat.id, set(Projections.bean(Threat.class, threat.id)).as("threats"))) .as("assetThreats"))); CloseableIterator iter = createMock(CloseableIterator.class); FetchableQuery projectable = createMock(FetchableQuery.class); expect(projectable.select(Projections.tuple( riskAnalysis.id, riskAnalysis.id, assetThreat.id, Projections.bean(Threat.class, threat.id)))) .andReturn(projectable); expect(projectable.iterate()).andReturn(iter); expect(iter.hasNext()).andReturn(false); iter.close(); replay(iter, projectable); transformer.transform(projectable); verify(projectable); } @Test public void alias_usage() { QGroupBy3Test_RiskAnalysis riskAnalysis = QGroupBy3Test_RiskAnalysis.riskAnalysis; QGroupBy3Test_AssetThreat assetThreat = QGroupBy3Test_AssetThreat.assetThreat; QGroupBy3Test_Threat threat = QGroupBy3Test_Threat.threat; ResultTransformer<Map<String,Group>> transformer = groupBy(riskAnalysis.id) .as(riskAnalysis.id, set(Projections.bean(AssetThreat.class, assetThreat.id, set(Projections.bean(Threat.class, threat.id)).as("threats")) .as("assetThreats"))); CloseableIterator iter = createMock(CloseableIterator.class); FetchableQuery projectable = createMock(FetchableQuery.class); expect(projectable.select(Projections.tuple( riskAnalysis.id, riskAnalysis.id, assetThreat.id, Projections.bean(Threat.class, threat.id)))) .andReturn(projectable); expect(projectable.iterate()).andReturn(iter); expect(iter.hasNext()).andReturn(false); iter.close(); replay(iter, projectable); transformer.transform(projectable); verify(projectable); } }