Skip to content

Commit

Permalink
refactor: clean up parent query builder & Brackets in where (#7807)
Browse files Browse the repository at this point in the history
* refactor: move parentQueryBuilder into queryBuilder

* refactor: allow use of `setParameter` in the same way as `setParameters`

* refactor: use parentQueryBuilder in brackets
  • Loading branch information
imnotjames committed Jun 29, 2021
1 parent fc4133c commit db2f05d
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 22 deletions.
40 changes: 25 additions & 15 deletions src/query-builder/QueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ export abstract class QueryBuilder<Entity> {
*/
protected queryRunner?: QueryRunner;

/**
* If QueryBuilder was created in a subquery mode then its parent QueryBuilder (who created subquery) will be stored here.
*/
protected parentQueryBuilder: QueryBuilder<any>;

// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
Expand Down Expand Up @@ -323,6 +328,14 @@ export abstract class QueryBuilder<Entity> {
* Sets parameter name and its value.
*/
setParameter(key: string, value: any): this {
if (value instanceof Function) {
throw new Error(`Function parameter isn't supported in the parameters. Please check "${key}" parameter.`);
}

if (this.parentQueryBuilder) {
this.parentQueryBuilder.setParameter(key, value);
}

this.expressionMap.parameters[key] = value;
return this;
}
Expand All @@ -331,19 +344,10 @@ export abstract class QueryBuilder<Entity> {
* Adds all parameters from the given object.
*/
setParameters(parameters: ObjectLiteral): this {
for (const [key, value] of Object.entries(parameters)) {
this.setParameter(key, value);
}

// remove function parameters
Object.keys(parameters).forEach(key => {
if (parameters[key] instanceof Function) {
throw new Error(`Function parameter isn't supported in the parameters. Please check "${key}" parameter.`);
}
});

// set parent query builder parameters as well in sub-query mode
if (this.expressionMap.parentQueryBuilder)
this.expressionMap.parentQueryBuilder.setParameters(parameters);

Object.keys(parameters).forEach(key => this.setParameter(key, parameters[key]));
return this;
}

Expand All @@ -353,8 +357,9 @@ export abstract class QueryBuilder<Entity> {
setNativeParameters(parameters: ObjectLiteral): this {

// set parent query builder parameters as well in sub-query mode
if (this.expressionMap.parentQueryBuilder)
this.expressionMap.parentQueryBuilder.setNativeParameters(parameters);
if (this.parentQueryBuilder) {
this.parentQueryBuilder.setNativeParameters(parameters);
}

Object.keys(parameters).forEach(key => {
this.expressionMap.nativeParameters[key] = parameters[key];
Expand Down Expand Up @@ -835,12 +840,17 @@ export abstract class QueryBuilder<Entity> {

if (where instanceof Brackets) {
const whereQueryBuilder = this.createQueryBuilder();

whereQueryBuilder.parentQueryBuilder = this;

whereQueryBuilder.expressionMap.mainAlias = this.expressionMap.mainAlias;
whereQueryBuilder.expressionMap.aliasNamePrefixingEnabled = this.expressionMap.aliasNamePrefixingEnabled;
whereQueryBuilder.expressionMap.parameters = this.expressionMap.parameters;
whereQueryBuilder.expressionMap.nativeParameters = this.expressionMap.nativeParameters;

where.whereFactory(whereQueryBuilder as any);

const whereString = whereQueryBuilder.createWhereExpressionString();
this.setParameters(whereQueryBuilder.getParameters());
return whereString ? "(" + whereString + ")" : "";

} else if (where instanceof Function) {
Expand Down
6 changes: 0 additions & 6 deletions src/query-builder/QueryExpressionMap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import {EntityMetadata} from "../metadata/EntityMetadata";
import {SelectQuery} from "./SelectQuery";
import {ColumnMetadata} from "../metadata/ColumnMetadata";
import {RelationMetadata} from "../metadata/RelationMetadata";
import {QueryBuilder} from "./QueryBuilder";
import {SelectQueryBuilderOption} from "./SelectQueryBuilderOption";

/**
Expand Down Expand Up @@ -203,11 +202,6 @@ export class QueryExpressionMap {
*/
subQuery: boolean = false;

/**
* If QueryBuilder was created in a subquery mode then its parent QueryBuilder (who created subquery) will be stored here.
*/
parentQueryBuilder: QueryBuilder<any>;

/**
* Indicates if property names are prefixed with alias names during property replacement.
* By default this is enabled, however we need this because aliases are not supported in UPDATE and DELETE queries,
Expand Down
2 changes: 1 addition & 1 deletion src/query-builder/SelectQueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export class SelectQueryBuilder<Entity> extends QueryBuilder<Entity> implements
subQuery(): SelectQueryBuilder<any> {
const qb = this.createQueryBuilder();
qb.expressionMap.subQuery = true;
qb.expressionMap.parentQueryBuilder = this;
qb.parentQueryBuilder = this;
return qb;
}

Expand Down

0 comments on commit db2f05d

Please sign in to comment.