Skip to content

Commit

Permalink
restructure the inherit structure
Browse files Browse the repository at this point in the history
  • Loading branch information
invisal committed Oct 14, 2024
1 parent caa8623 commit 5d71d7b
Show file tree
Hide file tree
Showing 8 changed files with 75 additions and 48 deletions.
28 changes: 14 additions & 14 deletions src/client.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Connection, QueryResult } from './connections';
import { Query, constructRawQuery } from './query';
import { QueryParams, QueryType } from './query-params';
import { SqlConnection, QueryResult } from './connections';
import { Query } from './query';
import { QueryType } from './query-params';
import { AbstractDialect, ColumnDataType } from './query-builder';

export enum QueryBuilderAction {
Expand Down Expand Up @@ -153,9 +153,9 @@ function whereImplementation(state: QueryBuilderInternal, args: unknown[]) {
abstract class IQueryBuilder {
abstract state: QueryBuilderInternal;

protected connection: Connection;
protected connection: SqlConnection;

constructor(connection: Connection) {
constructor(connection: SqlConnection) {
this.connection = connection;
}

Expand Down Expand Up @@ -186,7 +186,7 @@ function createBlankState(action: QueryBuilderAction): QueryBuilderInternal {
class QueryBuilderSelect extends IQueryBuilder {
state: QueryBuilderInternal = createBlankState(QueryBuilderAction.SELECT);

constructor(connection: Connection, columnNames: string[]) {
constructor(connection: SqlConnection, columnNames: string[]) {
super(connection);
this.state.selectColumns = columnNames;
}
Expand Down Expand Up @@ -232,7 +232,7 @@ class QueryBuilderSelect extends IQueryBuilder {
class QueryBuilderInsert extends IQueryBuilder {
state: QueryBuilderInternal = createBlankState(QueryBuilderAction.INSERT);

constructor(connection: Connection, data: Record<string, unknown>) {
constructor(connection: SqlConnection, data: Record<string, unknown>) {
super(connection);
this.state.data = data;
}
Expand All @@ -246,7 +246,7 @@ class QueryBuilderInsert extends IQueryBuilder {
class QueryBuilderUpdate extends IQueryBuilder {
state: QueryBuilderInternal = createBlankState(QueryBuilderAction.UPDATE);

constructor(connection: Connection, data: Record<string, unknown>) {
constructor(connection: SqlConnection, data: Record<string, unknown>) {
super(connection);
this.state.data = data;
}
Expand Down Expand Up @@ -274,7 +274,7 @@ class QueryBuilderCreateTable extends IQueryBuilder {
QueryBuilderAction.CREATE_TABLE
);

constructor(connection: Connection, tableName: string) {
constructor(connection: SqlConnection, tableName: string) {
super(connection);
this.state.table = tableName;
}
Expand All @@ -299,7 +299,7 @@ class QueryBuilderDropTable extends IQueryBuilder {
QueryBuilderAction.DELETE_TABLE
);

constructor(connection: Connection, tableName: string) {
constructor(connection: SqlConnection, tableName: string) {
super(connection);
this.state.table = tableName;
}
Expand All @@ -310,7 +310,7 @@ class QueryBuilderAlterTable extends IQueryBuilder {
QueryBuilderAction.ALTER_TABLE
);

constructor(connection: Connection, tableName: string) {
constructor(connection: SqlConnection, tableName: string) {
super(connection);
this.state.table = tableName;
}
Expand All @@ -334,9 +334,9 @@ class QueryBuilderAlterTable extends IQueryBuilder {
}

class QueryBuilder {
connection: Connection;
connection: SqlConnection;

constructor(connection: Connection) {
constructor(connection: SqlConnection) {
this.connection = connection;
}

Expand Down Expand Up @@ -399,7 +399,7 @@ class QueryBuilder {
}
}

export function Outerbase(connection: Connection) {
export function Outerbase(connection: SqlConnection) {
return new QueryBuilder(connection);
}

Expand Down
5 changes: 3 additions & 2 deletions src/connections/bigquery.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { QueryType } from '../query-params';
import { Query, constructRawQuery } from '../query';
import { Connection } from './index';
import { Connection, SqlConnection } from './index';
import { Database, Table, TableColumn } from '../models/database';
import { BigQueryDialect } from '../query-builder/dialects/bigquery';
import { BigQuery } from '@google-cloud/bigquery';

export class BigQueryConnection implements Connection {
export class BigQueryConnection extends SqlConnection {
bigQuery: BigQuery;

// Default query type to positional for BigQuery
Expand All @@ -21,6 +21,7 @@ export class BigQueryConnection implements Connection {
* @param region - Region for your dataset
*/
constructor(bigQuery: BigQuery) {
super();
this.bigQuery = bigQuery;
}

Expand Down
37 changes: 32 additions & 5 deletions src/connections/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { QueryType } from '../query-params';
import { Query } from '../query';
import { Database } from '../models/database';
import { AbstractDialect } from 'src/query-builder';
import { Outerbase } from 'src/client';

export type OperationResponse = {
success: boolean;
Expand All @@ -16,17 +17,43 @@ export interface QueryResult<T = Record<string, unknown>> {
}

export abstract class Connection {
abstract dialect: AbstractDialect;

// Handles logic for securely connecting and properly disposing of the connection.
abstract connect(): Promise<any>;
abstract disconnect(): Promise<any>;

// Raw query execution method that can be used to execute any query.
// Retrieve metadata about the database, useful for introspection.
abstract fetchDatabaseSchema(): Promise<Database>;

abstract renameColumn(
schemaName: string | undefined,
tableName: string,
columnName: string,
newColumnName: string
): Promise<void>;
}

export abstract class SqlConnection extends Connection {
abstract dialect: AbstractDialect;

abstract query<T = Record<string, unknown>>(
query: Query
): Promise<QueryResult<T>>;

// Retrieve metadata about the database, useful for introspection.
abstract fetchDatabaseSchema(): Promise<Database>;
async renameColumn(
schemaName: string | undefined,
tableName: string,
columnName: string,
newColumnName: string
): Promise<void> {
const qb = Outerbase(this);

this.query(
qb
.alterTable(
schemaName ? `${schemaName}.${tableName}` : tableName
)
.renameColumn(columnName, newColumnName)
.toQuery()
);
}
}
5 changes: 3 additions & 2 deletions src/connections/mysql.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { QueryError, type Connection, type RowDataPacket } from 'mysql2';
import { Connection as BaseConnection, QueryResult } from '.';
import { QueryResult, SqlConnection } from '.';
import { constructRawQuery, Query } from '../query';
import { QueryType } from '../query-params';
import { Constraint, Database, Table, TableColumn } from './../models/database';
Expand Down Expand Up @@ -177,12 +177,13 @@ export function buildMySQLDatabaseSchmea({
return result;
}

export class MySQLConnection implements BaseConnection {
export class MySQLConnection extends SqlConnection {
protected conn: Connection;
public dialect = new MySQLDialect();
queryType = QueryType.positional;

constructor(conn: Connection) {
super();
this.conn = conn;
}

Expand Down
5 changes: 3 additions & 2 deletions src/connections/postgresql.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Client } from 'pg';
import { Connection, QueryResult } from '.';
import { Connection, QueryResult, SqlConnection } from '.';
import { Query } from '../query';
import { AbstractDialect } from 'src/query-builder';
import { PostgresDialect } from 'src/query-builder/dialects/postgres';
Expand All @@ -12,12 +12,13 @@ function replacePlaceholders(query: string): string {
return query.replace(/\?/g, () => `$${index++}`);
}

export class PostgreSQLConnection implements Connection {
export class PostgreSQLConnection extends SqlConnection {
client: Client;
dialect: AbstractDialect = new PostgresDialect();
queryType: QueryType = QueryType.positional;

constructor(pgClient: Client) {
super();
this.client = pgClient;
}

Expand Down
4 changes: 2 additions & 2 deletions src/connections/sqlite/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import {
Database,
Table,
} from 'src/models/database';
import { Connection } from '..';
import { Connection, SqlConnection } from '..';

export abstract class SqliteBaseConnection extends Connection {
export abstract class SqliteBaseConnection extends SqlConnection {
public async fetchDatabaseSchema(): Promise<Database> {
const exclude_tables = [
'_cf_kv',
Expand Down
35 changes: 16 additions & 19 deletions tests/connections/connection.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Outerbase } from '../../src';
import { Outerbase, SqlConnection } from '../../src';
import createTestClient from './create-test-connection';

const { client: db, defaultSchema: DEFAULT_SCHEMA } = createTestClient();
const qb = Outerbase(db);
const qb = Outerbase(db as SqlConnection);

beforeAll(async () => {
await db.connect();
Expand Down Expand Up @@ -128,21 +128,18 @@ describe('Database Connection', () => {
]);
});

// test('Rename table column', async () => {
// await qb
// .alterTable(`${DEFAULT_SCHEMA}.persons`)
// .renameColumn('name', 'full_name')
// .query();

// const { data } = await qb
// .select()
// .from(`${DEFAULT_SCHEMA}.persons`)
// .orderBy('id')
// .query();

// expect(data).toEqual([
// { id: 1, full_name: 'Visal In', age: 25 },
// { id: 2, full_name: 'Outerbase', age: 30 },
// ]);
// });
test('Rename table column', async () => {
await db.renameColumn(DEFAULT_SCHEMA, 'persons', 'name', 'full_name');

const { data } = await qb
.select()
.from(`${DEFAULT_SCHEMA}.persons`)
.orderBy('id')
.query();

expect(data).toEqual([
{ id: 1, full_name: 'Visal In', age: 25 },
{ id: 2, full_name: 'Outerbase', age: 30 },
]);
});
});
4 changes: 2 additions & 2 deletions tests/units/query-builder/postgre.test.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { describe, expect, test } from '@jest/globals';
import { Connection, Outerbase } from '../../../src';
import { Outerbase, SqlConnection } from '../../../src';
import { DefaultDialect } from '../../../src/query-builder/dialects/default';

function qb() {
return Outerbase({
dialect: new DefaultDialect(),
} as Connection);
} as SqlConnection);
}

describe('Query Builder - Postgre Dialect', () => {
Expand Down

0 comments on commit 5d71d7b

Please sign in to comment.