@smallprod/models
Version:
204 lines (203 loc) • 7.67 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const global_db_1 = __importDefault(require("./global.db"));
class GlobalSqlModel extends global_db_1.default {
constructor() {
super(...arguments);
this.getWhereAttributes = (wheres) => {
const newWheres = wheres.filter((w) => this.isWhereAttribute(w));
return newWheres.reduce((prev, cur) => {
if (cur.value instanceof Array) {
cur.value.forEach((value) => {
prev.push(value);
});
}
else {
prev.push(cur.value);
}
return prev;
}, []);
};
this.computeAttributes = (attributes, escaper) => {
if (!attributes.length)
return ' *';
const query = attributes.map((a) => `${a.function
? `${this.computeAttributeFunction(a)}(${a.attribute})${a.alias ? ` AS ${a.alias}` : ''}`
: `${a.attribute}${a.alias ? ` AS ${a.alias}` : ''}`}`);
return ` ${query}`;
};
this.computeWhere = (wheres, keyword, number, escaper, name = 'WHERE', fromNumber = 0) => {
let where = wheres.length ? ` ${name} ` : '';
const alias = {
keyword,
number,
nb: fromNumber,
};
wheres.forEach((w) => {
if (this.isWhereAttribute(w)) {
w = w;
where = `${where} ${this.computeWhereAttribute(w, alias, escaper)}`;
}
else {
w = w;
where = `${where} ${this.computeWhereKeyWord(w)}`;
}
});
return where;
};
this.computeJoins = (joins, escaper, aliasKeyword) => {
let join = '';
joins.forEach((j) => {
join = `${join}${this.getJoinType(j)} ${escaper}${j.tableName}${escaper}${aliasKeyword ? ` ${aliasKeyword}` : ''} ${j.alias}${this.computeJoinWheres(j.wheres)} `;
});
return join;
};
this.computeGroupBy = (groups) => {
const group = groups.length ? ` GROUP BY ${groups.join(', ')}` : '';
return group;
};
this.computeSort = (sorts, escaper) => {
const sortsString = sorts
.map((s) => `${escaper}${s.attribute}${escaper} ${this.computeSortMode(s)}`)
.join(', ');
return sorts.length ? ` ORDER BY ${sortsString}` : '';
};
this.computeJoinWheres = (wheres) => {
let where = wheres.length ? ' ON ' : '';
wheres.forEach((w) => {
if (this.isWhereAttribute(w)) {
w = w;
where = `${where} ${w.column} ${w.operator} ${w.value} `;
}
else {
w = w;
where = `${where} ${this.computeWhereKeyWord(w)}`;
}
});
return where;
};
this.getJoinType = (join) => {
switch (join.method) {
case 'inner':
return 'INNER JOIN';
case 'left':
return 'LEFT JOIN';
case 'right':
return 'RIGHT JOIN';
default:
throw new Error(`Unknown join method ${join.method}`);
}
};
this.computeAttributeFunction = (attribute) => {
switch (attribute.function) {
case 'AVG': {
return 'AVG';
}
case 'COUNT': {
return 'COUNT';
}
case 'MAX': {
return 'MAX';
}
case 'MIN': {
return 'MIN';
}
case 'SUM': {
return 'SUM';
}
default: {
throw new Error(`Unknown function ${attribute.function}`);
}
}
};
this.computeSortMode = (sort) => {
switch (sort.mode) {
case 'ASC': {
return 'ASC';
}
case 'DESC': {
return 'DESC';
}
default: {
throw new Error(`Unkonwn sort mode ${sort.mode}`);
}
}
};
this.isWhereAttribute = (where) => {
return 'operator' in where;
};
this.computeWhereAttribute = (attribute, alias, escaper) => {
switch (attribute.operator) {
case '<': {
alias.nb += 1;
return `${attribute.column} < ${alias.keyword}${alias.number ? alias.nb : ''}`;
}
case '<=': {
alias.nb += 1;
return `${attribute.column} <= ${alias.keyword}${alias.number ? alias.nb : ''}`;
}
case '<>': {
alias.nb += 1;
return `${attribute.column} <> ${alias.keyword}${alias.number ? alias.nb : ''}`;
}
case '=': {
alias.nb += 1;
return `${attribute.column} = ${alias.keyword}${alias.number ? alias.nb : ''}`;
}
case '>': {
alias.nb += 1;
return `${attribute.column} > ${alias.keyword}${alias.number ? alias.nb : ''}`;
}
case '>=': {
alias.nb += 1;
return `${attribute.column} >= ${alias.keyword}${alias.number ? alias.nb : ''}`;
}
case 'BETWEEN': {
alias.nb += 1;
return `${attribute.column} BETWEEN ${alias.keyword}${alias.number ? alias.nb : ''} AND ${alias.keyword}${alias.number ? ++alias.nb : ''}`;
}
case 'IN': {
return `${attribute.column} IN (${attribute.value
.map(() => {
alias.nb += 1;
return `${alias.keyword}${alias.number ? alias.nb : ''}`;
})
.join(', ')})`;
}
case 'LIKE': {
alias.nb += 1;
return `${attribute.column} LIKE ${alias.keyword}${alias.number ? alias.nb : ''}`;
}
default: {
throw new Error(`Invalid operator ${attribute.operator}`);
}
}
};
this.computeWhereKeyWord = (keyword) => {
switch (keyword.keyword) {
case 'AND': {
return ' AND ';
}
case 'OR': {
return ' OR ';
}
case 'NOT': {
return 'NOT';
}
case 'STARTGROUP': {
return ' ( ';
}
case 'ENDGROUP': {
return ' ) ';
}
default: {
throw new Error(`Invalid keyword ${keyword.keyword}`);
}
}
};
}
}
exports.default = GlobalSqlModel;