es-entity
Version:
ORM framework for Node js based on Ecmascript 6 and Typescript.
190 lines (159 loc) • 6.34 kB
text/typescript
import { Readable } from 'stream';
import * as bean from '../bean/index.js';
import * as model from '../model/index.js';
import * as types from '../model/types.js';
import * as sql from '../sql/index.js';
import IQuerySet from './IQuerySet.js';
class JoinQuerySet<T extends Object, U extends Object> extends IQuerySet<T & U> {
private mainSet: IQuerySet<T>;
private joinSet: IQuerySet<U>;
stat: sql.Statement = new sql.Statement();
constructor(mainSet: IQuerySet<T>, joinSet: IQuerySet<U>, joinType: sql.types.Join, expr: sql.Expression) {
super();
this.mainSet = mainSet;
this.context = mainSet.context;
this.joinSet = joinSet;
this.stat = new sql.Statement();
// this.stat.collection.leftColl = this.mainSet.stat.collection;
// this.stat.collection.rightColl = this.joinSet.stat.collection;
this.stat.collection.join = joinType;
this.stat.where = this.stat.where.add(expr);
}
// getEntity(): T & U {
// let mainObj = this.mainSet.getEntity();
// let joinObj = this.joinSet.getEntity();
// return Object.assign(mainObj, joinObj);
// // return null;
// }
// Selection Functions
async list(): Promise<Array<T & U>> {
// this.stat.command = sql.types.Command.SELECT;
// let tempObj = this.getEntity();
// this.setStatColumns(tempObj);
// let result = await this.context.execute(this.stat);
// return this.mapData(result);
//TODO: implementation
return new Array();
}
stream(): Promise<Readable> {
throw new Error('Method not implemented.');
}
listPlain(keys: (keyof T | keyof U)[]): Promise<Partial<T & U>[]> {
throw new Error('Method not implemented.');
}
async mapData(input: bean.ResultSet): Promise<Array<T & U>> {
// let resMain = await this.mainSet.mapData(input);
// let resJoin = await this.joinSet.mapData(input);
// let res = new Array<T & U>();
// for (let i = 0; i < input.rowCount; i++) {
// let objMain = resMain[i];
// let objJoin = resJoin[i];
// let objFinal = Object.assign(objMain, objJoin);
// res.push(objFinal);
// }
// return res;
//TODO: implement
return new Array();
}
// select<V extends Object = types.SubEntityType<T & U>>(TargetType: types.IEntityType<V>): IQuerySet<V> {
select<V extends Object>(EntityType: types.IEntityType<V>): IQuerySet<V> {
// this.stat.command = sql.types.Command.SELECT;
// let a = this.getEntity();
// let tempObj = TargetType(a);
// this.setStatColumns(tempObj);
// let result = await this.context.execute(this.stat);
// let temps = await this.mapData(result);
// let res: V[] = [];
// temps.forEach(t => {
// let r = TargetType(t);
// res.push(r);
// });
// return res;
//TODO: implement
throw new Error('Method not implemented.');
}
// selectPlain(keys: (keyof T & U)[]): Promise<types.SelectType<T & U>[]> {
selectPlain(keys: (keyof T & U)[]): any {
//TODO: implement
return null;
}
// Conditional Functions
where(param: types.IWhereFunc<model.WhereExprBuilder<T & U>>, ...args: any[]): IQuerySet<T & U> {
// let res = null;
// if (param && param instanceof Function) {
// //TODO: fix join fieldMap
// let mainFieldMap = this.context.tableSetMap.get(null).fieldMap;
// let joinFieldMap = this.context.tableSetMap.get(null).fieldMap;
// let finalFieldMap = new Map([...mainFieldMap, ...joinFieldMap]);
// let op = new model.WhereExprBuilder<T & U>(finalFieldMap);
// res = param(op, args);
// }
// if (res && res instanceof sql.Expression && res.exps.length > 0) {
// this.stat.where = this.stat.where.add(res);
// }
return this;
}
groupBy(param: types.IArrFieldFunc<model.GroupExprBuilder<T & U>>): IQuerySet<T & U> {
// let res = null;
// if (param && param instanceof Function) {
// //TODO: fix join fieldMap
// let mainFieldMap = this.context.tableSetMap.get(Object)?.fieldMap;
// let joinFieldMap = this.context.tableSetMap.get(Object)?.fieldMap;
// let finalFieldMap = new Map([...mainFieldMap, ...joinFieldMap]);
// let op = new model.GroupExprBuilder<T & U>(finalFieldMap);
// res = param(op);
// }
// if (res && Array.isArray(res)) {
// res.forEach(a => {
// if (a instanceof sql.Expression && a.exps.length > 0) {
// this.stat.groupBy.push(a);
// }
// });
// }
return this;
}
orderBy(param: types.IArrFieldFunc<model.OrderExprBuilder<T & U>>): IQuerySet<T & U> {
// let res = null;
// if (param && param instanceof Function) {
// //TODO: fix join fieldMap
// let mainFieldMap = this.context.tableSetMap.get(null)?.fieldMap;
// let joinFieldMap = this.context.tableSetMap.get(null)?.fieldMap;
// let finalFieldMap = new Map([...mainFieldMap, ...joinFieldMap]);
// let op = new model.OrderExprBuilder<T & U>(finalFieldMap);
// res = param(op);
// }
// if (res && Array.isArray(res)) {
// res.forEach(expr => {
// if (expr instanceof sql.Expression && expr.exps.length > 0) {
// this.stat.orderBy.push(expr);
// }
// });
// }
return this;
}
limit(size: number, index?: number): IQuerySet<T & U> {
this.stat.limit = new sql.Expression(null, sql.types.Operator.Limit);
this.stat.limit.exps.push(new sql.Expression(size.toString()));
if (index) {
this.stat.limit.exps.push(new sql.Expression(index.toString()));
}
return this;
}
// join<A extends Object>(coll: IQuerySet<A>, param: types.IJoinFunc<model.WhereExprBuilder<T & U>, model.GroupExprBuilder<A>>, joinType?: sql.types.Join): IQuerySet<T & U & A> {
// joinType = joinType || sql.types.Join.InnerJoin;
// let temp: sql.Expression | null = null;
// if (param && param instanceof Function) {
// let mainObj = this.getEntity(); new model.WhereExprBuilder<T>(this.dbSet.fieldMap);
// let joinObj = coll.getEntity();
// temp = param(mainObj, joinObj);
// }
// let res: JoinQuerySet<T & U, A>;
// if (temp instanceof sql.Expression && temp.exps.length > 0) {
// res = new JoinQuerySet<T & U, A>(this, coll, joinType, temp);
// } else {
// throw new TypeError('Invalid Join');
// }
// return res;
// }
}
export default JoinQuerySet;