@@ -95,57 +95,32 @@ def query(self, compiler, connection):
95
95
subquery_compiler .parent_collections = {compiler .collection_name } | compiler .parent_collections
96
96
columns = subquery_compiler .get_columns ()
97
97
field_name , expr = columns [0 ]
98
- result_query = subquery_compiler .query_class (subquery_compiler )
99
98
subquery = subquery_compiler .build_query (
100
99
columns
101
100
if subquery_compiler .query .annotations or not subquery_compiler .query .default_cols
102
101
else None
103
102
)
104
103
table_output = f"__subquery{ len (compiler .subqueries )} "
105
- pipeline = subquery .get_pipeline ()
106
- # the result must be a list of values. Se we compress the output
107
- if not self .has_limit_one ():
108
- pipeline .extend (
109
- [
110
- {
111
- "$group" : {
112
- "_id" : None ,
113
- "dummy_name" : {"$addToSet" : expr .as_mql (subquery_compiler , connection )},
114
- }
115
- },
116
- {"$project" : {field_name : "$dummy_name" }},
117
- ]
118
- )
119
- result_query .lookup_pipeline = [
120
- {
121
- "$lookup" : {
122
- "from" : self .get_meta ().db_table ,
123
- "pipeline" : pipeline ,
124
- "as" : table_output ,
125
- "let" : {
126
- compiler .PARENT_FIELD_TEMPLATE .format (i ): col .as_mql (compiler , connection )
127
- for col , i in subquery_compiler .column_mapping .items ()
128
- },
129
- }
104
+ subquery .lookup_data = {
105
+ "as" : table_output ,
106
+ "from" : self .get_meta ().db_table ,
107
+ "let" : {
108
+ compiler .PARENT_FIELD_TEMPLATE .format (i ): col .as_mql (compiler , connection )
109
+ for col , i in subquery_compiler .column_mapping .items ()
130
110
},
131
- {
132
- "$set" : {
133
- table_output : {
134
- "$cond" : {
135
- "if" : {
136
- "$or" : [
137
- {"$eq" : [{"$type" : f"${ table_output } " }, "missing" ]},
138
- {"$eq" : [{"$size" : f"${ table_output } " }, 0 ]},
139
- ]
140
- },
141
- "then" : {},
142
- "else" : {"$arrayElemAt" : [f"${ table_output } " , 0 ]},
143
- }
111
+ }
112
+ # the result must be a list of values. Se we compress the output with an aggregation pipeline.
113
+ if not self .has_limit_one ():
114
+ subquery .aggregation_pipeline = [
115
+ {
116
+ "$group" : {
117
+ "_id" : None ,
118
+ "dummy_name" : {"$addToSet" : expr .as_mql (subquery_compiler , connection )},
144
119
}
145
- }
146
- },
147
- ]
148
- compiler .subqueries .append (result_query )
120
+ },
121
+ { "$project" : { field_name : "$dummy_name" } },
122
+ ]
123
+ compiler .subqueries .append (subquery )
149
124
return f"${ table_output } .{ field_name } "
150
125
151
126
0 commit comments