es-entity
Version:
ORM framework for Node js based on Ecmascript 6 and Typescript.
144 lines (125 loc) • 3.99 kB
text/typescript
import Handler from '../handlers/Handler.js';
import Collection from './Collection.js';
import Expression from './Expression.js';
import INode from './INode.js';
import Command from './types/Command.js';
/**
* SqlStatement
*/
class Statement extends INode {
command: Command | null = null;
columns: Array<INode> = new Array<INode>();
values: Array<Expression> = new Array<Expression>();
collection: Collection = new Collection();
where: Expression = new Expression();
groupBy: Array<Expression> = new Array<Expression>();
orderBy: Array<Expression> = new Array<Expression>();
limit: Expression = new Expression();
eval(handler: Handler): string {
let result: string;
switch (this.command) {
case Command.SELECT:
result = this.selectQuery(handler);
break;
case Command.INSERT:
result = this.insertQuery(handler);
break;
case Command.UPDATE:
result = this.updateQuery(handler);
break;
case Command.DELETE:
result = this.deleteQuery(handler);
break;
default:
throw new Error('Invalid Statement');
}
return result;
}
insertQuery(handler: Handler) {
let collectionStr = this.getCollectionStr(handler);
let columnStr = this.getColumnStr(handler);
let valueStr = this.getValueStr(handler);
return `insert into ${collectionStr} (${columnStr}) values (${valueStr})`;
}
selectQuery(handler: Handler) {
let collectionStr = this.getCollectionStr(handler);
let columnStr = this.getColumnStr(handler);
let whereStr = this.getWhereStr(handler);
let groupByStr = this.getGroupByStr(handler);
let orderByStr = this.getOrderByStr(handler);
let limitStr = this.getLimitStr(handler);
return `select ${columnStr} from ${collectionStr}${whereStr}${groupByStr}${orderByStr}${limitStr}`;
}
updateQuery(handler: Handler) {
let collectionStr = this.getCollectionStr(handler);
let columnStr = this.getColumnStr(handler);
let whereStr = this.getWhereStr(handler);
return `update ${collectionStr} set ${columnStr}${whereStr}`;
}
deleteQuery(handler: Handler) {
let collectionStr = this.getCollectionStr(handler);
let whereStr = this.getWhereStr(handler);
return `delete from ${collectionStr}${whereStr}`;
}
// Collection
getCollectionStr(handler: Handler) {
let collectionStr: string = this.collection.eval(handler);
this.args = this.args.concat(this.collection.args);
return collectionStr;
}
// Column
getColumnStr(handler: Handler) {
return this.columns
.map(ele => {
let r = ele.eval(handler);
this.args = this.args.concat(ele.args);
return r;
}, this)
.join(', ');
}
// Where
getWhereStr(handler: Handler) {
let whereStr: string = this.where.eval(handler);
this.args = this.args.concat(this.where.args);
return whereStr ? ` where ${whereStr}` : '';
}
// Values
getValueStr(handler: Handler) {
return this.values
.map(ele => {
let r = ele.eval(handler);
this.args = this.args.concat(ele.args);
return r;
}, this)
.join(', ');
}
// Group By
getGroupByStr(handler: Handler) {
let groupByStr = this.groupBy
.map(ele => {
let r = ele.eval(handler);
this.args = this.args.concat(ele.args);
return r;
}, this)
.join(', ');
return groupByStr ? ` group by ${groupByStr}` : '';
}
// Order By
getOrderByStr(handler: Handler) {
let orderByStr = this.orderBy
.map(ele => {
let r = ele.eval(handler);
this.args = this.args.concat(ele.args);
return r;
}, this)
.join(', ');
return orderByStr ? ` order by ${orderByStr}` : '';
}
// Limit
getLimitStr(handler: Handler) {
let limitStr: string = this.limit.eval(handler);
this.args = this.args.concat(this.limit.args);
return limitStr;
}
}
export default Statement;