objection
Version:
An SQL-friendly ORM for Node.js
171 lines (121 loc) • 14.7 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
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 _FindOperation2 = require('../queryBuilder/operations/FindOperation');
var _FindOperation3 = _interopRequireDefault(_FindOperation2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var RelationFindOperation = function (_FindOperation) {
(0, _inherits3.default)(RelationFindOperation, _FindOperation);
function RelationFindOperation(name, opt) {
(0, _classCallCheck3.default)(this, RelationFindOperation);
var _this = (0, _possibleConstructorReturn3.default)(this, _FindOperation.call(this, name, opt));
_this.relation = opt.relation;
_this.owners = opt.owners;
_this.alwaysReturnArray = false;
_this.omitProps = [];
return _this;
}
RelationFindOperation.prototype.onBeforeBuild = function onBeforeBuild(builder) {
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);
}
this.relation.findQuery(builder, {
ownerIds: _lodash2.default.uniqBy(ids, join)
});
this.addJoinColumnSelects(builder);
};
RelationFindOperation.prototype.onAfter = function onAfter(builder, related) {
this.omitImplicitJoinProps(related);
return _FindOperation.prototype.onAfter.call(this, builder, related);
};
RelationFindOperation.prototype.onAfterInternal = function onAfterInternal(builder, related) {
this.createRelationProp(this.owners, related);
if (!this.alwaysReturnArray && this.relation.isOneToOne() && related.length <= 1) {
return related[0] || undefined;
} else {
return related;
}
};
RelationFindOperation.prototype.createRelationProp = function createRelationProp(owners, 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.relation.relatedProp);
var arr = relatedByOwnerId[key];
if (!arr) {
arr = [];
relatedByOwnerId[key] = arr;
}
arr.push(rel);
}
for (var _i = 0, _l = owners.length; _i < _l; ++_i) {
var own = owners[_i];
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 || [];
}
}
};
RelationFindOperation.prototype.addJoinColumnSelects = function addJoinColumnSelects(builder) {
var addedSelects = {};
var cols = this.relation.fullRelatedCol();
for (var c = 0, lc = cols.length; c < lc; ++c) {
var col = cols[c];
if (!builder.hasSelection(col) && !addedSelects[col]) {
this.omitProps.push(this.relation.relatedProp[c]);
addedSelects[col] = true;
}
}
var selects = (0, _keys2.default)(addedSelects);
if (selects.length) {
builder.select(selects);
}
};
RelationFindOperation.prototype.omitImplicitJoinProps = function omitImplicitJoinProps(related) {
var relatedModelClass = this.relation.relatedModelClass;
if (!this.omitProps.length || !related) {
return related;
}
if (!Array.isArray(related)) {
return this.omitImplicitJoinPropsFromOne(relatedModelClass, related);
}
if (!related.length) {
return related;
}
for (var i = 0, l = related.length; i < l; ++i) {
this.omitImplicitJoinPropsFromOne(relatedModelClass, related[i]);
}
return related;
};
RelationFindOperation.prototype.omitImplicitJoinPropsFromOne = function omitImplicitJoinPropsFromOne(relatedModelClass, model) {
for (var c = 0, lc = this.omitProps.length; c < lc; ++c) {
relatedModelClass.omitImpl(model, this.omitProps[c]);
}
return model;
};
return RelationFindOperation;
}(_FindOperation3.default);
exports.default = RelationFindOperation;
function join(arr) {
return arr.join();
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJlbGF0aW9uRmluZE9wZXJhdGlvbi5qcyJdLCJuYW1lcyI6WyJSZWxhdGlvbkZpbmRPcGVyYXRpb24iLCJuYW1lIiwib3B0IiwicmVsYXRpb24iLCJvd25lcnMiLCJhbHdheXNSZXR1cm5BcnJheSIsIm9taXRQcm9wcyIsIm9uQmVmb3JlQnVpbGQiLCJidWlsZGVyIiwiaWRzIiwiQXJyYXkiLCJsZW5ndGgiLCJpIiwibCIsIiR2YWx1ZXMiLCJvd25lclByb3AiLCJmaW5kUXVlcnkiLCJvd25lcklkcyIsInVuaXFCeSIsImpvaW4iLCJhZGRKb2luQ29sdW1uU2VsZWN0cyIsIm9uQWZ0ZXIiLCJyZWxhdGVkIiwib21pdEltcGxpY2l0Sm9pblByb3BzIiwib25BZnRlckludGVybmFsIiwiY3JlYXRlUmVsYXRpb25Qcm9wIiwiaXNPbmVUb09uZSIsInVuZGVmaW5lZCIsInJlbGF0ZWRCeU93bmVySWQiLCJyZWwiLCJrZXkiLCIkcHJvcEtleSIsInJlbGF0ZWRQcm9wIiwiYXJyIiwicHVzaCIsIm93biIsImFkZGVkU2VsZWN0cyIsImNvbHMiLCJmdWxsUmVsYXRlZENvbCIsImMiLCJsYyIsImNvbCIsImhhc1NlbGVjdGlvbiIsInNlbGVjdHMiLCJzZWxlY3QiLCJyZWxhdGVkTW9kZWxDbGFzcyIsImlzQXJyYXkiLCJvbWl0SW1wbGljaXRKb2luUHJvcHNGcm9tT25lIiwibW9kZWwiLCJvbWl0SW1wbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7Ozs7O0lBRXFCQSxxQjs7O0FBRW5CLGlDQUFZQyxJQUFaLEVBQWtCQyxHQUFsQixFQUF1QjtBQUFBOztBQUFBLCtEQUNyQiwwQkFBTUQsSUFBTixFQUFZQyxHQUFaLENBRHFCOztBQUdyQixVQUFLQyxRQUFMLEdBQWdCRCxJQUFJQyxRQUFwQjtBQUNBLFVBQUtDLE1BQUwsR0FBY0YsSUFBSUUsTUFBbEI7QUFDQSxVQUFLQyxpQkFBTCxHQUF5QixLQUF6QjtBQUNB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TCxDQUFrQ0YsaUJBQWxDLEVBQXFEdkIsUUFBUVYsQ0FBUixDQUFyRDtBQUNEOztBQUVELFdBQU9VLE9BQVA7QUFDRCxHOztrQ0FFRHlCLDRCLHlDQUE2QkYsaUIsRUFBbUJHLEssRUFBTztBQUNyRCxTQUFLLElBQUlULElBQUksQ0FBUixFQUFXQyxLQUFLLEtBQUtsQyxTQUFMLENBQWVLLE1BQXBDLEVBQTRDNEIsSUFBSUMsRUFBaEQsRUFBb0QsRUFBRUQsQ0FBdEQsRUFBeUQ7QUFDdkRNLHdCQUFrQkksUUFBbEIsQ0FBMkJELEtBQTNCLEVBQWtDLEtBQUsxQyxTQUFMLENBQWVpQyxDQUFmLENBQWxDO0FBQ0Q7O0FBRUQsV0FBT1MsS0FBUDtBQUNELEc7Ozs7O2tCQXRIa0JoRCxxQjs7O0FBeUhyQixTQUFTbUIsSUFBVCxDQUFjYyxHQUFkLEVBQW1CO0FBQ2pCLFNBQU9BLElBQUlkLElBQUosRUFBUDtBQUNEIiwiZmlsZSI6IlJlbGF0aW9uRmluZE9wZXJhdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgRmluZE9wZXJhdGlvbiBmcm9tICcuLi9xdWVyeUJ1aWxkZXIvb3BlcmF0aW9ucy9GaW5kT3BlcmF0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVsYXRpb25GaW5kT3BlcmF0aW9uIGV4dGVuZHMgRmluZE9wZXJhdGlvbiB7XG5cbiAgY29uc3RydWN0b3IobmFtZSwgb3B0KSB7XG4gICAgc3VwZXIobmFtZSwgb3B0KTtcblxuICAgIHRoaXMucmVsYXRpb24gPSBvcHQucmVsYXRpb247XG4gICAgdGhpcy5vd25lcnMgPSBvcHQub3duZXJzO1xuICAgIHRoaXMuYWx3YXlzUmV0dXJuQXJyYXkgPSBmYWxzZTtcbiAgICB0aGlzLm9taXRQcm9wcyA9IFtdO1xuICB9XG5cbiAgb25CZWZvcmVCdWlsZChidWlsZGVyKSB7XG4gICAgbGV0IGlkcyA9IG5ldyBBcnJheSh0aGlzLm93bmVycy5sZW5ndGgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLm93bmVycy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgIGlkc1tpXSA9IHRoaXMub3duZXJzW2ldLiR2YWx1ZXModGhpcy5yZWxhdGlvbi5vd25lclByb3ApO1xuICAgIH1cblxuICAgIHRoaXMucmVsYXRpb24uZmluZFF1ZXJ5KGJ1aWxkZXIsIHtcbiAgICAgIG93bmVySWRzOiBfLnVuaXFCeShpZHMsIGpvaW4pXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEpvaW5Db2x1bW5TZWxlY3RzKGJ1aWxkZXIpO1xuICB9XG5cbiAgb25BZnRlcihidWlsZGVyLCByZWxhdGVkKSB7XG4gICAgdGhpcy5vbWl0SW1wbGljaXRKb2luUHJvcHMocmVsYXRlZCk7XG4gICAgcmV0dXJuIHN1cGVyLm9uQWZ0ZXIoYnVpbGRlciwgcmVsYXRlZCk7XG4gIH1cblxuICBvbkFmdGVySW50ZXJuYWwoYnVpbGRlciwgcmVsYXRlZCkge1xuICAgIHRoaXMuY3JlYXRlUmVsYXRpb25Qcm9wKHRoaXMub3duZXJzLCByZWxhdGVkKTtcblxuICAgIGlmICghdGhpcy5hbHdheXNSZXR1cm5BcnJheSAmJiB0aGlzLnJlbGF0aW9uLmlzT25lVG9PbmUoKSAmJiByZWxhdGVkLmxlbmd0aCA8PSAxKSB7XG4gICAgICByZXR1cm4gcmVsYXRlZFswXSB8fCB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZWxhdGVkO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZVJlbGF0aW9uUHJvcChvd25lcnMsIHJlbGF0ZWQpIHtcbiAgICBjb25zdCBpc09uZVRvT25lID0gdGhpcy5yZWxhdGlvbi5pc09uZVRvT25lKCk7XG4gICAgY29uc3QgcmVsYXRlZEJ5T3duZXJJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHJlbGF0ZWQubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICBjb25zdCByZWwgPSByZWxhdGVkW2ldO1xuICAgICAgY29uc3Qga2V5ID0gcmVsLiRwcm9wS2V5KHRoaXMucmVsYXRpb24ucmVsYXRlZFByb3ApO1xuICAgICAgbGV0IGFyciA9IHJlbGF0ZWRCeU93bmVySWRba2V5XTtcblxuICAgICAgaWYgKCFhcnIpIHtcbiAgICAgICAgYXJyID0gW107XG4gICAgICAgIHJlbGF0ZWRCeU93bmVySWRba2V5XSA9IGFycjtcbiAgICAgIH1cblxuICAgICAgYXJyLnB1c2gocmVsKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IG93bmVycy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgIGNvbnN0IG93biA9IG93bmVyc1tpXTtcbiAgICAgIGNvbnN0IGtleSA9IG93bi4kcHJvcEtleSh0aGlzLnJlbGF0aW9uLm93bmVyUHJvcCk7XG4gICAgICBjb25zdCByZWxhdGVkID0gcmVsYXRlZEJ5T3duZXJJZFtrZXldO1xuXG4gICAgICBpZiAoaXNPbmVUb09uZSkge1xuICAgICAgICBvd25bdGhpcy5yZWxhdGlvbi5uYW1lXSA9IChyZWxhdGVkICYmIHJlbGF0ZWRbMF0pIHx8IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvd25bdGhpcy5yZWxhdGlvbi5uYW1lXSA9IHJlbGF0ZWQgfHwgW107XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkSm9pbkNvbHVtblNlbGVjdHMoYnVpbGRlcikge1xuICAgIGNvbnN0IGFkZGVkU2VsZWN0cyA9IHt9O1xuICAgIGNvbnN0IGNvbHMgPSB0aGlzLnJlbGF0aW9uLmZ1bGxSZWxhdGVkQ29sKCk7XG5cbiAgICBmb3IgKGxldCBjID0gMCwgbGMgPSBjb2xzLmxlbmd0aDsgYyA8IGxjOyArK2MpIHtcbiAgICAgIGNvbnN0IGNvbCA9IGNvbHNbY107XG5cbiAgICAgIGlmICghYnVpbGRlci5oYXNTZWxlY3Rpb24oY29sKSAmJiAhYWRkZWRTZWxlY3RzW2NvbF0pIHtcbiAgICAgICAgdGhpcy5vbWl0UHJvcHMucHVzaCh0aGlzLnJlbGF0aW9uLnJlbGF0ZWRQcm9wW2NdKTtcbiAgICAgICAgYWRkZWRTZWxlY3RzW2NvbF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdHMgPSBPYmplY3Qua2V5cyhhZGRlZFNlbGVjdHMpO1xuXG4gICAgaWYgKHNlbGVjdHMubGVuZ3RoKSB7XG4gICAgICBidWlsZGVyLnNlbGVjdChzZWxlY3RzKTtcbiAgICB9XG4gIH1cblxuICBvbWl0SW1wbGljaXRKb2luUHJvcHMocmVsYXRlZCkge1xuICAgIGNvbnN0IHJlbGF0ZWRNb2RlbENsYXNzID0gdGhpcy5yZWxhdGlvbi5yZWxhdGVkTW9kZWxDbGFzcztcblxuICAgIGlmICghdGhpcy5vbWl0UHJvcHMubGVuZ3RoIHx8ICFyZWxhdGVkKSB7XG4gICAgICByZXR1cm4gcmVsYXRlZDtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVsYXRlZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9taXRJbXBsaWNpdEpvaW5Qcm9wc0Zyb21PbmUocmVsYXRlZE1vZGVsQ2xhc3MsIHJlbGF0ZWQpO1xuICAgIH1cblxuICAgIGlmICghcmVsYXRlZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiByZWxhdGVkO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gcmVsYXRlZC5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgIHRoaXMub21pdEltcGxpY2l0Sm9pblByb3BzRnJvbU9uZShyZWxhdGVkTW9kZWxDbGFzcywgcmVsYXRlZFtpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGF0ZWQ7XG4gIH1cblxuICBvbWl0SW1wbGljaXRKb2luUHJvcHNGcm9tT25lKHJlbGF0ZWRNb2RlbENsYXNzLCBtb2RlbCkge1xuICAgIGZvciAobGV0IGMgPSAwLCBsYyA9IHRoaXMub21pdFByb3BzLmxlbmd0aDsgYyA8IGxjOyArK2MpIHtcbiAgICAgIHJlbGF0ZWRNb2RlbENsYXNzLm9taXRJbXBsKG1vZGVsLCB0aGlzLm9taXRQcm9wc1tjXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGpvaW4oYXJyKSB7XG4gIHJldHVybiBhcnIuam9pbigpO1xufSJdfQ==