From 1e19aee5166fccc2a5d01eed6f20168ef1e631e2 Mon Sep 17 00:00:00 2001 From: woutervanbakel Date: Thu, 18 Mar 2021 17:06:33 +0100 Subject: [PATCH] feat(sql): add separate limit and top api --- src/sql/Select.ts | 17 ++++++++++++----- test/sql/Select.test.ts | 7 ++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/sql/Select.ts b/src/sql/Select.ts index 969d3a78..ad457a7c 100644 --- a/src/sql/Select.ts +++ b/src/sql/Select.ts @@ -7,7 +7,8 @@ import { Table } from './Table'; export class Select extends SqlQuery { protected ordered: List = list(); protected grouped: List = list(); - protected top = 0; + protected topped = 0; + protected limited = 0; constructor(table: Table | Join, readonly columns: List = list()) { super(table); @@ -28,20 +29,26 @@ export class Select extends SqlQuery { return this; } - limit(limit: number): this { - this.top = limit; + top(t: number): this { + this.topped = t; + return this; + } + + limit(l: number): this { + this.limited = l; return this; } toString(): string { return ( `SELECT ` + - ifGet(this.top, `TOP ${this.top} `, '') + + ifGet(this.topped, `TOP ${this.topped} `, '') + ifGet(this.columns.length, this.columns.join(`, `), '*') + ` FROM ${this.table}` + ifGet(this.clauses.length, ` WHERE ${this.clauses.join(` AND `)}`, '') + ifGet(this.grouped.length, ` GROUP BY ${this.grouped.join(`, `)}`, '') + - ifGet(this.ordered.length, ` ORDERED BY ${this.ordered.join(`, `)};`, ';') + ifGet(this.ordered.length, ` ORDERED BY ${this.ordered.join(`, `)}`, '') + + ifGet(this.limited, ` LIMIT ${this.limited};`, ';') ); } } diff --git a/test/sql/Select.test.ts b/test/sql/Select.test.ts index 0ae06355..47d46520 100644 --- a/test/sql/Select.test.ts +++ b/test/sql/Select.test.ts @@ -50,8 +50,13 @@ describe('Select', () => { expect(select).toMatchText('SELECT DevTable.Language, MAX(CodingLevel) AS Level FROM DevTable GROUP BY DevTable.Language;'); }); + test('With top', () => { + const select = devs.select(devs.language).top(100); + expect(select).toMatchText('SELECT TOP 100 DevTable.Language FROM DevTable;'); + }); + test('With limit', () => { const select = devs.select(devs.language).limit(100); - expect(select).toMatchText('SELECT TOP 100 DevTable.Language FROM DevTable;'); + expect(select).toMatchText('SELECT DevTable.Language FROM DevTable LIMIT 100;'); }); });