From 9f3dbe39f3c16bdd2a891690d2a8952a2ece4ff1 Mon Sep 17 00:00:00 2001 From: Drew Immerman <30954849+DrewImm@users.noreply.github.com> Date: Tue, 9 Jul 2024 18:21:57 -0400 Subject: [PATCH] #130 Add support for date() (#132) --- src/dml/query-builder.ts | 20 +++++++++++++++ src/functions/function-token.ts | 1 + src/functions/functions.ts | 11 +++++++++ test/spec/functions/date.spec.ts | 42 ++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 test/spec/functions/date.spec.ts diff --git a/src/dml/query-builder.ts b/src/dml/query-builder.ts index 29d5f3e..2a07adc 100644 --- a/src/dml/query-builder.ts +++ b/src/dml/query-builder.ts @@ -829,6 +829,10 @@ export class DatabaseQueryBuilder extends StatementBuilder { this.currentTimestamp(fn); break; + case DatabaseFunctionKeys.DATE: + this.date(fn); + break; + case DatabaseFunctionKeys.YEAR: this.year(fn); break; @@ -921,6 +925,22 @@ export class DatabaseQueryBuilder extends StatementBuilder { return this; } + public date(fn: DatabaseFunction): this { + this.sql.append('date'); + this.sql.openParens(); + + if (fn.params?.expr) { + this.expression(fn.params.expr); + } + else { + this.expression(DatabaseFunctions.currentTimestamp()); + } + + this.sql.closeParens(); + + return this; + } + public year(fn: DatabaseFunction): this { this.sql.append('year'); this.sql.openParens(); diff --git a/src/functions/function-token.ts b/src/functions/function-token.ts index 9479f96..ed47841 100644 --- a/src/functions/function-token.ts +++ b/src/functions/function-token.ts @@ -15,6 +15,7 @@ export enum DatabaseFunctionKeys { MAX, SUM, CURRENT_TIMESTAMP, + DATE, YEAR, UUID, } diff --git a/src/functions/functions.ts b/src/functions/functions.ts index bda6072..72a6e07 100644 --- a/src/functions/functions.ts +++ b/src/functions/functions.ts @@ -96,6 +96,17 @@ export class DatabaseFunctions { }; } + public static date( + expr?: Expression + ): DatabaseFunctionToken { + return { + riao_expr: ExpressionTokenKey.FUNCTION_CALL, + fn: DatabaseFunctionKeys.DATE, + type: ColumnType.DATE, + params: { expr }, + }; + } + public static year( expr?: Expression ): DatabaseFunctionToken { diff --git a/test/spec/functions/date.spec.ts b/test/spec/functions/date.spec.ts new file mode 100644 index 0000000..b480602 --- /dev/null +++ b/test/spec/functions/date.spec.ts @@ -0,0 +1,42 @@ +import 'jasmine'; +import { DatabaseFunctions } from '../../../src/functions'; +import { DatabaseQueryBuilder } from '../../../src/dml'; +import { columnName } from '../../../src/tokens'; + +describe('Function - date()', () => { + it('can select current date', async () => { + const { sql, params } = new DatabaseQueryBuilder() + .select({ + columns: [ + { + query: DatabaseFunctions.date( + DatabaseFunctions.currentTimestamp() + ), + as: 'date', + }, + ], + }) + .toDatabaseQuery(); + + expect(sql).toEqual('SELECT date(CURRENT_TIMESTAMP) AS "date"'); + expect(params).toEqual([]); + }); + + it('can select from column name', async () => { + const { sql, params } = new DatabaseQueryBuilder() + .select({ + columns: [ + { + query: DatabaseFunctions.date( + columnName('create_timestamp') + ), + as: 'date', + }, + ], + }) + .toDatabaseQuery(); + + expect(sql).toEqual('SELECT date("create_timestamp") AS "date"'); + expect(params).toEqual([]); + }); +});