Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/classes/GraphQLQueryTree.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {GraphQLResolveInfo} from "graphql";
import {buildQueryTree, GraphQLQueryTreeProperties} from "../";
import {EntityMetadata} from "typeorm";


/**
Expand Down Expand Up @@ -50,10 +51,10 @@ export class GraphQLQueryTree<T> {
}

/**
* @description Check if this field is a relation
* @description Check if this field is a relation in metadata
*/
public isRelation(): boolean {
return !!(this.fields && this.fields.length);
public isRelationIn(metadata: EntityMetadata): boolean {
return !!metadata.ownRelations.find((relation) => relation.propertyName === this.name);
}

/**
Expand Down
10 changes: 8 additions & 2 deletions src/functions/build-query-recursively.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {GraphQLQueryTree, PAGINATE} from "../";
import {RelationMetadata} from "typeorm/metadata/RelationMetadata";
import {EntityMetadata, SelectQueryBuilder} from "typeorm";
import {ColumnMetadata} from "typeorm/metadata/ColumnMetadata";

/**
* @description Builds a TypeORM query with the queryBuilder recursively, joining every requested relation,
Expand All @@ -20,17 +21,22 @@ export function buildQueryRecursively<T>(

// Firstly, we list all selected fields at this level of the query tree
const selectedFields = tree.fields
.filter((field: GraphQLQueryTree<T>) => !field.isRelation())
.filter((field: GraphQLQueryTree<T>) => !field.isRelationIn(metadata))
.map((field: GraphQLQueryTree<T>) => alias + "." + field.name);

// Secondly, we list all fields used in arguments
const argFields = Object
.keys(tree.properties.args)
.map((arg: string) => alias + "." + arg);

// Thirdly, we select all primary keys, to make sure that joined relations are not null
const primaryFields = metadata.primaryColumns
.map((ref: ColumnMetadata) => alias + "." + ref.propertyPath)

// We select all of above
qb.addSelect(argFields);
qb.addSelect(selectedFields);
qb.addSelect(primaryFields)

// We add order options
Object.keys(options.order)
Expand Down Expand Up @@ -58,7 +64,7 @@ export function buildQueryRecursively<T>(

// For each asked relation
tree.fields
.filter((field: GraphQLQueryTree<T>) => field.isRelation())
.filter((field: GraphQLQueryTree<T>) => field.isRelationIn(metadata))
.forEach((relationTree: GraphQLQueryTree<T>) => {
const relation: RelationMetadata = metadata.findRelationWithPropertyPath(relationTree.name);

Expand Down