From 8b67711d15549e23304b0bae4b75e170e77f4848 Mon Sep 17 00:00:00 2001 From: Flavian Desverne Date: Wed, 9 Nov 2022 16:30:20 +0100 Subject: [PATCH] fix: compacting should only be done on findUnique queries (#3375) fixes https://github.com/prisma/prisma/issues/16195 --- .../queries/batch/select_one_compound.rs | 20 ++++++++++++++----- query-engine/core/src/query_document/mod.rs | 4 ++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/batch/select_one_compound.rs b/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/batch/select_one_compound.rs index f8b052209e83..cfc0397d5c56 100644 --- a/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/batch/select_one_compound.rs +++ b/query-engine/connector-test-kit-rs/query-engine-tests/tests/queries/batch/select_one_compound.rs @@ -34,7 +34,7 @@ mod compound_batch { // With non unique filters let queries = vec![ - r#"query { findUniqueArtist(where: { firstName_lastName: { firstName:"Musti", lastName:"Naukio", non_unique: 0 }}) { firstName lastName non_unique }}"#.to_string() + r#"query { findUniqueArtist(where: { firstName_lastName: { firstName:"Musti", lastName:"Naukio" }, non_unique: 0}) { firstName lastName non_unique }}"#.to_string() ]; let batch_results = runner.batch(queries, false, None).await?; insta::assert_snapshot!( @@ -62,9 +62,9 @@ mod compound_batch { // With non unique filters let queries = vec![ - r#"query {findUniqueArtist(where:{firstName_lastName:{firstName:"Musti",lastName:"Naukio", non_unique: 0}}) {firstName lastName}}"#.to_string(), - r#"query {findUniqueArtist(where:{firstName_lastName:{firstName:"Musti",lastName:"Naukio", non_unique: 1}}) {firstName lastName}}"#.to_string(), - r#"query {findUniqueArtist(where:{firstName_lastName:{firstName:"Naukio",lastName:"Musti", non_unique: null}}) {firstName lastName}}"#.to_string(), + r#"query {findUniqueArtist(where:{firstName_lastName:{firstName:"Musti",lastName:"Naukio"}, non_unique: 0}) {firstName lastName}}"#.to_string(), + r#"query {findUniqueArtist(where:{firstName_lastName:{firstName:"Musti",lastName:"Naukio"}, non_unique: 1}) {firstName lastName}}"#.to_string(), + r#"query {findUniqueArtist(where:{firstName_lastName:{firstName:"Naukio",lastName:"Musti"}, non_unique: null}) {firstName lastName}}"#.to_string(), ]; let batch_results = runner.batch(queries, false, None).await?; insta::assert_snapshot!( @@ -305,6 +305,13 @@ mod compound_batch { ]).await?; assert!(doc.is_compact() == false); + // NO COMPACT: One of the query is not a findUnique + let doc = compact_batch(&runner, vec![ + r#"query {findUniqueArtist(where:{firstName_lastName:{firstName:"NO",lastName:"AVAIL"}, non_unique: 1 }) {firstName lastName}}"#.to_string(), + r#"query {findManyArtist {firstName lastName}}"#.to_string(), + ]).await?; + assert!(doc.is_compact() == false); + Ok(()) } @@ -338,11 +345,14 @@ mod compound_batch { } async fn compact_batch(runner: &Runner, queries: Vec) -> TestResult { - // Ensure queries are valid + // Ensure individual queries are valid. Helps to debug tests when writing them. for q in queries.iter() { run_query!(runner, q.to_string()); } + // Ensure batched queries are valid + runner.batch(queries.clone(), false, None).await?.assert_success(); + let doc = GraphQlBody::Multi(MultiQuery::new( queries.into_iter().map(Into::into).collect(), false, diff --git a/query-engine/core/src/query_document/mod.rs b/query-engine/core/src/query_document/mod.rs index 8c82b095a94d..39d56357d793 100644 --- a/query-engine/core/src/query_document/mod.rs +++ b/query-engine/core/src/query_document/mod.rs @@ -71,6 +71,10 @@ impl BatchDocument { /// - non scalar filters (ie: relation filters, boolean operators...) /// - any scalar filters that is not `EQUALS` fn invalid_compact_filter(op: &Operation, schema: &QuerySchemaRef) -> bool { + if !op.is_find_unique() { + return true; + } + let where_obj = op.as_read().unwrap().arguments()[0].1.clone().into_object().unwrap(); let field = schema.find_query_field(op.name()).unwrap(); let model = field.model().unwrap();