diff --git a/libs/prisma-models/src/field/relation.rs b/libs/prisma-models/src/field/relation.rs index 3f55d2ff7f40..16d2f2cc3a4a 100644 --- a/libs/prisma-models/src/field/relation.rs +++ b/libs/prisma-models/src/field/relation.rs @@ -119,7 +119,6 @@ impl RelationField { Some(RelationLinkManifestation::Inline(ref m)) => { let is_self_rel = relation.is_self_relation(); - if is_self_rel && self.is_hidden { false } else if is_self_rel && (self.relation_side == RelationSide::B || self.related_field().is_hidden) { diff --git a/libs/prisma-models/src/selected_fields.rs b/libs/prisma-models/src/selected_fields.rs index a057cdcdec12..a505b2aa4f4f 100644 --- a/libs/prisma-models/src/selected_fields.rs +++ b/libs/prisma-models/src/selected_fields.rs @@ -118,7 +118,6 @@ impl SelectedFields { // Related and parent id. if self.from_field.is_some() { result.push(TypeIdentifier::GraphQLID); - result.push(TypeIdentifier::GraphQLID); }; result diff --git a/libs/prisma-models/src/sql_ext/selected_fields.rs b/libs/prisma-models/src/sql_ext/selected_fields.rs index 1b72d2d04ece..12ec302e3640 100644 --- a/libs/prisma-models/src/sql_ext/selected_fields.rs +++ b/libs/prisma-models/src/sql_ext/selected_fields.rs @@ -7,7 +7,11 @@ pub trait SelectedFieldsExt { impl SelectedFieldsExt for SelectedFields { fn columns(&self) -> Vec> { - let mut result: Vec> = self.scalar_non_list().iter().map(|f| f.as_column()).collect(); + let mut result: Vec> = self + .scalar_non_list() + .iter() + .map(|f| f.as_column()) + .collect(); for rf in self.relation_inlined().iter() { result.push(rf.as_column()); @@ -16,19 +20,20 @@ impl SelectedFieldsExt for SelectedFields { if let Some(ref from_field) = self.from_field { let relation = from_field.relation(); - result.push( - relation - .column_for_relation_side(from_field.relation_side.opposite()) - .alias(SelectedFields::RELATED_MODEL_ALIAS) - .table(Relation::TABLE_ALIAS), - ); - - result.push( - relation - .column_for_relation_side(from_field.relation_side) - .alias(SelectedFields::PARENT_MODEL_ALIAS) - .table(Relation::TABLE_ALIAS), - ); + if from_field.relation_is_inlined_in_child() { + result.push( + relation + .column_for_relation_side(from_field.relation_side) + .alias(SelectedFields::PARENT_MODEL_ALIAS), + ); + } else { + result.push( + relation + .column_for_relation_side(from_field.relation_side) + .alias(SelectedFields::PARENT_MODEL_ALIAS) + .table(Relation::TABLE_ALIAS), + ); + } }; result diff --git a/query-engine/connectors/sql-query-connector/src/database/operations/read.rs b/query-engine/connectors/sql-query-connector/src/database/operations/read.rs index 16977f5a4585..5b79b208085b 100644 --- a/query-engine/connectors/sql-query-connector/src/database/operations/read.rs +++ b/query-engine/connectors/sql-query-connector/src/database/operations/read.rs @@ -6,6 +6,7 @@ use connector_interface::{error::ConnectorError, *}; use itertools::Itertools; use prisma_models::*; use std::convert::TryFrom; +use quaint::ast::*; struct ScalarListElement { record_id: GraphqlId, @@ -66,7 +67,13 @@ where let idents = selected_fields.type_identifiers(); let field_names = selected_fields.names(); - let query = { + let query = if from_field.relation_is_inlined_in_child() { + let model = from_field.related_model(); + let select = read::get_records(&model, selected_fields, query_arguments) + .so_that(from_field.relation_column().in_selection(from_record_ids.to_owned())); + + Query::from(select) + } else { let is_with_pagination = query_arguments.is_with_pagination(); let base = ManyRelatedRecordsBaseQuery::new(from_field, from_record_ids, query_arguments, selected_fields); @@ -84,10 +91,6 @@ where .map(|mut row| { let parent_id = row.values.pop().ok_or(ConnectorError::ColumnDoesNotExist)?; - // Relation id is always the second last value. We don't need it - // here and we don't need it in the record. - let _ = row.values.pop(); - let mut record = Record::from(row); record.add_parent_id(GraphqlId::try_from(parent_id)?);