@@ -3,15 +3,15 @@ use crate::{
33 result_node:: { ResultNode , ResultNodeBuilder } ,
44} ;
55use bon:: builder;
6- use indexmap:: IndexSet ;
76use itertools:: Itertools ;
87use psl:: datamodel_connector:: Flavour ;
98use query_core:: {
109 CreateManyRecordsFields , DeleteRecordFields , Node , Query , QueryGraph , ReadQuery , UpdateManyRecordsFields ,
1110 UpdateRecord , WriteQuery ,
1211} ;
1312use query_structure:: {
14- AggregationSelection , FieldArity , FieldSelection , FieldTypeInformation , ScalarField , SelectedField , Type ,
13+ AggregationSelection , FieldArity , FieldSelection , FieldTypeInformation , ScalarField , SelectedField ,
14+ SelectionIdentifier , Type ,
1515 TypeIdentifier ,
1616} ;
1717use serde:: Serialize ;
@@ -278,41 +278,41 @@ fn get_result_node_for_aggregation(
278278 builder : & mut ResultNodeBuilder ,
279279 object_name : Option < Cow < ' static , str > > ,
280280) -> Option < ResultNode > {
281- let mut ordered_set = IndexSet :: new ( ) ;
281+ let mut node = ResultNodeBuilder :: new_object ( object_name ) ;
282282
283- for ( key, nested) in selection_order {
283+ for ( ( key, nested) , selector ) in selection_order. iter ( ) . zip ( selectors ) {
284284 if let Some ( nested) = nested {
285285 for nested_key in nested {
286- ordered_set. insert ( ( Some ( key. as_str ( ) ) , nested_key. as_str ( ) ) ) ;
286+ if let Some ( ident) = selector. identifiers ( ) . find ( |ident| ident. field . name ( ) == nested_key) {
287+ add_aggregation_result_field ( & mut node, builder, ident) ;
288+ }
287289 }
288290 } else {
289- ordered_set. insert ( ( None , key. as_str ( ) ) ) ;
291+ for ident in selector. identifiers ( ) . filter ( |ident| ident. field . name ( ) == key) {
292+ add_aggregation_result_field ( & mut node, builder, ident) ;
293+ }
290294 }
291295 }
292296
293- let mut node = ResultNodeBuilder :: new_object ( object_name) ;
297+ Some ( node. build ( ) )
298+ }
294299
295- for ( name, prefix, db_alias, typ) in selectors
296- . iter ( )
297- . flat_map ( |sel| {
298- sel. identifiers ( ) . map ( move |ident| {
299- let db_alias = ident. db_alias ( ) ;
300- let type_info = FieldTypeInformation :: new ( ident. typ , ident. arity , None ) ;
301- ( ident. field . name ( ) , sel. aggregation_name ( ) , db_alias, type_info)
302- } )
303- } )
304- . sorted_by_key ( |( name, prefix, _, _) | ordered_set. get_index_of ( & ( * prefix, * name) ) )
305- {
306- let value = builder. new_value ( db_alias. into_owned ( ) , typ) ;
307- if let Some ( prefix) = prefix {
308- node. entry_or_insert ( prefix, None :: < & str > )
309- . add_field ( name. to_owned ( ) , value) ;
310- } else {
311- node. add_field ( name. to_owned ( ) , value) ;
312- }
300+ fn add_aggregation_result_field (
301+ node : & mut crate :: result_node:: ObjectBuilder ,
302+ builder : & mut ResultNodeBuilder ,
303+ ident : SelectionIdentifier < ' _ > ,
304+ ) {
305+ let name = ident. field . name ( ) . to_owned ( ) ;
306+ let prefix = ident. aggregation_name ;
307+ let db_alias = ident. db_alias ( ) . into_owned ( ) ;
308+ let type_info = FieldTypeInformation :: new ( ident. typ , ident. arity , None ) ;
309+ let value = builder. new_value ( db_alias, type_info) ;
310+
311+ if let Some ( prefix) = prefix {
312+ node. entry_or_insert ( prefix, None :: < & str > ) . add_field ( name, value) ;
313+ } else {
314+ node. add_field ( name, value) ;
313315 }
314-
315- Some ( node. build ( ) )
316316}
317317
318318fn get_result_node_for_create_many (
0 commit comments