1- use crate :: result_node:: { ObjectKind , ResultNode , ResultNodeBuilder } ;
1+ use crate :: {
2+ binding,
3+ result_node:: { ResultNode , ResultNodeBuilder } ,
4+ } ;
25use indexmap:: IndexSet ;
36use itertools:: Itertools ;
47use query_core:: {
58 CreateManyRecordsFields , DeleteRecordFields , Node , Query , QueryGraph , ReadQuery , UpdateManyRecordsFields ,
69 UpdateRecord , WriteQuery , schema:: constants:: aggregations,
710} ;
811use query_structure:: { AggregationSelection , FieldSelection , SelectedField } ;
9- use std:: collections:: HashMap ;
12+ use std:: { borrow :: Cow , collections:: HashMap } ;
1013
1114pub fn map_result_structure ( graph : & QueryGraph , builder : & mut ResultNodeBuilder ) -> Option < ResultNode > {
1215 graph
@@ -34,44 +37,57 @@ pub fn map_result_structure(graph: &QueryGraph, builder: &mut ResultNodeBuilder)
3437
3538fn map_query ( query : & Query , builder : & mut ResultNodeBuilder ) -> Option < ResultNode > {
3639 match query {
37- Query :: Read ( read_query) => map_read_query ( read_query, builder) ,
40+ Query :: Read ( read_query) => map_read_query ( read_query, builder, None ) ,
3841 Query :: Write ( write_query) => map_write_query ( write_query, builder) ,
3942 }
4043}
4144
42- fn map_read_query ( query : & ReadQuery , builder : & mut ResultNodeBuilder ) -> Option < ResultNode > {
45+ fn map_read_query (
46+ query : & ReadQuery ,
47+ builder : & mut ResultNodeBuilder ,
48+ object_name : Option < Cow < ' static , str > > ,
49+ ) -> Option < ResultNode > {
4350 match query {
4451 ReadQuery :: RecordQuery ( q) => get_result_node (
4552 & q. selected_fields ,
4653 & q. selection_order ,
4754 & q. nested ,
4855 q. relation_load_strategy . is_join ( ) ,
4956 builder,
57+ object_name,
5058 ) ,
5159 ReadQuery :: ManyRecordsQuery ( q) => get_result_node (
5260 & q. selected_fields ,
5361 & q. selection_order ,
5462 & q. nested ,
5563 q. relation_load_strategy . is_join ( ) ,
5664 builder,
65+ object_name,
66+ ) ,
67+ ReadQuery :: RelatedRecordsQuery ( q) => get_result_node (
68+ & q. selected_fields ,
69+ & q. selection_order ,
70+ & q. nested ,
71+ false ,
72+ builder,
73+ object_name,
5774 ) ,
58- ReadQuery :: RelatedRecordsQuery ( q) => {
59- get_result_node ( & q. selected_fields , & q. selection_order , & q. nested , false , builder)
60- }
6175 ReadQuery :: AggregateRecordsQuery ( q) => {
62- get_result_node_for_aggregation ( & q. selectors , & q. selection_order , builder)
76+ get_result_node_for_aggregation ( & q. selectors , & q. selection_order , builder, object_name )
6377 }
6478 }
6579}
6680
6781fn map_write_query ( query : & WriteQuery , builder : & mut ResultNodeBuilder ) -> Option < ResultNode > {
6882 match query {
69- WriteQuery :: CreateRecord ( q) => get_result_node ( & q. selected_fields , & q. selection_order , & [ ] , false , builder) ,
83+ WriteQuery :: CreateRecord ( q) => {
84+ get_result_node ( & q. selected_fields , & q. selection_order , & [ ] , false , builder, None )
85+ }
7086 WriteQuery :: CreateManyRecords ( q) => get_result_node_for_create_many ( q. selected_fields . as_ref ( ) , builder) ,
7187 WriteQuery :: UpdateRecord ( u) => {
7288 match u {
7389 UpdateRecord :: WithSelection ( w) => {
74- get_result_node ( & w. selected_fields , & w. selection_order , & [ ] , false , builder)
90+ get_result_node ( & w. selected_fields , & w. selection_order , & [ ] , false , builder, None )
7591 }
7692 UpdateRecord :: WithoutSelection ( _) => None , // No result data
7793 }
@@ -83,7 +99,7 @@ fn map_write_query(query: &WriteQuery, builder: &mut ResultNodeBuilder) -> Optio
8399 WriteQuery :: DisconnectRecords ( _) => None , // No result data
84100 WriteQuery :: ExecuteRaw ( _) => None , // No data mapping
85101 WriteQuery :: QueryRaw ( _) => None , // No data mapping
86- WriteQuery :: Upsert ( q) => get_result_node ( & q. selected_fields , & q. selection_order , & [ ] , false , builder) ,
102+ WriteQuery :: Upsert ( q) => get_result_node ( & q. selected_fields , & q. selection_order , & [ ] , false , builder, None ) ,
87103 }
88104}
89105
@@ -94,6 +110,7 @@ fn get_result_node(
94110 // relationJoins queries use prisma names rather than db names
95111 uses_relation_joins : bool ,
96112 builder : & mut ResultNodeBuilder ,
113+ original_name : Option < Cow < ' static , str > > ,
97114) -> Option < ResultNode > {
98115 let field_map = field_selection
99116 . selections ( )
@@ -107,24 +124,38 @@ fn get_result_node(
107124 . map ( |q| ( q. get_alias_or_name ( ) , q) )
108125 . collect :: < HashMap < _ , _ > > ( ) ;
109126
110- let mut node = ResultNodeBuilder :: new_object ( ) ;
127+ let mut node = ResultNodeBuilder :: new_object ( original_name) ;
128+
111129 for prisma_name in selection_order {
112130 match field_map. get ( prisma_name. as_str ( ) ) {
113131 Some ( sf @ SelectedField :: Scalar ( f) ) => {
114132 let name = if uses_relation_joins {
115- sf. prisma_name ( ) . into_owned ( )
133+ sf. prisma_name ( )
116134 } else {
117- sf. db_name ( ) . into_owned ( )
135+ sf. db_name ( )
118136 } ;
119- node. add_field ( prisma_name, builder. new_value ( name, f. type_info ( ) ) ) ;
137+ node. add_field (
138+ prisma_name. to_owned ( ) ,
139+ builder. new_value ( name. into_owned ( ) , f. type_info ( ) ) ,
140+ ) ;
120141 }
121142 Some ( SelectedField :: Composite ( _) ) => todo ! ( "MongoDB specific" ) ,
122143 Some ( SelectedField :: Relation ( f) ) => {
123144 let nested_selection = FieldSelection :: new ( f. selections . to_vec ( ) ) ;
124- let nested_node =
125- get_result_node ( & nested_selection, & f. result_fields , & [ ] , uses_relation_joins, builder) ;
145+ let nested_node = get_result_node (
146+ & nested_selection,
147+ & f. result_fields ,
148+ & [ ] ,
149+ uses_relation_joins,
150+ builder,
151+ Some ( if uses_relation_joins {
152+ f. field . name ( ) . to_owned ( ) . into ( )
153+ } else {
154+ binding:: nested_relation_field ( & f. field ) . into ( )
155+ } ) ,
156+ ) ;
126157 if let Some ( nested_node) = nested_node {
127- node. add_field ( f. field . name ( ) , nested_node) ;
158+ node. add_field ( f. field . name ( ) . to_owned ( ) , nested_node) ;
128159 }
129160 }
130161 Some ( SelectedField :: Virtual ( f) ) => {
@@ -140,22 +171,23 @@ fn get_result_node(
140171 vs. db_alias ( )
141172 } ;
142173
143- node. entry_or_insert (
144- group_name,
145- if uses_relation_joins {
146- ObjectKind :: Nested
147- } else {
148- ObjectKind :: Flattened
149- } ,
150- )
151- . add_field ( field_name, builder. new_value ( db_name, vs. r#type ( ) . into ( ) ) ) ;
174+ node. entry_or_insert ( group_name, uses_relation_joins. then_some ( group_name) )
175+ . add_field ( field_name. to_owned ( ) , builder. new_value ( db_name, vs. r#type ( ) . into ( ) ) ) ;
152176 }
153177 }
154178 None => {
155179 if let Some ( q) = nested_map. get ( prisma_name. as_str ( ) ) {
156- let nested_node = map_read_query ( q, builder) ;
180+ let nested_node = map_read_query (
181+ q,
182+ builder,
183+ Some ( if uses_relation_joins {
184+ prisma_name. to_owned ( ) . into ( )
185+ } else {
186+ binding:: nested_relation_field_by_name ( prisma_name) . into ( )
187+ } ) ,
188+ ) ;
157189 if let Some ( nested_node) = nested_node {
158- node. add_field ( q. get_alias_or_name ( ) , nested_node) ;
190+ node. add_field ( q. get_alias_or_name ( ) . to_owned ( ) , nested_node) ;
159191 }
160192 }
161193 }
@@ -169,6 +201,7 @@ fn get_result_node_for_aggregation(
169201 selectors : & [ AggregationSelection ] ,
170202 selection_order : & [ ( String , Option < Vec < String > > ) ] ,
171203 builder : & mut ResultNodeBuilder ,
204+ object_name : Option < Cow < ' static , str > > ,
172205) -> Option < ResultNode > {
173206 let mut ordered_set = IndexSet :: new ( ) ;
174207
@@ -182,7 +215,7 @@ fn get_result_node_for_aggregation(
182215 }
183216 }
184217
185- let mut node = ResultNodeBuilder :: new_object ( ) ;
218+ let mut node = ResultNodeBuilder :: new_object ( object_name ) ;
186219
187220 for ( underscore_name, name, db_name, typ) in selectors
188221 . iter ( )
@@ -199,11 +232,12 @@ fn get_result_node_for_aggregation(
199232 } )
200233 . sorted_by_key ( |( underscore_name, name, _, _) | ordered_set. get_index_of ( & ( * underscore_name, * name) ) )
201234 {
202- let value = builder. new_value ( db_name. into ( ) , typ. into ( ) ) ;
235+ let value = builder. new_value ( db_name. to_owned ( ) , typ. into ( ) ) ;
203236 if let Some ( undescore_name) = underscore_name {
204- node. entry_or_insert_nested ( undescore_name) . add_field ( name, value) ;
237+ node. entry_or_insert_nested ( undescore_name)
238+ . add_field ( name. to_owned ( ) , value) ;
205239 } else {
206- node. add_field ( name, value) ;
240+ node. add_field ( name. to_owned ( ) , value) ;
207241 }
208242 }
209243
@@ -231,14 +265,22 @@ fn get_result_node_for_create_many(
231265 & selected_fields?. nested ,
232266 false ,
233267 builder,
268+ None ,
234269 )
235270}
236271
237272fn get_result_node_for_delete (
238273 selected_fields : Option < & DeleteRecordFields > ,
239274 builder : & mut ResultNodeBuilder ,
240275) -> Option < ResultNode > {
241- get_result_node ( & selected_fields?. fields , & selected_fields?. order , & [ ] , false , builder)
276+ get_result_node (
277+ & selected_fields?. fields ,
278+ & selected_fields?. order ,
279+ & [ ] ,
280+ false ,
281+ builder,
282+ None ,
283+ )
242284}
243285
244286fn get_result_node_for_update_many (
@@ -251,5 +293,6 @@ fn get_result_node_for_update_many(
251293 & selected_fields?. nested ,
252294 false ,
253295 builder,
296+ None ,
254297 )
255298}
0 commit comments