Skip to content

Commit 0e0c93f

Browse files
committed
perf(query-compiler): stream aggregate result mappings
Signed-off-by: Alexey Orlenko's AI Agent <robot@aqrln.net>
1 parent a4a408b commit 0e0c93f

1 file changed

Lines changed: 27 additions & 27 deletions

File tree

query-compiler/query-compiler/src/data_mapper.rs

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ use crate::{
33
result_node::{ResultNode, ResultNodeBuilder},
44
};
55
use bon::builder;
6-
use indexmap::IndexSet;
76
use itertools::Itertools;
87
use psl::datamodel_connector::Flavour;
98
use query_core::{
109
CreateManyRecordsFields, DeleteRecordFields, Node, Query, QueryGraph, ReadQuery, UpdateManyRecordsFields,
1110
UpdateRecord, WriteQuery,
1211
};
1312
use query_structure::{
14-
AggregationSelection, FieldArity, FieldSelection, FieldTypeInformation, ScalarField, SelectedField, Type,
13+
AggregationSelection, FieldArity, FieldSelection, FieldTypeInformation, ScalarField, SelectedField,
14+
SelectionIdentifier, Type,
1515
TypeIdentifier,
1616
};
1717
use 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

318318
fn get_result_node_for_create_many(

0 commit comments

Comments
 (0)