123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- var Utils = require('./../utils')
- , Transaction = require('./../transaction')
- module.exports = (function() {
- var HasManySingleLinked = function(definition, instance) {
- this.__factory = definition
- this.instance = instance
- }
- HasManySingleLinked.prototype.injectGetter = function(options) {
- var self = this
- , where = {}
- , smart
- options = options || {}
- var primaryKey = Object.keys(this.instance.rawAttributes).filter(function(k) { return self.instance.rawAttributes[k].primaryKey === true })
- primaryKey = primaryKey.length === 1 ? primaryKey[0] : 'id'
- where[this.__factory.identifier] = this.instance[primaryKey]
- if (options.where) {
- smart = Utils.smartWhere([where, options.where], this.__factory.target.daoFactoryManager.sequelize.options.dialect)
- smart = Utils.compileSmartWhere.call(this.__factory.target, smart, this.__factory.target.daoFactoryManager.sequelize.options.dialect)
- if (smart.length > 0) {
- options.where = smart
- }
- } else {
- options.where = where
- }
- return this.__factory.target.all(options)
- }
- HasManySingleLinked.prototype.injectSetter = function(emitter, oldAssociations, newAssociations, defaultAttributes) {
- var self = this
- , associationKeys = Object.keys((oldAssociations[0] || newAssociations[0] || {daoFactory: {primaryKeys: {}}}).daoFactory.primaryKeys || {})
- , associationKey = (associationKeys.length === 1) ? associationKeys[0] : 'id'
- , chainer = new Utils.QueryChainer()
- , options = {}
- , obsoleteAssociations = oldAssociations.filter(function (old) {
- return !Utils._.find(newAssociations, function (obj) {
- return obj[associationKey] === old[associationKey]
- })
- })
- , unassociatedObjects = newAssociations.filter(function (obj) {
- return !Utils._.find(oldAssociations, function (old) {
- return obj[associationKey] === old[associationKey]
- })
- })
- , update
- if ((defaultAttributes || {}).transaction instanceof Transaction) {
- options.transaction = defaultAttributes.transaction
- delete defaultAttributes.transaction
- }
- if (obsoleteAssociations.length > 0) {
- // clear the old associations
- var obsoleteIds = obsoleteAssociations.map(function(associatedObject) {
- associatedObject[self.__factory.identifier] = (newAssociations.length < 1 ? null : self.instance.id)
- return associatedObject[associationKey]
- })
- update = {}
- update[self.__factory.identifier] = null
- var primaryKeys = Object.keys(this.__factory.target.primaryKeys)
- , primaryKey = primaryKeys.length === 1 ? primaryKeys[0] : 'id'
- , updateWhere = {}
- updateWhere[primaryKey] = obsoleteIds
- chainer.add(this.__factory.target.update(
- update,
- updateWhere,
- Utils._.extend(options, { allowNull: [self.__factory.identifier] })
- ))
- }
- if (unassociatedObjects.length > 0) {
- // For the self.instance
- var pkeys = Object.keys(self.instance.daoFactory.primaryKeys)
- , pkey = pkeys.length === 1 ? pkeys[0] : 'id'
- // For chainer
- , primaryKeys = Object.keys(this.__factory.target.primaryKeys)
- , primaryKey = primaryKeys.length === 1 ? primaryKeys[0] : 'id'
- , updateWhere = {}
- // set the new associations
- var unassociatedIds = unassociatedObjects.map(function(associatedObject) {
- associatedObject[self.__factory.identifier] = self.instance[pkey] || self.instance.id
- return associatedObject[associationKey]
- })
- update = {}
- update[self.__factory.identifier] = (newAssociations.length < 1 ? null : self.instance[pkey] || self.instance.id)
- updateWhere[primaryKey] = unassociatedIds
- chainer.add(this.__factory.target.update(
- update,
- updateWhere,
- Utils._.extend(options, { allowNull: [self.__factory.identifier] })
- ))
- }
- chainer
- .run()
- .success(function() { emitter.emit('success', newAssociations) })
- .error(function(err) { emitter.emit('error', err) })
- .on('sql', function(sql) { emitter.emit('sql', sql) })
- }
- HasManySingleLinked.prototype.injectAdder = function(emitterProxy, newAssociation, additionalAttributes) {
- var primaryKeys = Object.keys(this.instance.daoFactory.primaryKeys)
- , primaryKey = primaryKeys.length === 1 ? primaryKeys[0] : 'id'
- , options = {}
- if ((additionalAttributes || {}).transaction instanceof Transaction) {
- options.transaction = additionalAttributes.transaction
- delete additionalAttributes.transaction
- }
- newAssociation[this.__factory.identifier] = this.instance[primaryKey]
- newAssociation.save(options)
- .success(function() { emitterProxy.emit('success', newAssociation) })
- .error(function(err) { emitterProxy.emit('error', err) })
- .on('sql', function(sql) { emitterProxy.emit('sql', sql) })
- }
- return HasManySingleLinked
- })()
|