import {JoinOperator, TableRef, WhereStatement} from '../../types.ts' import {TableRefBuilder} from '../TableRefBuilder.ts' import {applyMixins} from '../../../../../lib/src/support/mixins.ts' import {WhereBuilder} from '../WhereBuilder.ts' import {Scope} from '../../Scope.ts' /** * Query builder class which builds JOIN clauses. */ export class Join { /** * The join operator to use in the SQL. * @type JoinOperator */ public readonly operator: JoinOperator = 'JOIN' /** * The where statements applied to this join. (i.e. JOIN table ON ...) * @type Array */ protected _wheres: WhereStatement[] = [] /** * The scopes applied to this join. * @type Array */ protected _scopes: Scope[] = [] constructor( /** * The table ref being joined. * @type TableRef */ public readonly table_ref: TableRef ) {} /** * Serialize the join to raw SQL. * @param level */ sql(level = 0): string { const indent = Array(level * 2).fill(' ').join('') return [ `${this.operator} ${this.serialize_table_ref(this.table_ref)}`, ...[this._wheres.length > 0 ? ['ON'] : []], this.wheres_to_sql(this._wheres, level), ].filter(Boolean).join(`\n${indent}`) } } export interface Join extends TableRefBuilder, WhereBuilder {} applyMixins(Join, [TableRefBuilder, WhereBuilder])