From ceac00b8def3be51c966379f8c7fc6056b04fb3e Mon Sep 17 00:00:00 2001 From: Drew Immerman Date: Sun, 14 Jan 2024 13:07:37 -0500 Subject: [PATCH] #41 Add support for sum() --- src/dml/query-builder.ts | 19 +++++++++++++++++ src/functions/function-token.ts | 1 + src/functions/functions.ts | 17 +++++++++++++++ test/spec/functions/sum.spec.ts | 38 +++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 test/spec/functions/sum.spec.ts diff --git a/src/dml/query-builder.ts b/src/dml/query-builder.ts index c9b47cd..d4e46f2 100644 --- a/src/dml/query-builder.ts +++ b/src/dml/query-builder.ts @@ -696,6 +696,10 @@ export class DatabaseQueryBuilder extends StatementBuilder { this.max(fn); break; + case DatabaseFunctionKeys.SUM: + this.sum(fn); + break; + case DatabaseFunctionKeys.CURRENT_TIMESTAMP: this.currentTimestamp(fn); break; @@ -732,6 +736,21 @@ export class DatabaseQueryBuilder extends StatementBuilder { return this; } + public sum(fn: DatabaseFunction): this { + this.sql.append('SUM'); + this.sql.openParens(); + + if (fn.params.options.distinct) { + this.distinctStatement(); + } + + this.expression(fn.params.expr); + + this.sql.closeParens(); + + return this; + } + public currentTimestamp(fn: DatabaseFunction): this { this.sql.append('CURRENT_TIMESTAMP'); diff --git a/src/functions/function-token.ts b/src/functions/function-token.ts index 15c7aec..cbf6deb 100644 --- a/src/functions/function-token.ts +++ b/src/functions/function-token.ts @@ -12,6 +12,7 @@ export enum DatabaseFunctionKeys { COUNT, MIN, MAX, + SUM, CURRENT_TIMESTAMP, } diff --git a/src/functions/functions.ts b/src/functions/functions.ts index e37c31c..eda9f21 100644 --- a/src/functions/functions.ts +++ b/src/functions/functions.ts @@ -34,6 +34,23 @@ export class DatabaseFunctions { }; } + public static sum( + expr: Expression, + options: { + distinct?: boolean; + } = {} + ): DatabaseFunctionToken { + return { + riao_expr: ExpressionTokenKey.FUNCTION_CALL, + fn: DatabaseFunctionKeys.SUM, + type: ColumnType.BIGINT, + params: { + expr, + options, + }, + }; + } + // ------------------------------------------------------------------------ // Date/Time functions // ------------------------------------------------------------------------ diff --git a/test/spec/functions/sum.spec.ts b/test/spec/functions/sum.spec.ts new file mode 100644 index 0000000..9bc4529 --- /dev/null +++ b/test/spec/functions/sum.spec.ts @@ -0,0 +1,38 @@ +import 'jasmine'; +import { DatabaseFunctions } from '../../../src/functions'; +import { DatabaseQueryBuilder } from '../../../src/dml'; +import { columnName } from '../../../src/tokens'; + +describe('Function - sum()', () => { + it('can select from number literal', async () => { + const { sql, params } = new DatabaseQueryBuilder() + .select({ + columns: [ + { + query: DatabaseFunctions.sum(1), + as: 'sum', + }, + ], + }) + .toDatabaseQuery(); + + expect(sql).toEqual('SELECT SUM(?) AS "sum"'); + expect(params).toEqual([1]); + }); + + it('can select from column name', async () => { + const { sql } = new DatabaseQueryBuilder() + .select({ + table: 'user', + columns: [ + { + query: DatabaseFunctions.sum(columnName('id')), + as: 'sum', + }, + ], + }) + .toDatabaseQuery(); + + expect(sql).toEqual('SELECT SUM("id") AS "sum" FROM "user"'); + }); +});