113 lines
3.1 KiB
JavaScript
113 lines
3.1 KiB
JavaScript
import { Column } from "./column.js";
|
|
import { entityKind, is } from "./entity.js";
|
|
import { SQL, sql } from "./sql/sql.js";
|
|
import { Table } from "./table.js";
|
|
import { ViewBaseConfig } from "./view-common.js";
|
|
class ColumnAliasProxyHandler {
|
|
constructor(table) {
|
|
this.table = table;
|
|
}
|
|
static [entityKind] = "ColumnAliasProxyHandler";
|
|
get(columnObj, prop) {
|
|
if (prop === "table") {
|
|
return this.table;
|
|
}
|
|
return columnObj[prop];
|
|
}
|
|
}
|
|
class TableAliasProxyHandler {
|
|
constructor(alias, replaceOriginalName) {
|
|
this.alias = alias;
|
|
this.replaceOriginalName = replaceOriginalName;
|
|
}
|
|
static [entityKind] = "TableAliasProxyHandler";
|
|
get(target, prop) {
|
|
if (prop === Table.Symbol.IsAlias) {
|
|
return true;
|
|
}
|
|
if (prop === Table.Symbol.Name) {
|
|
return this.alias;
|
|
}
|
|
if (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {
|
|
return this.alias;
|
|
}
|
|
if (prop === ViewBaseConfig) {
|
|
return {
|
|
...target[ViewBaseConfig],
|
|
name: this.alias,
|
|
isAlias: true
|
|
};
|
|
}
|
|
if (prop === Table.Symbol.Columns) {
|
|
const columns = target[Table.Symbol.Columns];
|
|
if (!columns) {
|
|
return columns;
|
|
}
|
|
const proxiedColumns = {};
|
|
Object.keys(columns).map((key) => {
|
|
proxiedColumns[key] = new Proxy(
|
|
columns[key],
|
|
new ColumnAliasProxyHandler(new Proxy(target, this))
|
|
);
|
|
});
|
|
return proxiedColumns;
|
|
}
|
|
const value = target[prop];
|
|
if (is(value, Column)) {
|
|
return new Proxy(value, new ColumnAliasProxyHandler(new Proxy(target, this)));
|
|
}
|
|
return value;
|
|
}
|
|
}
|
|
class RelationTableAliasProxyHandler {
|
|
constructor(alias) {
|
|
this.alias = alias;
|
|
}
|
|
static [entityKind] = "RelationTableAliasProxyHandler";
|
|
get(target, prop) {
|
|
if (prop === "sourceTable") {
|
|
return aliasedTable(target.sourceTable, this.alias);
|
|
}
|
|
return target[prop];
|
|
}
|
|
}
|
|
function aliasedTable(table, tableAlias) {
|
|
return new Proxy(table, new TableAliasProxyHandler(tableAlias, false));
|
|
}
|
|
function aliasedRelation(relation, tableAlias) {
|
|
return new Proxy(relation, new RelationTableAliasProxyHandler(tableAlias));
|
|
}
|
|
function aliasedTableColumn(column, tableAlias) {
|
|
return new Proxy(
|
|
column,
|
|
new ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false)))
|
|
);
|
|
}
|
|
function mapColumnsInAliasedSQLToAlias(query, alias) {
|
|
return new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);
|
|
}
|
|
function mapColumnsInSQLToAlias(query, alias) {
|
|
return sql.join(query.queryChunks.map((c) => {
|
|
if (is(c, Column)) {
|
|
return aliasedTableColumn(c, alias);
|
|
}
|
|
if (is(c, SQL)) {
|
|
return mapColumnsInSQLToAlias(c, alias);
|
|
}
|
|
if (is(c, SQL.Aliased)) {
|
|
return mapColumnsInAliasedSQLToAlias(c, alias);
|
|
}
|
|
return c;
|
|
}));
|
|
}
|
|
export {
|
|
ColumnAliasProxyHandler,
|
|
RelationTableAliasProxyHandler,
|
|
TableAliasProxyHandler,
|
|
aliasedRelation,
|
|
aliasedTable,
|
|
aliasedTableColumn,
|
|
mapColumnsInAliasedSQLToAlias,
|
|
mapColumnsInSQLToAlias
|
|
};
|
|
//# sourceMappingURL=alias.js.map
|