1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- var Toposort = require('toposort-class')
- , DaoFactory = require('./dao-factory')
- module.exports = (function() {
- var DAOFactoryManager = function(sequelize) {
- this.daos = []
- this.sequelize = sequelize
- }
- DAOFactoryManager.prototype.addDAO = function(dao) {
- this.daos.push(dao)
- return dao
- }
- DAOFactoryManager.prototype.removeDAO = function(dao) {
- this.daos = this.daos.filter(function(_dao) {
- return _dao.name != dao.name
- })
- }
- DAOFactoryManager.prototype.getDAO = function(daoName, options) {
- options = options || {}
- options.attribute = options.attribute || 'name'
- var dao = this.daos.filter(function(dao) {
- return dao[options.attribute] === daoName
- })
- return !!dao ? dao[0] : null
- }
- DAOFactoryManager.prototype.__defineGetter__('all', function() {
- return this.daos
- })
- /**
- * Iterate over DAOs in an order suitable for e.g. creating tables. Will
- * take foreign key constraints into account so that dependencies are visited
- * before dependents.
- */
- DAOFactoryManager.prototype.forEachDAO = function(iterator) {
- var daos = {}
- , sorter = new Toposort()
- this.daos.forEach(function(dao) {
- var deps = []
- daos[dao.tableName] = dao
- for (var attrName in dao.rawAttributes) {
- if (dao.rawAttributes.hasOwnProperty(attrName)) {
- if (dao.rawAttributes[attrName].references) {
- deps.push(dao.rawAttributes[attrName].references)
- }
- }
- }
- deps = deps.filter(function (dep) {
- return dao.tableName !== dep
- })
- sorter.add(dao.tableName, deps)
- })
- sorter.sort().reverse().forEach(function(name) {
- iterator(daos[name], name)
- })
- }
- return DAOFactoryManager
- })()
|