@@ -19,15 +19,31 @@ public void Process(FetchRequestBase resultOperator, QueryModelVisitor queryMode
19
19
}
20
20
21
21
public void Process ( FetchRequestBase resultOperator , QueryModelVisitor queryModelVisitor , IntermediateHqlTree tree , string sourceAlias )
22
+ {
23
+ Process ( resultOperator , queryModelVisitor , tree , null , sourceAlias ) ;
24
+ }
25
+
26
+ private void Process (
27
+ FetchRequestBase resultOperator ,
28
+ QueryModelVisitor queryModelVisitor ,
29
+ IntermediateHqlTree tree ,
30
+ HqlTreeNode currentNode ,
31
+ string sourceAlias )
22
32
{
23
33
var memberPath = tree . TreeBuilder . Dot (
24
34
tree . TreeBuilder . Ident ( sourceAlias ) ,
25
35
tree . TreeBuilder . Ident ( resultOperator . RelationMember . Name ) ) ;
26
36
27
- Process ( resultOperator , queryModelVisitor , tree , memberPath , null ) ;
37
+ Process ( resultOperator , queryModelVisitor , tree , memberPath , currentNode , null ) ;
28
38
}
29
39
30
- private void Process ( FetchRequestBase resultOperator , QueryModelVisitor queryModelVisitor , IntermediateHqlTree tree , HqlDot memberPath , IType propType )
40
+ private void Process (
41
+ FetchRequestBase resultOperator ,
42
+ QueryModelVisitor queryModelVisitor ,
43
+ IntermediateHqlTree tree ,
44
+ HqlDot memberPath ,
45
+ HqlTreeNode currentNode ,
46
+ IType propType )
31
47
{
32
48
if ( resultOperator is FetchOneRequest )
33
49
{
@@ -40,8 +56,14 @@ private void Process(FetchRequestBase resultOperator, QueryModelVisitor queryMod
40
56
41
57
if ( propType != null && ! propType . IsAssociationType )
42
58
{
43
- tree . AddFromLastChildClause ( tree . TreeBuilder . Fetch ( ) ) ;
44
- tree . AddFromLastChildClause ( memberPath ) ;
59
+ if ( currentNode == null )
60
+ {
61
+ currentNode = tree . GetFromRangeClause ( )
62
+ ?? throw new InvalidOperationException ( $ "Property { resultOperator . RelationMember . Name } cannot be fetched for this type of query.") ;
63
+ }
64
+
65
+ currentNode . AddChild ( tree . TreeBuilder . Fetch ( ) ) ;
66
+ currentNode . AddChild ( memberPath ) ;
45
67
46
68
ComponentType componentType = null ;
47
69
foreach ( var innerFetch in resultOperator . InnerFetchRequests )
@@ -61,20 +83,21 @@ private void Process(FetchRequestBase resultOperator, QueryModelVisitor queryMod
61
83
memberPath ,
62
84
tree . TreeBuilder . Ident ( innerFetch . RelationMember . Name ) ) ;
63
85
64
- Process ( innerFetch , queryModelVisitor , tree , memberPath , componentType . Subtypes [ subTypeIndex ] ) ;
86
+ Process ( innerFetch , queryModelVisitor , tree , memberPath , currentNode , componentType . Subtypes [ subTypeIndex ] ) ;
65
87
}
66
88
67
89
return ;
68
90
}
69
91
}
70
92
71
93
var alias = queryModelVisitor . Model . GetNewName ( "_" ) ;
72
- tree . AddFromClause ( tree . TreeBuilder . LeftFetchJoin ( memberPath , tree . TreeBuilder . Alias ( alias ) ) ) ;
94
+ currentNode = tree . TreeBuilder . LeftFetchJoin ( memberPath , tree . TreeBuilder . Alias ( alias ) ) ;
95
+ tree . AddFromClause ( currentNode ) ;
73
96
tree . AddDistinctRootOperator ( ) ;
74
97
75
98
foreach ( var innerFetch in resultOperator . InnerFetchRequests )
76
99
{
77
- Process ( innerFetch , queryModelVisitor , tree , alias ) ;
100
+ Process ( innerFetch , queryModelVisitor , tree , currentNode , alias ) ;
78
101
}
79
102
}
80
103
}
0 commit comments