Skip to content

Commit

Permalink
Performance fix for related select
Browse files Browse the repository at this point in the history
If the relation column is in the same table, do not join with itself.
  • Loading branch information
Julius de Bruijn committed Nov 20, 2019
1 parent 8413c46 commit 24f6330
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 21 deletions.
1 change: 0 additions & 1 deletion libs/prisma-models/src/field/relation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
1 change: 0 additions & 1 deletion libs/prisma-models/src/selected_fields.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
33 changes: 19 additions & 14 deletions libs/prisma-models/src/sql_ext/selected_fields.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ pub trait SelectedFieldsExt {

impl SelectedFieldsExt for SelectedFields {
fn columns(&self) -> Vec<Column<'static>> {
let mut result: Vec<Column<'static>> = self.scalar_non_list().iter().map(|f| f.as_column()).collect();
let mut result: Vec<Column<'static>> = self
.scalar_non_list()
.iter()
.map(|f| f.as_column())
.collect();

for rf in self.relation_inlined().iter() {
result.push(rf.as_column());
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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);

Expand All @@ -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)?);

Expand Down

0 comments on commit 24f6330

Please sign in to comment.