2025-03-23 21:00:08 +01:00

139 lines
3.4 KiB
JavaScript

/* eslint max-len:0 */
// View Compiler
// -------
const { pushQuery } = require('./internal/helpers');
const groupBy = require('lodash/groupBy');
const { columnize: columnize_ } = require('../formatter/wrappingFormatter');
class ViewCompiler {
constructor(client, viewBuilder) {
this.client = client;
this.viewBuilder = viewBuilder;
this._commonBuilder = this.viewBuilder;
this.method = viewBuilder._method;
this.schemaNameRaw = viewBuilder._schemaName;
this.viewNameRaw = viewBuilder._viewName;
this.single = viewBuilder._single;
this.selectQuery = viewBuilder._selectQuery;
this.columns = viewBuilder._columns;
this.grouped = groupBy(viewBuilder._statements, 'grouping');
this.formatter = client.formatter(viewBuilder);
this.bindings = [];
this.formatter.bindings = this.bindings;
this.bindingsHolder = this;
this.sequence = [];
}
// Convert the tableCompiler toSQL
toSQL() {
this[this.method]();
return this.sequence;
}
// Column Compilation
// -------
create() {
this.createQuery(this.columns, this.selectQuery);
}
createOrReplace() {
throw new Error('replace views is not supported by this dialect.');
}
createMaterializedView() {
throw new Error('materialized views are not supported by this dialect.');
}
createQuery(columns, selectQuery, materialized, replace) {
const createStatement =
'create ' +
(materialized ? 'materialized ' : '') +
(replace ? 'or replace ' : '') +
'view ';
const columnList = columns
? ' (' +
columnize_(
columns,
this.viewBuilder,
this.client,
this.bindingsHolder
) +
')'
: '';
let sql = createStatement + this.viewName() + columnList;
sql += ' as ';
sql += selectQuery.toString();
switch (this.single.checkOption) {
case 'default_option':
sql += ' with check option';
break;
case 'local':
sql += ' with local check option';
break;
case 'cascaded':
sql += ' with cascaded check option';
break;
default:
break;
}
this.pushQuery({
sql,
});
}
renameView(from, to) {
throw new Error(
'rename view is not supported by this dialect (instead drop, then create another view).'
);
}
refreshMaterializedView() {
throw new Error('materialized views are not supported by this dialect.');
}
alter() {
this.alterView();
}
alterView() {
const alterView = this.grouped.alterView || [];
for (let i = 0, l = alterView.length; i < l; i++) {
const statement = alterView[i];
if (this[statement.method]) {
this[statement.method].apply(this, statement.args);
} else {
this.client.logger.error(`Debug: ${statement.method} does not exist`);
}
}
for (const item in this.single) {
if (typeof this[item] === 'function') this[item](this.single[item]);
}
}
renameColumn(from, to) {
throw new Error('rename column of views is not supported by this dialect.');
}
defaultTo(column, defaultValue) {
throw new Error(
'change default values of views is not supported by this dialect.'
);
}
viewName() {
const name = this.schemaNameRaw
? `${this.schemaNameRaw}.${this.viewNameRaw}`
: this.viewNameRaw;
return this.formatter.wrap(name);
}
}
ViewCompiler.prototype.pushQuery = pushQuery;
module.exports = ViewCompiler;