@@ -95,57 +95,32 @@ def query(self, compiler, connection):
9595 subquery_compiler .parent_collections = {compiler .collection_name } | compiler .parent_collections
9696 columns = subquery_compiler .get_columns ()
9797 field_name , expr = columns [0 ]
98- result_query = subquery_compiler .query_class (subquery_compiler )
9998 subquery = subquery_compiler .build_query (
10099 columns
101100 if subquery_compiler .query .annotations or not subquery_compiler .query .default_cols
102101 else None
103102 )
104103 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 ()
130110 },
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 )},
144119 }
145- }
146- },
147- ]
148- compiler .subqueries .append (result_query )
120+ },
121+ { "$project" : { field_name : "$dummy_name" } },
122+ ]
123+ compiler .subqueries .append (subquery )
149124 return f"${ table_output } .{ field_name } "
150125
151126
0 commit comments