import IManager = require('../IManager'); import IEntityStatic = require('../../Entity/IEntityStatic'); import IEntityListStatic = require('../../Entity/IEntityListStatic'); import SqlBuilder = require('./SqlBuilder'); import Converter = require('../../Entity/Converter'); import EntityMapper = require('../../Mapping/EntityMapper'); import Updater = require('../../Entity/Updater'); import List = require('../../Entity/List'); import IClient = require('../../../Postgre/IClient'); import each = require('each'); import MoreThenOneResultException = require('../Exception/MoreThenOneResultException'); export = Manager; class Manager> implements IManager { private converter: Converter; private entityMapper: EntityMapper; private entityUpdater: Updater; private sqlBuilder: SqlBuilder; get Converter() { return this.converter; } get Updater() { return this.entityUpdater; } get Mapper() { return this.entityMapper; } constructor( private EntityStatic: IEntityStatic, private EntityListStatic: IEntityListStatic, private connection: IClient ) { this.converter = new Converter(EntityStatic); this.entityMapper = new EntityMapper(EntityStatic); this.entityUpdater = new Updater(this.entityMapper); this.sqlBuilder = new SqlBuilder(this.converter, this.entityMapper); } insert(entity: Entity, callback: (e: Error, entity?: Entity) => void): IManager { this.insertList(new this.EntityListStatic([entity]), (e: Error, entityList?: EntityList) => { if (e) return callback(e); callback(null, entityList.first()); }); return this; } insertList(entityList: EntityList, callback: (e: Error, entityList?: EntityList) => void): IManager { if (entityList.isEmpty()) { callback(null, entityList); return; } var entityLists = entityList.chunk(1000); each(entityLists) .on('item', (batchEntityList: EntityList, next: Function) => { var queryParamsPair = this.sqlBuilder.createInsertList(batchEntityList); this.connection.query( queryParamsPair.query, queryParamsPair.params, (e: Error, result: any) => { if (e) return callback(e); result.rows.forEach((row: any, i: number) => { var entity = batchEntityList.get(i); this.entityUpdater.set( entity, this.entityMapper.getIdKey(), row[this.entityMapper.getIdName()] ); }); next(null, batchEntityList); }); }) .on('error', (e: Error) => callback(e)) .on('end', () => callback(null, entityList)); return this; } update(entity: Entity, callback: (e: Error, entity?: Entity) => void): IManager { this.updateList(new this.EntityListStatic([entity]), (e: Error, entityList?: EntityList) => { if (e) return callback(e); callback(null, entityList.first()); }); return this; } updateList(entityList: EntityList, callback: (e: Error, entityList?: EntityList) => void): IManager { if (entityList.isEmpty()) { callback(null, entityList); return; } var entityLists = entityList.chunk(1000); each(entityLists) .on('item', (batchEntityList: EntityList, next: Function) => { var queryParamsPair = this.sqlBuilder.createUpdateList(batchEntityList); this.connection.query( queryParamsPair.query, queryParamsPair.params, (e: Error, result: any) => { if (e) return callback(e); next(null, batchEntityList); }); }) .on('error', (e: Error) => callback(e)) .on('end', () => callback(null, entityList)); return this; } fetchListBy(conditions: any, callback: (e: Error, entityList?: EntityList) => void): IManager { var queryParamsPair = this.sqlBuilder.createSelectByConditions(conditions); this.connection.query( queryParamsPair.query, queryParamsPair.params, (e: Error, result: any) => { if (e) return callback(e); var entities = []; result.rows.forEach((row: any, i: number) => { var entity = this.converter.fromRow(row); entities.push(entity); }); callback(null, new this.EntityListStatic(entities)); }); return this; } fetchBy(conditions: any, callback: (e: Error, entity?: Entity) => void): IManager { var queryParamsPair = this.sqlBuilder.createSelectByConditions(conditions); this.connection.query( queryParamsPair.query, queryParamsPair.params, (e: Error, result: any) => { if (e) return callback(e); if (result.rows.length > 1) return callback(new MoreThenOneResultException(result.rows)); if (result.rows.length == 0) return callback(null, null); var entity = this.converter.fromRow(result.rows[0]); callback(null, entity); }); return this; } removeBy(conditions: any, callback: (e: Error) => void): IManager { var queryParamsPair = this.sqlBuilder.createDeleteByConditions(conditions); this.connection.query( queryParamsPair.query, queryParamsPair.params, (e: Error, result: any) => { if (e) return callback(e); callback(null); }); return this; } }