objection
Version:
An SQL-friendly ORM for Node.js
69 lines (48 loc) • 6.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = function (builder) {
// Postgres is the only db engine that returns identifiers of all inserted rows. Therefore
// we can insert batches only with postgres.
var batchSize = (0, _dbUtils.isPostgres)(builder.knex()) ? POSTGRES_INSERT_BATCH_SIZE : 1;
return function (tableInsertion) {
var inputs = [];
var others = [];
var queries = [];
var insertQuery = tableInsertion.modelClass.query().childQueryOf(builder);
for (var i = 0, l = tableInsertion.models.length; i < l; ++i) {
var model = tableInsertion.models[i];
// We need to validate here since at this point the models should no longer contain any special properties.
var json = model.$validate();
// Set the return value back to model in case defaults were set.
model.$set(json);
if (tableInsertion.isInputModel[i]) {
inputs.push(model);
} else {
others.push(model);
}
}
batchInsert(inputs, insertQuery.clone().copyFrom(builder, /returning/), batchSize, queries);
batchInsert(others, insertQuery.clone(), batchSize, queries);
return _bluebird2.default.all(queries);
};
};
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _bluebird = require('bluebird');
var _bluebird2 = _interopRequireDefault(_bluebird);
var _dbUtils = require('../../utils/dbUtils');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var POSTGRES_INSERT_BATCH_SIZE = 100;
/**
* @param {QueryBuilder} builder
* @return {function(TableInsertion)}
*/
function batchInsert(models, queryBuilder, batchSize, queries) {
var batches = _lodash2.default.chunk(models, batchSize);
for (var i = 0, l = batches.length; i < l; ++i) {
queries.push(queryBuilder.clone().insert(batches[i]));
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluc2VydGVyLmpzIl0sIm5hbWVzIjpbImJ1aWxkZXIiLCJiYXRjaFNpemUiLCJrbmV4IiwiUE9TVEdSRVNfSU5TRVJUX0JBVENIX1NJWkUiLCJ0YWJsZUluc2VydGlvbiIsImlucHV0cyIsIm90aGVycyIsInF1ZXJpZXMiLCJpbnNlcnRRdWVyeSIsIm1vZGVsQ2xhc3MiLCJxdWVyeSIsImNoaWxkUXVlcnlPZiIsImkiLCJsIiwibW9kZWxzIiwibGVuZ3RoIiwibW9kZWwiLCJqc29uIiwiJHZhbGlkYXRlIiwiJHNldCIsImlzSW5wdXRNb2RlbCIsInB1c2giLCJiYXRjaEluc2VydCIsImNsb25lIiwiY29weUZyb20iLCJhbGwiLCJxdWVyeUJ1aWxkZXIiLCJiYXRjaGVzIiwiY2h1bmsiLCJpbnNlcnQiXSwibWFwcGluZ3MiOiI7Ozs7OztrQkFVZSxVQUFVQSxPQUFWLEVBQW1CO0FBQ2hDO0FBQ0E7QUFDQSxNQUFNQyxZQUFZLHlCQUFXRCxRQUFRRSxJQUFSLEVBQVgsSUFBNkJDLDBCQUE3QixHQUEwRCxDQUE1RTs7QUFFQSxTQUFPLFVBQUNDLGNBQUQsRUFBb0I7QUFDekIsUUFBTUMsU0FBUyxFQUFmO0FBQ0EsUUFBTUMsU0FBUyxFQUFmO0FBQ0EsUUFBTUMsVUFBVSxFQUFoQjs7QUFFQSxRQUFJQyxjQUFjSixlQUFlSyxVQUFmLENBQ2ZDLEtBRGUsR0FFZkMsWUFGZSxDQUVGWCxPQUZFLENBQWxCOztBQUlBLFNBQUssSUFBSVksSUFBSSxDQUFSLEVBQVdDLElBQUlULGVBQWVVLE1BQWYsQ0FBc0JDLE1BQTFDLEVBQWtESCxJQUFJQyxDQUF0RCxFQUF5RCxFQUFFRCxDQUEzRCxFQUE4RDtBQUM1RCxVQUFNSSxRQUFRWixlQUFlVSxNQUFmLENBQXNCRixDQUF0QixDQUFkOztBQUVBO0FBQ0EsVUFBTUssT0FBT0QsTUFBTUUsU0FBTixFQUFiOztBQUVBO0FBQ0FGLFlBQU1HLElBQU4sQ0FBV0YsSUFBWDs7QUFFQSxVQUFJYixlQUFlZ0IsWUFBZixDQUE0QlIsQ0FBNUIsQ0FBSixFQUFvQztBQUNsQ1AsZUFBT2dCLElBQVAsQ0FBWUwsS0FBWjtBQUNELE9BRkQsTUFFTztBQUNMVixlQUFPZSxJQUFQLENBQVlMLEtBQVo7QUFDRDtBQUNGOztBQUVETSxnQkFBWWpCLE1BQVosRUFBb0JHLFlBQVllLEtBQVosR0FBb0JDLFFBQXBCLENBQTZCeEIsT0FBN0IsRUFBc0MsV0FBdEMsQ0FBcEIsRUFBd0VDLFNBQXhFLEVBQW1GTSxPQUFuRjtBQUNBZSxnQkFBWWhCLE1BQVosRUFBb0JFLFlBQVllLEtBQVosRUFBcEIsRUFBeUN0QixTQUF6QyxFQUFvRE0sT0FBcEQ7O0FBRUEsV0FBTyxtQkFBUWtCLEdBQVIsQ0FBWWxCLE9BQVosQ0FBUDtBQUNELEdBN0JEO0FBOEJELEM7O0FBN0NEOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBLElBQU1KLDZCQUE2QixHQUFuQzs7QUFFQTs7Ozs7O0FBeUNBLFNBQVNtQixXQUFULENBQXFCUixNQUFyQixFQUE2QlksWUFBN0IsRUFBMkN6QixTQUEzQyxFQUFzRE0sT0FBdEQsRUFBK0Q7QUFDN0QsTUFBTW9CLFVBQVUsaUJBQUVDLEtBQUYsQ0FBUWQsTUFBUixFQUFnQmIsU0FBaEIsQ0FBaEI7O0FBRUEsT0FBSyxJQUFJVyxJQUFJLENBQVIsRUFBV0MsSUFBSWMsUUFBUVosTUFBNUIsRUFBb0NILElBQUlDLENBQXhDLEVBQTJDLEVBQUVELENBQTdDLEVBQWdEO0FBQzlDTCxZQUFRYyxJQUFSLENBQWFLLGFBQWFILEtBQWIsR0FBcUJNLE1BQXJCLENBQTRCRixRQUFRZixDQUFSLENBQTVCLENBQWI7QUFDRDtBQUNGIiwiZmlsZSI6Imluc2VydGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBQcm9taXNlIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7aXNQb3N0Z3Jlc30gZnJvbSAnLi4vLi4vdXRpbHMvZGJVdGlscyc7XG5cbmNvbnN0IFBPU1RHUkVTX0lOU0VSVF9CQVRDSF9TSVpFID0gMTAwO1xuXG4vKipcbiAqIEBwYXJhbSB7UXVlcnlCdWlsZGVyfSBidWlsZGVyXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihUYWJsZUluc2VydGlvbil9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChidWlsZGVyKSB7XG4gIC8vIFBvc3RncmVzIGlzIHRoZSBvbmx5IGRiIGVuZ2luZSB0aGF0IHJldHVybnMgaWRlbnRpZmllcnMgb2YgYWxsIGluc2VydGVkIHJvd3MuIFRoZXJlZm9yZVxuICAvLyB3ZSBjYW4gaW5zZXJ0IGJhdGNoZXMgb25seSB3aXRoIHBvc3RncmVzLlxuICBjb25zdCBiYXRjaFNpemUgPSBpc1Bvc3RncmVzKGJ1aWxkZXIua25leCgpKSA/IFBPU1RHUkVTX0lOU0VSVF9CQVRDSF9TSVpFIDogMTtcblxuICByZXR1cm4gKHRhYmxlSW5zZXJ0aW9uKSA9PiB7XG4gICAgY29uc3QgaW5wdXRzID0gW107XG4gICAgY29uc3Qgb3RoZXJzID0gW107XG4gICAgY29uc3QgcXVlcmllcyA9IFtdO1xuXG4gICAgbGV0IGluc2VydFF1ZXJ5ID0gdGFibGVJbnNlcnRpb24ubW9kZWxDbGFzc1xuICAgICAgLnF1ZXJ5KClcbiAgICAgIC5jaGlsZFF1ZXJ5T2YoYnVpbGRlcik7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRhYmxlSW5zZXJ0aW9uLm1vZGVscy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gdGFibGVJbnNlcnRpb24ubW9kZWxzW2ldO1xuXG4gICAgICAvLyBXZSBuZWVkIHRvIHZhbGlkYXRlIGhlcmUgc2luY2UgYXQgdGhpcyBwb2ludCB0aGUgbW9kZWxzIHNob3VsZCBubyBsb25nZXIgY29udGFpbiBhbnkgc3BlY2lhbCBwcm9wZXJ0aWVzLlxuICAgICAgY29uc3QganNvbiA9IG1vZGVsLiR2YWxpZGF0ZSgpO1xuXG4gICAgICAvLyBTZXQgdGhlIHJldHVybiB2YWx1ZSBiYWNrIHRvIG1vZGVsIGluIGNhc2UgZGVmYXVsdHMgd2VyZSBzZXQuXG4gICAgICBtb2RlbC4kc2V0KGpzb24pO1xuXG4gICAgICBpZiAodGFibGVJbnNlcnRpb24uaXNJbnB1dE1vZGVsW2ldKSB7XG4gICAgICAgIGlucHV0cy5wdXNoKG1vZGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG90aGVycy5wdXNoKG1vZGVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBiYXRjaEluc2VydChpbnB1dHMsIGluc2VydFF1ZXJ5LmNsb25lKCkuY29weUZyb20oYnVpbGRlciwgL3JldHVybmluZy8pLCBiYXRjaFNpemUsIHF1ZXJpZXMpO1xuICAgIGJhdGNoSW5zZXJ0KG90aGVycywgaW5zZXJ0UXVlcnkuY2xvbmUoKSwgYmF0Y2hTaXplLCBxdWVyaWVzKTtcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChxdWVyaWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmF0Y2hJbnNlcnQobW9kZWxzLCBxdWVyeUJ1aWxkZXIsIGJhdGNoU2l6ZSwgcXVlcmllcykge1xuICBjb25zdCBiYXRjaGVzID0gXy5jaHVuayhtb2RlbHMsIGJhdGNoU2l6ZSk7XG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBiYXRjaGVzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIHF1ZXJpZXMucHVzaChxdWVyeUJ1aWxkZXIuY2xvbmUoKS5pbnNlcnQoYmF0Y2hlc1tpXSkpO1xuICB9XG59XG5cbiJdfQ==