mysql-live-client
Version:
The client side script of mysql-live package.
161 lines (160 loc) • 7.44 kB
JavaScript
var ObservableCollection_1 = require("../ObservableCollection");
var Helper_1 = require("../Helper");
var _ = require("lodash");
var Joiner = (function () {
function Joiner(params) {
this.collectionNames = [];
this.params = params;
this.collectionNames.push(params.primaryCollection.name);
this.collectionNames.push(params.joinedCollection.name);
}
Joiner.prototype.doReceive = function (nextTask) {
var _this = this;
var skipReceiveCheck = false;
if (this.params.joinedCollection.hasReceived) {
this.doJoinedReceive(undefined, nextTask);
skipReceiveCheck = true;
}
else {
nextTask();
}
this.params.joinedCollection.onChange(function (evt, nextChange) {
switch (evt.name) {
case ObservableCollection_1.default.ON_RECEIVE:
if (skipReceiveCheck) {
}
else {
_this.doJoinedReceive(nextChange, nextTask);
}
break;
case ObservableCollection_1.default.ON_INSERT:
_this.doJoinedInsert(evt["newItem"], nextChange, nextTask);
break;
case ObservableCollection_1.default.ON_UPDATE:
_this.doJoinedUpdate(evt["newItem"], evt["selector"], nextChange, nextTask);
break;
case ObservableCollection_1.default.ON_REMOVE:
_this.doJoinedRemove(evt["selector"], nextChange, nextTask);
break;
}
}, "ON_CHANGE_" + this.params.primaryCollection.name + "_" + this.params.joinedCollection.name);
};
Joiner.prototype.doJoinedReceive = function (nextJoinedEvent, nextTask) {
var _this = this;
var primaryCollection = this.params.primaryCollection;
var joinedCollection = this.params.joinedCollection;
primaryCollection.items.forEach(function (primary) {
var criteriaForeignToThisKey = {};
criteriaForeignToThisKey[_this.params.foreignKey] = primary[_this.params.thisKey];
if (_this.params.isArray) {
primary[_this.params.as] = joinedCollection.find(criteriaForeignToThisKey) || [];
}
else {
primary[_this.params.as] = joinedCollection.findSingle(criteriaForeignToThisKey) || {};
}
});
nextTask();
if (nextJoinedEvent !== undefined)
nextJoinedEvent();
};
Joiner.prototype.doJoinedInsert = function (newJoined, nextJoinedEvent, nextTask) {
var _this = this;
var criteriaForPrimariesWhichContainsThisJoined = {};
criteriaForPrimariesWhichContainsThisJoined[this.params.thisKey] = newJoined[this.params.foreignKey];
var primaries = this.params.primaryCollection.find(criteriaForPrimariesWhichContainsThisJoined);
if (primaries && primaries.length > 0) {
primaries.forEach(function (primary) {
if (_this.params.isArray) {
primary[_this.params.as]["push"](newJoined);
}
else {
primary[_this.params.as] = newJoined;
}
});
this.params.joinedCollection.fireJoinedEvent({ name: ObservableCollection_1.default.ON_INSERT, newItem: newJoined });
}
nextJoinedEvent();
};
Joiner.prototype.doJoinedUpdate = function (newJoined, selector, nextJoinedEvent, nextTask) {
var _this = this;
var criteriaForPrimariesWhichContainsThisJoined = {};
criteriaForPrimariesWhichContainsThisJoined[this.params.thisKey] = newJoined[this.params.foreignKey];
var primaries = this.params.primaryCollection.find(criteriaForPrimariesWhichContainsThisJoined);
if (primaries && primaries.length > 0) {
primaries.forEach(function (primary) {
if (_this.params.isArray) {
Helper_1.default._findAndUpdate(primary[_this.params.as], selector, newJoined);
}
else {
primary[_this.params.as] = newJoined;
}
});
this.params.joinedCollection.fireJoinedEvent({ name: ObservableCollection_1.default.ON_UPDATE, newItem: newJoined, selector: selector });
}
nextJoinedEvent();
};
Joiner.prototype.doJoinedRemove = function (selector, nextJoinedEvent, nextTask) {
var _this = this;
var joinedPrimaryKeyCol = this.params.joinedCollection.primaryKeyColumn;
var criteriaForJoined = {};
criteriaForJoined[joinedPrimaryKeyCol] = selector[joinedPrimaryKeyCol];
var primaries = this.params.primaryCollection.items;
var somethingChanged = false;
primaries.forEach(function (primary) {
if (_this.params.isArray) {
var removed = _.remove(primary[_this.params.as], function (joined) { return joined[joinedPrimaryKeyCol] === selector[joinedPrimaryKeyCol]; });
if (removed.length > 0) {
somethingChanged = true;
}
}
else {
if (primary[_this.params.as][joinedPrimaryKeyCol] === selector[joinedPrimaryKeyCol]) {
primary[_this.params.as] = {};
somethingChanged = true;
}
}
});
if (somethingChanged) {
this.params.joinedCollection.fireJoinedEvent({ name: ObservableCollection_1.default.ON_REMOVE, selector: selector });
}
nextJoinedEvent();
};
Joiner.prototype.doInsert = function (newPrimary, nextTask) {
var criteriaForeignToThisKey = {};
criteriaForeignToThisKey[this.params.foreignKey] = newPrimary[this.params.thisKey];
if (this.params.isArray) {
newPrimary[this.params.as] = this.params.joinedCollection.find(criteriaForeignToThisKey) || [];
}
else {
newPrimary[this.params.as] = this.params.joinedCollection.findSingle(criteriaForeignToThisKey) || {};
}
nextTask();
};
Joiner.prototype.doUpdate = function (newPrimary, selector, nextTask) {
nextTask();
};
Joiner.prototype.doRemove = function (selector, nextTask) {
nextTask();
};
Joiner.prototype.run = function (caller, next) {
//oxi swsta doulevei console.log(caller.collectionName+ ' : '+ caller.event.name+' wtf ??? nextTask? o eautos tou? lets call it');
if (caller.collectionName === this.params.primaryCollection.name) {
switch (caller.event.name) {
case ObservableCollection_1.default.ON_RECEIVE:
this.doReceive(next);
break;
case ObservableCollection_1.default.ON_INSERT:
this.doInsert(caller.event["newItem"], next);
break;
case ObservableCollection_1.default.ON_UPDATE:
this.doUpdate(caller.event["newItem"], caller.event["selector"], next);
break;
case ObservableCollection_1.default.ON_REMOVE:
this.doRemove(caller.event["selector"], next);
break;
}
}
};
return Joiner;
})();
exports.Joiner = Joiner;