Skip to content

Commit e3f33ef

Browse files
committed
Add original object names in data map
1 parent 1fdfa84 commit e3f33ef

27 files changed

Lines changed: 178 additions & 119 deletions

query-compiler/query-compiler/src/binding.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,7 @@ pub fn selector(field: &SelectedField) -> Cow<'static, str> {
4242
pub fn nested_relation_field(field: &RelationField) -> String {
4343
format!("{NESTED}{FIELD_SEPARATOR}{}", field.name())
4444
}
45+
46+
pub fn nested_relation_field_by_name(field_name: &str) -> String {
47+
format!("{NESTED}{FIELD_SEPARATOR}{}", field_name)
48+
}

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

Lines changed: 77 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
use crate::result_node::{ObjectKind, ResultNode, ResultNodeBuilder};
1+
use crate::{
2+
binding,
3+
result_node::{ResultNode, ResultNodeBuilder},
4+
};
25
use indexmap::IndexSet;
36
use itertools::Itertools;
47
use query_core::{
58
CreateManyRecordsFields, DeleteRecordFields, Node, Query, QueryGraph, ReadQuery, UpdateManyRecordsFields,
69
UpdateRecord, WriteQuery, schema::constants::aggregations,
710
};
811
use query_structure::{AggregationSelection, FieldSelection, SelectedField};
9-
use std::collections::HashMap;
12+
use std::{borrow::Cow, collections::HashMap};
1013

1114
pub 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

3538
fn 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

6781
fn 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

237272
fn 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

244286
fn 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
}

query-compiler/query-compiler/src/expression/format.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,15 @@ where
300300
ResultNode::AffectedRows => self.keyword("affectedRows"),
301301
ResultNode::Object(object) => self.object(object.fields().iter().map(|(name, field)| {
302302
let mut key = self.field_name(name);
303-
if object.is_flattened() {
304-
key = key.append(self.space().append(self.keyword("(flattened)")));
303+
if let ResultNode::Object(nested_object) = field {
304+
let source = match nested_object.original_key() {
305+
Some(original_key) => self
306+
.keyword("from")
307+
.append(self.space())
308+
.append(self.field_name(original_key)),
309+
None => self.keyword("inlined"),
310+
};
311+
key = key.append(self.space().append(source.parens()))
305312
}
306313
(key, self.data_map_node(field))
307314
})),

0 commit comments

Comments
 (0)