From 438e6e48b68083e621eb8402d86fe6d8ad86b424 Mon Sep 17 00:00:00 2001 From: Matthew <38759997+friendlymatthew@users.noreply.github.com> Date: Wed, 31 Jan 2024 18:11:41 -0500 Subject: [PATCH] memory conservation --- src/db/query-builder.ts | 59 +++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/src/db/query-builder.ts b/src/db/query-builder.ts index 43a4efbe..f5e2c4dc 100644 --- a/src/db/query-builder.ts +++ b/src/db/query-builder.ts @@ -19,13 +19,12 @@ export class QueryBuilder { constructor(private database: Database) {} /** - * clone ensures each method call that modifies the query returns a new instance. This ensures each query has it's own unique state. + * Retrieves an immutable copy of the current query. * - * @returns {QueryBuilder} The QueryBuilder instance. + * @returns {Query} The Query instance. */ - private clone(): QueryBuilder { - const clone = new QueryBuilder(this.database); - clone.queryObject = { + toQuery(): Query { + return { where: this.queryObject.where ? [...this.queryObject.where] : [], orderBy: this.queryObject.orderBy ? [...this.queryObject.orderBy] @@ -35,16 +34,6 @@ export class QueryBuilder { : undefined, limit: this.queryObject.limit, }; - return clone; - } - - /** - * Retrieves an immutable copy of the current query. - * - * @returns {Query} The Query instance. - */ - toQuery(): Query { - return this.clone().queryObject; } /** @@ -67,11 +56,13 @@ export class QueryBuilder { operation: WhereNode["operation"], value: T[keyof T] ): QueryBuilder { - const currQuery = this.clone(); - currQuery.queryObject.where?.push({ key, operation, value }); - return currQuery; + const newQuery = new QueryBuilder(this.database); + newQuery.queryObject = { + ...this.queryObject, + where: [...(this.queryObject.where || []), { key, operation, value }], + }; + return newQuery; } - /** * Adds an 'orderBy' clause to the query. * @@ -80,12 +71,12 @@ export class QueryBuilder { * @returns {QueryBuilder} The QueryBuilder instance. */ orderBy(key: keyof T, direction: OrderBy["direction"]): QueryBuilder { - const currQuery = this.clone(); - currQuery.queryObject.orderBy - ? currQuery.queryObject.orderBy.push({ key, direction }) - : (currQuery.queryObject.orderBy = [{ key, direction }]); - - return currQuery; + const newQuery = new QueryBuilder(this.database); + newQuery.queryObject = { + ...this.queryObject, + orderBy: [...(this.queryObject.orderBy || []), { key, direction }], + }; + return newQuery; } /** @@ -95,9 +86,12 @@ export class QueryBuilder { * @returns {QueryBuilder} The QueryBuilder instance. */ select(keys: (keyof T)[]): QueryBuilder { - const currQuery = this.clone(); - currQuery.queryObject.select = keys; - return currQuery; + const newQuery = new QueryBuilder(this.database); + newQuery.queryObject = { + ...this.queryObject, + select: keys, + }; + return newQuery; } /** @@ -107,8 +101,11 @@ export class QueryBuilder { * @returns {QueryBuilder} The QueryBuilder instance. */ limit(limit: number): QueryBuilder { - const currQuery = this.clone(); - currQuery.queryObject.limit = limit; - return currQuery; + const newQuery = new QueryBuilder(this.database); + newQuery.queryObject = { + ...this.queryObject, + limit: limit, + }; + return newQuery; } }