diff --git a/src/client.ts b/src/client.ts index 37c20eb..4198174 100644 --- a/src/client.ts +++ b/src/client.ts @@ -61,6 +61,7 @@ export interface QueryBuilderInternal { oldName?: string; newName?: string; }[]; + whereClauses: WhereClaues; joins?: string[]; data?: Record; @@ -304,6 +305,34 @@ class QueryBuilderDropTable extends IQueryBuilder { } } +class QueryBuilderAlterTable extends IQueryBuilder { + state: QueryBuilderInternal = createBlankState( + QueryBuilderAction.ALTER_TABLE + ); + + constructor(connection: Connection, tableName: string) { + super(connection); + this.state.table = tableName; + } + + renameTable(newTableName: string) { + this.state.originalValue = this.state.table; + this.state.newValue = newTableName; + return this; + } + + renameColumn(columnName: string, newColumnName: string) { + this.state.action = QueryBuilderAction.RENAME_COLUMNS; + this.state.columns = [ + { + oldName: columnName, + newName: newColumnName, + }, + ]; + return this; + } +} + class QueryBuilder { connection: Connection; @@ -331,6 +360,10 @@ class QueryBuilder { return new QueryBuilderDropTable(this.connection, tableName); } + alterTable(tableName: string) { + return new QueryBuilderAlterTable(this.connection, tableName); + } + or( ...args: (WhereClaues | WhereCondition | WhereGenerator)[] ): WhereGenerator { @@ -421,13 +454,8 @@ function buildQueryString( // query // ).query; // break; - // case QueryBuilderAction.RENAME_COLUMNS: - // query.query = dialect.renameColumn( - // queryBuilder, - // queryType, - // query - // ).query; - // break; + case QueryBuilderAction.RENAME_COLUMNS: + return dialect.renameColumn(queryBuilder); // case QueryBuilderAction.UPDATE_COLUMNS: // query.query = dialect.updateColumn( // queryBuilder, diff --git a/src/query-builder/index.ts b/src/query-builder/index.ts index c1c5d34..380c9f3 100644 --- a/src/query-builder/index.ts +++ b/src/query-builder/index.ts @@ -1,4 +1,3 @@ -import { QueryType } from '../query-params'; import { OrderByClause, QueryBuilderInternal, @@ -16,6 +15,7 @@ interface Dialect { // delete(builder: QueryBuilderInternal): Query; createTable(builder: QueryBuilderInternal): Query; dropTable(builder: QueryBuilderInternal): Query; + renameColumn(builder: QueryBuilderInternal): Query; } export enum ColumnDataType { @@ -320,6 +320,35 @@ export abstract class AbstractDialect implements Dialect { }; } + renameColumn(builder: QueryBuilderInternal): Query { + const tableName = builder.table; + + if (!tableName) { + throw new Error( + 'Table name is required to build a CREATE TABLE query.' + ); + } + + if (builder.columns.length !== 1) { + throw new Error('Exactly one column is required to rename.'); + } + + const column = builder.columns[0]; + + if (!column.oldName) { + throw new Error('Old column name is required to rename.'); + } + + if (!column.newName) { + throw new Error('New column name is required to rename.'); + } + + return { + query: `ALTER TABLE ${this.escapeId(tableName)} RENAME COLUMN ${this.escapeId(column.oldName)} TO ${this.escapeId(column.newName)}`, + parameters: [], + }; + } + // delete( // builder: QueryBuilderInternal, // ): Query { diff --git a/tests/connections/connection.test.ts b/tests/connections/connection.test.ts index 6118ef3..d157718 100644 --- a/tests/connections/connection.test.ts +++ b/tests/connections/connection.test.ts @@ -102,4 +102,22 @@ describe('Database Connection', () => { { id: 2, name: 'Outerbase', age: 30 }, ]); }); + + test('Rename table column', async () => { + await qb + .alterTable('persons') + .renameColumn('name', 'full_name') + .query(); + + const { data } = await qb + .select() + .from('persons') + .orderBy('id') + .query(); + + expect(data).toEqual([ + { id: 1, full_name: 'Visal In', age: 25 }, + { id: 2, full_name: 'Outerbase', age: 30 }, + ]); + }); }); diff --git a/tests/units/query-builder/postgre.test.ts b/tests/units/query-builder/postgre.test.ts index a54ceb0..87c635b 100644 --- a/tests/units/query-builder/postgre.test.ts +++ b/tests/units/query-builder/postgre.test.ts @@ -248,4 +248,15 @@ describe('Query Builder - Postgre Dialect', () => { const { query } = qb().dropTable('persons').toQuery(); expect(query).toBe('DROP TABLE IF EXISTS "persons"'); }); + + test('Rename column', () => { + const { query } = qb() + .alterTable('persons') + .renameColumn('first_name', 'full_name') + .toQuery(); + + expect(query).toBe( + 'ALTER TABLE "persons" RENAME COLUMN "first_name" TO "full_name"' + ); + }); });