Skip to content

Commit 23d89d5

Browse files
committed
perf(query-compiler): skip nested-only update nodes
Signed-off-by: Alexey Orlenko's AI Agent <robot@aqrln.net>
1 parent 9a426d2 commit 23d89d5

3 files changed

Lines changed: 51 additions & 12 deletions

File tree

query-compiler/core/src/query_graph_builder/write/nested/update_nested.rs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use super::*;
2-
use crate::inputs::{UpdateManyRecordsSelectorsInput, UpdateRecordSelectorsInput};
2+
use crate::inputs::{ReturnInput, UpdateManyRecordsSelectorsInput, UpdateRecordSelectorsInput};
3+
use crate::query_graph_builder::write::write_args_parser::WriteArgsParser;
34
use crate::query_graph_builder::write::update::UpdateManyRecordNodeOptionals;
45
use crate::{DataExpectation, RowSink};
56
use crate::{
67
ParsedInputValue,
7-
query_graph::{NodeRef, QueryGraph, QueryGraphDependency},
8+
query_graph::{Flow, NodeRef, QueryGraph, QueryGraphDependency},
89
};
910
use query_structure::{Filter, Model, RelationFieldRef};
1011
use schema::constants::args;
@@ -89,8 +90,37 @@ pub fn nested_update(
8990
let find_child_records_node =
9091
utils::insert_find_children_by_parent_node(graph, parent, parent_relation_field, filter.clone())?;
9192

92-
let update_node = update::update_record_node(graph, query_schema, filter, child_model.clone(), data_map, None)?;
9393
let child_model_identifier = parent_relation_field.related_model().shard_aware_primary_identifier();
94+
let update_args = WriteArgsParser::from(child_model, data_map)?;
95+
96+
if update_args.args.is_empty() && !update_args.nested.is_empty() {
97+
let return_node = graph.create_node(Flow::Return(Vec::new()));
98+
99+
graph.create_edge(
100+
&find_child_records_node,
101+
&return_node,
102+
QueryGraphDependency::ProjectedDataDependency(
103+
child_model_identifier,
104+
RowSink::All(&ReturnInput),
105+
Some(DataExpectation::non_empty_rows(
106+
MissingRelatedRecord::builder()
107+
.model(child_model)
108+
.relation(&parent_relation_field.relation())
109+
.operation(DataOperation::NestedUpdate)
110+
.build(),
111+
)),
112+
),
113+
)?;
114+
115+
for (relation_field, data_map) in update_args.nested {
116+
connect_nested_query(graph, query_schema, return_node, relation_field, data_map)?;
117+
}
118+
119+
continue;
120+
}
121+
122+
let update_node =
123+
update::update_record_node_from_args(graph, query_schema, filter, child_model.clone(), update_args, None)?;
94124

95125
graph.create_edge(
96126
&find_child_records_node,

query-compiler/core/src/query_graph_builder/write/update.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,21 @@ where
190190
T: Clone + Into<Filter>,
191191
{
192192
let update_args = WriteArgsParser::from(&model, data_map)?;
193+
194+
update_record_node_from_args(graph, query_schema, filter, model, update_args, field)
195+
}
196+
197+
pub(crate) fn update_record_node_from_args<T>(
198+
graph: &mut QueryGraph,
199+
query_schema: &QuerySchema,
200+
filter: T,
201+
model: Model,
202+
update_args: WriteArgsParser<'_>,
203+
field: Option<&ParsedField<'_>>,
204+
) -> QueryGraphBuilderResult<NodeRef>
205+
where
206+
T: Clone + Into<Filter>,
207+
{
193208
let mut args = update_args.args;
194209

195210
args.update_datetimes(&model);

query-compiler/query-compiler/tests/snapshots/queries__queries@update-set-nested-prisma#27650.json.snap

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,10 @@ transaction
2020
WHERE (1=1 AND "public"."User"."id" IN [$1,*])
2121
OFFSET $2»
2222
params [var(0$userId as Int), const(BigInt(0))])
23-
in let 1 = unique (validate (get 1)
23+
in let 1 = validate (get 1)
2424
[ rowCountNeq 0
25-
] orRaise "MISSING_RELATED_RECORD");
26-
1$id = mapField id (get 1)
27-
in let 2 = unique (query «SELECT "public"."User"."id" FROM
28-
"public"."User" WHERE (1=1 AND
29-
"public"."User"."id" IN [$1,*]) LIMIT $2
30-
OFFSET $3»
31-
params [var(1$id as Int), const(BigInt(1)),
32-
const(BigInt(0))])
25+
] orRaise "MISSING_RELATED_RECORD"
26+
in let 2 = get 1
3327
in let 2$id = mapField id (get 2)
3428
in let 3 = unique (query «SELECT
3529
"public"."NotificationSettings"."userId"

0 commit comments

Comments
 (0)