@@ -80,6 +80,11 @@ export abstract class QueryBuilder<Entity extends ObjectLiteral> {
8080 */
8181 private parameterIndex = 0
8282
83+ /**
84+ * Contains all registered query builder classes.
85+ */
86+ private static queryBuilderRegistry : Record < string , any > = { }
87+
8388 // -------------------------------------------------------------------------
8489 // Constructor
8590 // -------------------------------------------------------------------------
@@ -179,12 +184,9 @@ export abstract class QueryBuilder<Entity extends ObjectLiteral> {
179184 ]
180185 }
181186
182- // loading it dynamically because of circular issue
183- const SelectQueryBuilderCls =
184- require ( "./SelectQueryBuilder" ) . SelectQueryBuilder
185187 if ( InstanceChecker . isSelectQueryBuilder ( this ) ) return this as any
186188
187- return new SelectQueryBuilderCls ( this )
189+ return QueryBuilder . queryBuilderRegistry [ "SelectQueryBuilder" ] ( this )
188190 }
189191
190192 /**
@@ -193,12 +195,9 @@ export abstract class QueryBuilder<Entity extends ObjectLiteral> {
193195 insert ( ) : InsertQueryBuilder < Entity > {
194196 this . expressionMap . queryType = "insert"
195197
196- // loading it dynamically because of circular issue
197- const InsertQueryBuilderCls =
198- require ( "./InsertQueryBuilder" ) . InsertQueryBuilder
199198 if ( InstanceChecker . isInsertQueryBuilder ( this ) ) return this as any
200199
201- return new InsertQueryBuilderCls ( this )
200+ return QueryBuilder . queryBuilderRegistry [ "InsertQueryBuilder" ] ( this )
202201 }
203202
204203 /**
@@ -256,12 +255,9 @@ export abstract class QueryBuilder<Entity extends ObjectLiteral> {
256255 this . expressionMap . queryType = "update"
257256 this . expressionMap . valuesSet = updateSet
258257
259- // loading it dynamically because of circular issue
260- const UpdateQueryBuilderCls =
261- require ( "./UpdateQueryBuilder" ) . UpdateQueryBuilder
262258 if ( InstanceChecker . isUpdateQueryBuilder ( this ) ) return this as any
263259
264- return new UpdateQueryBuilderCls ( this )
260+ return QueryBuilder . queryBuilderRegistry [ "UpdateQueryBuilder" ] ( this )
265261 }
266262
267263 /**
@@ -270,34 +266,25 @@ export abstract class QueryBuilder<Entity extends ObjectLiteral> {
270266 delete ( ) : DeleteQueryBuilder < Entity > {
271267 this . expressionMap . queryType = "delete"
272268
273- // loading it dynamically because of circular issue
274- const DeleteQueryBuilderCls =
275- require ( "./DeleteQueryBuilder" ) . DeleteQueryBuilder
276269 if ( InstanceChecker . isDeleteQueryBuilder ( this ) ) return this as any
277270
278- return new DeleteQueryBuilderCls ( this )
271+ return QueryBuilder . queryBuilderRegistry [ "DeleteQueryBuilder" ] ( this )
279272 }
280273
281274 softDelete ( ) : SoftDeleteQueryBuilder < any > {
282275 this . expressionMap . queryType = "soft-delete"
283276
284- // loading it dynamically because of circular issue
285- const SoftDeleteQueryBuilderCls =
286- require ( "./SoftDeleteQueryBuilder" ) . SoftDeleteQueryBuilder
287277 if ( InstanceChecker . isSoftDeleteQueryBuilder ( this ) ) return this as any
288278
289- return new SoftDeleteQueryBuilderCls ( this )
279+ return QueryBuilder . queryBuilderRegistry [ "SoftDeleteQueryBuilder" ] ( this )
290280 }
291281
292282 restore ( ) : SoftDeleteQueryBuilder < any > {
293283 this . expressionMap . queryType = "restore"
294284
295- // loading it dynamically because of circular issue
296- const SoftDeleteQueryBuilderCls =
297- require ( "./SoftDeleteQueryBuilder" ) . SoftDeleteQueryBuilder
298285 if ( InstanceChecker . isSoftDeleteQueryBuilder ( this ) ) return this as any
299286
300- return new SoftDeleteQueryBuilderCls ( this )
287+ return QueryBuilder . queryBuilderRegistry [ "SoftDeleteQueryBuilder" ] ( this )
301288 }
302289
303290 /**
@@ -335,12 +322,9 @@ export abstract class QueryBuilder<Entity extends ObjectLiteral> {
335322 this . expressionMap . setMainAlias ( mainAlias )
336323 }
337324
338- // loading it dynamically because of circular issue
339- const RelationQueryBuilderCls =
340- require ( "./RelationQueryBuilder" ) . RelationQueryBuilder
341325 if ( InstanceChecker . isRelationQueryBuilder ( this ) ) return this as any
342326
343- return new RelationQueryBuilderCls ( this )
327+ return QueryBuilder . queryBuilderRegistry [ "RelationQueryBuilder" ] ( this )
344328 }
345329
346330 /**
@@ -1650,4 +1634,8 @@ export abstract class QueryBuilder<Entity extends ObjectLiteral> {
16501634 protected hasCommonTableExpressions ( ) : boolean {
16511635 return this . expressionMap . commonTableExpressions . length > 0
16521636 }
1637+
1638+ static registerQueryBuilderClass ( name : string , factory : any ) {
1639+ QueryBuilder . queryBuilderRegistry [ name ] = factory
1640+ }
16531641}
0 commit comments