objection
Version:
An SQL-friendly ORM for Node.js
136 lines (96 loc) • 13.4 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _create = require('babel-runtime/core-js/object/create');
var _create2 = _interopRequireDefault(_create);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _RelationFindOperation = require('../RelationFindOperation');
var _RelationFindOperation2 = _interopRequireDefault(_RelationFindOperation);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var ownerJoinColumnAliasPrefix = 'objectiontmpjoin';
var ManyToManyFindOperation = function (_RelationFindOperatio) {
(0, _inherits3.default)(ManyToManyFindOperation, _RelationFindOperatio);
function ManyToManyFindOperation(name, opt) {
(0, _classCallCheck3.default)(this, ManyToManyFindOperation);
var _this = (0, _possibleConstructorReturn3.default)(this, _RelationFindOperatio.call(this, name, opt));
_this.ownerJoinColumnAlias = new Array(_this.relation.joinTableOwnerCol.length);
for (var i = 0, l = _this.relation.joinTableOwnerCol.length; i < l; ++i) {
_this.ownerJoinColumnAlias[i] = ownerJoinColumnAliasPrefix + i;
}
return _this;
}
ManyToManyFindOperation.prototype.onBeforeBuild = function onBeforeBuild(builder) {
var relatedModelClass = this.relation.relatedModelClass;
var ids = new Array(this.owners.length);
for (var i = 0, l = this.owners.length; i < l; ++i) {
ids[i] = this.owners[i].$values(this.relation.ownerProp);
}
if (!builder.has(builder.constructor.SelectSelector)) {
// If the user hasn't specified a select clause, select the related model's columns.
// If we don't do this we also get the join table's columns.
builder.select(relatedModelClass.tableName + '.*');
// Also select all extra columns.
for (var _i = 0, _l = this.relation.joinTableExtras.length; _i < _l; ++_i) {
var extra = this.relation.joinTableExtras[_i];
var joinTable = this.relation.joinTable;
builder.select(joinTable + '.' + extra.joinTableCol + ' as ' + extra.aliasCol);
}
}
this.relation.findQuery(builder, {
ownerIds: _lodash2.default.uniqBy(ids, join)
});
var fullJoinTableOwnerCol = this.relation.fullJoinTableOwnerCol();
// We must select the owner join columns so that we know for which owner model the related
// models belong to after the requests.
for (var _i2 = 0, _l2 = fullJoinTableOwnerCol.length; _i2 < _l2; ++_i2) {
builder.select(fullJoinTableOwnerCol[_i2] + ' as ' + this.ownerJoinColumnAlias[_i2]);
// Mark them to be omitted later.
this.omitProps.push(relatedModelClass.columnNameToPropertyName(this.ownerJoinColumnAlias[_i2]));
}
this.addJoinColumnSelects(builder);
};
ManyToManyFindOperation.prototype.onAfterInternal = function onAfterInternal(builder, related) {
var isOneToOne = this.relation.isOneToOne();
var relatedByOwnerId = (0, _create2.default)(null);
for (var i = 0, l = related.length; i < l; ++i) {
var rel = related[i];
var key = rel.$propKey(this.ownerJoinColumnAlias);
var arr = relatedByOwnerId[key];
if (!arr) {
arr = [];
relatedByOwnerId[key] = arr;
}
arr.push(rel);
}
for (var _i3 = 0, _l3 = this.owners.length; _i3 < _l3; ++_i3) {
var own = this.owners[_i3];
var _key = own.$propKey(this.relation.ownerProp);
var _related = relatedByOwnerId[_key];
if (isOneToOne) {
own[this.relation.name] = _related && _related[0] || null;
} else {
own[this.relation.name] = _related || [];
}
}
if (this.alwaysReturnArray) {
return related;
} else {
return isOneToOne ? related[0] || undefined : related;
}
};
return ManyToManyFindOperation;
}(_RelationFindOperation2.default);
exports.default = ManyToManyFindOperation;
function join(arr) {
return arr.join();
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hbnlUb01hbnlGaW5kT3BlcmF0aW9uLmpzIl0sIm5hbWVzIjpbIm93bmVySm9pbkNvbHVtbkFsaWFzUHJlZml4IiwiTWFueVRvTWFueUZpbmRPcGVyYXRpb24iLCJuYW1lIiwib3B0Iiwib3duZXJKb2luQ29sdW1uQWxpYXMiLCJBcnJheSIsInJlbGF0aW9uIiwiam9pblRhYmxlT3duZXJDb2wiLCJsZW5ndGgiLCJpIiwibCIsIm9uQmVmb3JlQnVpbGQiLCJidWlsZGVyIiwicmVsYXRlZE1vZGVsQ2xhc3MiLCJpZHMiLCJvd25lcnMiLCIkdmFsdWVzIiwib3duZXJQcm9wIiwiaGFzIiwiY29uc3RydWN0b3IiLCJTZWxlY3RTZWxlY3RvciIsInNlbGVjdCIsInRhYmxlTmFtZSIsImpvaW5UYWJsZUV4dHJhcyIsImV4dHJhIiwiam9pblRhYmxlIiwiam9pblRhYmxlQ29sIiwiYWxpYXNDb2wiLCJmaW5kUXVlcnkiLCJvd25lcklkcyIsInVuaXFCeSIsImpvaW4iLCJmdWxsSm9pblRhYmxlT3duZXJDb2wiLCJvbWl0UHJvcHMiLCJwdXNoIiwiY29sdW1uTmFtZVRvUHJvcGVydHlOYW1lIiwiYWRkSm9pbkNvbHVtblNlbGVjdHMiLCJvbkFmdGVySW50ZXJuYWwiLCJyZWxhdGVkIiwiaXNPbmVUb09uZSIsInJlbGF0ZWRCeU93bmVySWQiLCJyZWwiLCJrZXkiLCIkcHJvcEtleSIsImFyciIsIm93biIsImFsd2F5c1JldHVybkFycmF5IiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7OztBQUVBLElBQU1BLDZCQUE2QixrQkFBbkM7O0lBRXFCQyx1Qjs7O0FBRW5CLG1DQUFZQyxJQUFaLEVBQWtCQyxHQUFsQixFQUF1QjtBQUFBOztBQUFBLCtEQUNyQixpQ0FBTUQsSUFBTixFQUFZQyxHQUFaLENBRHFCOztBQUdyQixVQUFLQyxvQkFBTCxHQUE0QixJQUFJQyxLQUFKLENBQVUsTUFBS0MsUUFB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QU1KLGlCQUFpQkUsR0FBakIsQ0FBVjs7QUFFQSxVQUFJLENBQUNFLEdBQUwsRUFBVTtBQUNSQSxjQUFNLEVBQU47QUFDQUoseUJBQWlCRSxHQUFqQixJQUF3QkUsR0FBeEI7QUFDRDs7QUFFREEsVUFBSVYsSUFBSixDQUFTTyxHQUFUO0FBQ0Q7O0FBRUQsU0FBSyxJQUFJaEMsTUFBSSxDQUFSLEVBQVdDLE1BQUksS0FBS0ssTUFBTCxDQUFZUCxNQUFoQyxFQUF3Q0MsTUFBSUMsR0FBNUMsRUFBK0MsRUFBRUQsR0FBakQsRUFBb0Q7QUFDbEQsVUFBTW9DLE1BQU0sS0FBSzlCLE1BQUwsQ0FBWU4sR0FBWixDQUFaO0FBQ0EsVUFBTWlDLE9BQU1HLElBQUlGLFFBQUosQ0FBYSxLQUFLckMsUUFBTCxDQUFjVyxTQUEzQixDQUFaO0FBQ0EsVUFBTXFCLFdBQVVFLGlCQUFpQkUsSUFBakIsQ0FBaEI7O0FBRUEsVUFBSUgsVUFBSixFQUFnQjtBQUNkTSxZQUFJLEtBQUt2QyxRQUFMLENBQWNKLElBQWxCLElBQTJCb0MsWUFBV0EsU0FBUSxDQUFSLENBQVosSUFBMkIsSUFBckQ7QUFDRCxPQUZELE1BRU87QUFDTE8sWUFBSSxLQUFLdkMsUUFBTCxDQUFjSixJQUFsQixJQUEwQm9DLFlBQVcsRUFBckM7QUFDRDtBQUNGOztBQUVELFFBQUksS0FBS1EsaUJBQVQsRUFBNEI7QUFDMUIsYUFBT1IsT0FBUDtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU9DLGFBQWFELFFBQVEsQ0FBUixLQUFjUyxTQUEzQixHQUF1Q1QsT0FBOUM7QUFDRDtBQUNGLEc7Ozs7O2tCQXJGa0JyQyx1Qjs7O0FBd0ZyQixTQUFTOEIsSUFBVCxDQUFjYSxHQUFkLEVBQW1CO0FBQ2pCLFNBQU9BLElBQUliLElBQUosRUFBUDtBQUNEIiwiZmlsZSI6Ik1hbnlUb01hbnlGaW5kT3BlcmF0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBSZWxhdGlvbkZpbmRPcGVyYXRpb24gZnJvbSAnLi4vUmVsYXRpb25GaW5kT3BlcmF0aW9uJztcblxuY29uc3Qgb3duZXJKb2luQ29sdW1uQWxpYXNQcmVmaXggPSAnb2JqZWN0aW9udG1wam9pbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hbnlUb01hbnlGaW5kT3BlcmF0aW9uIGV4dGVuZHMgUmVsYXRpb25GaW5kT3BlcmF0aW9uIHtcblxuICBjb25zdHJ1Y3RvcihuYW1lLCBvcHQpIHtcbiAgICBzdXBlcihuYW1lLCBvcHQpO1xuXG4gICAgdGhpcy5vd25lckpvaW5Db2x1bW5BbGlhcyA9IG5ldyBBcnJheSh0aGlzLnJlbGF0aW9uLmpvaW5UYWJsZU93bmVyQ29sLmxlbmd0aCk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMucmVsYXRpb24uam9pblRhYmxlT3duZXJDb2wubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICB0aGlzLm93bmVySm9pbkNvbHVtbkFsaWFzW2ldID0gb3duZXJKb2luQ29sdW1uQWxpYXNQcmVmaXggKyBpO1xuICAgIH1cbiAgfVxuXG4gIG9uQmVmb3JlQnVpbGQoYnVpbGRlcikge1xuICAgIGNvbnN0IHJlbGF0ZWRNb2RlbENsYXNzID0gdGhpcy5yZWxhdGlvbi5yZWxhdGVkTW9kZWxDbGFzcztcbiAgICBjb25zdCBpZHMgPSBuZXcgQXJyYXkodGhpcy5vd25lcnMubGVuZ3RoKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5vd25lcnMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICBpZHNbaV0gPSB0aGlzLm93bmVyc1tpXS4kdmFsdWVzKHRoaXMucmVsYXRpb24ub3duZXJQcm9wKTtcbiAgICB9XG5cbiAgICBpZiAoIWJ1aWxkZXIuaGFzKGJ1aWxkZXIuY29uc3RydWN0b3IuU2VsZWN0U2VsZWN0b3IpKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciBoYXNuJ3Qgc3BlY2lmaWVkIGEgc2VsZWN0IGNsYXVzZSwgc2VsZWN0IHRoZSByZWxhdGVkIG1vZGVsJ3MgY29sdW1ucy5cbiAgICAgIC8vIElmIHdlIGRvbid0IGRvIHRoaXMgd2UgYWxzbyBnZXQgdGhlIGpvaW4gdGFibGUncyBjb2x1bW5zLlxuICAgICAgYnVpbGRlci5zZWxlY3QocmVsYXRlZE1vZGVsQ2xhc3MudGFibGVOYW1lICsgJy4qJyk7XG5cbiAgICAgIC8vIEFsc28gc2VsZWN0IGFsbCBleHRyYSBjb2x1bW5zLlxuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLnJlbGF0aW9uLmpvaW5UYWJsZUV4dHJhcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgY29uc3QgZXh0cmEgPSB0aGlzLnJlbGF0aW9uLmpvaW5UYWJsZUV4dHJhc1tpXTtcbiAgICAgICAgY29uc3Qgam9pblRhYmxlID0gdGhpcy5yZWxhdGlvbi5qb2luVGFibGU7XG5cbiAgICAgICAgYnVpbGRlci5zZWxlY3QoYCR7am9pblRhYmxlfS4ke2V4dHJhLmpvaW5UYWJsZUNvbH0gYXMgJHtleHRyYS5hbGlhc0NvbH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnJlbGF0aW9uLmZpbmRRdWVyeShidWlsZGVyLCB7XG4gICAgICBvd25lcklkczogXy51bmlxQnkoaWRzLCBqb2luKVxuICAgIH0pO1xuXG4gICAgY29uc3QgZnVsbEpvaW5UYWJsZU93bmVyQ29sID0gdGhpcy5yZWxhdGlvbi5mdWxsSm9pblRhYmxlT3duZXJDb2woKTtcbiAgICAvLyBXZSBtdXN0IHNlbGVjdCB0aGUgb3duZXIgam9pbiBjb2x1bW5zIHNvIHRoYXQgd2Uga25vdyBmb3Igd2hpY2ggb3duZXIgbW9kZWwgdGhlIHJlbGF0ZWRcbiAgICAvLyBtb2RlbHMgYmVsb25nIHRvIGFmdGVyIHRoZSByZXF1ZXN0cy5cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IGZ1bGxKb2luVGFibGVPd25lckNvbC5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgIGJ1aWxkZXIuc2VsZWN0KGZ1bGxKb2luVGFibGVPd25lckNvbFtpXSArICcgYXMgJyArIHRoaXMub3duZXJKb2luQ29sdW1uQWxpYXNbaV0pO1xuXG4gICAgICAvLyBNYXJrIHRoZW0gdG8gYmUgb21pdHRlZCBsYXRlci5cbiAgICAgIHRoaXMub21pdFByb3BzLnB1c2gocmVsYXRlZE1vZGVsQ2xhc3MuY29sdW1uTmFtZVRvUHJvcGVydHlOYW1lKHRoaXMub3duZXJKb2luQ29sdW1uQWxpYXNbaV0pKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZEpvaW5Db2x1bW5TZWxlY3RzKGJ1aWxkZXIpO1xuICB9XG5cbiAgb25BZnRlckludGVybmFsKGJ1aWxkZXIsIHJlbGF0ZWQpIHtcbiAgICBjb25zdCBpc09uZVRvT25lID0gdGhpcy5yZWxhdGlvbi5pc09uZVRvT25lKCk7XG4gICAgY29uc3QgcmVsYXRlZEJ5T3duZXJJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHJlbGF0ZWQubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICBjb25zdCByZWwgPSByZWxhdGVkW2ldO1xuICAgICAgY29uc3Qga2V5ID0gcmVsLiRwcm9wS2V5KHRoaXMub3duZXJKb2luQ29sdW1uQWxpYXMpO1xuICAgICAgbGV0IGFyciA9IHJlbGF0ZWRCeU93bmVySWRba2V5XTtcblxuICAgICAgaWYgKCFhcnIpIHtcbiAgICAgICAgYXJyID0gW107XG4gICAgICAgIHJlbGF0ZWRCeU93bmVySWRba2V5XSA9IGFycjtcbiAgICAgIH1cblxuICAgICAgYXJyLnB1c2gocmVsKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMub3duZXJzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgY29uc3Qgb3duID0gdGhpcy5vd25lcnNbaV07XG4gICAgICBjb25zdCBrZXkgPSBvd24uJHByb3BLZXkodGhpcy5yZWxhdGlvbi5vd25lclByb3ApO1xuICAgICAgY29uc3QgcmVsYXRlZCA9IHJlbGF0ZWRCeU93bmVySWRba2V5XTtcblxuICAgICAgaWYgKGlzT25lVG9PbmUpIHtcbiAgICAgICAgb3duW3RoaXMucmVsYXRpb24ubmFtZV0gPSAocmVsYXRlZCAmJiByZWxhdGVkWzBdKSB8fCBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3duW3RoaXMucmVsYXRpb24ubmFtZV0gPSByZWxhdGVkIHx8IFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFsd2F5c1JldHVybkFycmF5KSB7XG4gICAgICByZXR1cm4gcmVsYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzT25lVG9PbmUgPyByZWxhdGVkWzBdIHx8IHVuZGVmaW5lZCA6IHJlbGF0ZWQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGpvaW4oYXJyKSB7XG4gIHJldHVybiBhcnIuam9pbigpO1xufSJdfQ==