mirror of
https://github.com/xfarrow/blink
synced 2025-06-06 00:49:11 +02:00
139 lines
3.4 KiB
JavaScript
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;
|