UNPKG

mobdb

Version:

MarsDB is a lightweight client-side MongoDB-like database, Promise based, written in ES6

184 lines (145 loc) 5.98 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.DocumentRetriver = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _checkTypes = require('check-types'); var _checkTypes2 = _interopRequireDefault(_checkTypes); var _map2 = require('fast.js/map'); var _map3 = _interopRequireDefault(_map2); var _filter2 = require('fast.js/array/filter'); var _filter3 = _interopRequireDefault(_filter2); var _Document = require('./Document'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } // Internals var DEFAULT_QUERY_FILTER = function DEFAULT_QUERY_FILTER() { return true; }; /** * Class for getting data objects by given list of ids. * Promises based. It makes requests asyncronousle by * getting request frame from database. * It's not use caches, because it's a task of store. * It just retrives content by 'get' method. */ var DocumentRetriver = exports.DocumentRetriver = function () { function DocumentRetriver(db) { _classCallCheck(this, DocumentRetriver); this.db = db; } /** * Retrive an optimal superset of documents * by given query based on _id field of the query * * TODO: there is a place for indexes * * @param {Object} query * @return {Promise} */ _createClass(DocumentRetriver, [{ key: 'retriveForQeury', value: function retriveForQeury(query) { var queryFilter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_QUERY_FILTER; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; // Try to get list of ids var selectorIds = void 0; if ((0, _Document.selectorIsId)(query)) { // fast path for scalar query selectorIds = [query]; } else if ((0, _Document.selectorIsIdPerhapsAsObject)(query)) { // also do the fast path for { _id: idString } selectorIds = [query._id]; } else if (_checkTypes2.default.object(query) && query.hasOwnProperty('_id') && _checkTypes2.default.object(query._id) && query._id.hasOwnProperty('$in') && _checkTypes2.default.array(query._id.$in)) { // and finally fast path for multiple ids // selected by $in operator selectorIds = query._id.$in; } // Retrive optimally if (_checkTypes2.default.array(selectorIds) && selectorIds.length > 0) { return this.retriveIds(queryFilter, selectorIds, options); } else { return this.retriveAll(queryFilter, options); } } /** * Rterive all ids given in constructor. * If some id is not retrived (retrived qith error), * then returned promise will be rejected with that error. * @return {Promise} */ }, { key: 'retriveAll', value: function retriveAll() { var _this = this; var queryFilter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_QUERY_FILTER; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var limit = options.limit || +Infinity; var result = []; var stopped = false; return new Promise(function (resolve, reject) { var stream = _this.db.storage.createReadStream(); stream.then(function (docs) { for (var i = 0; i < docs.length; i++) { var doc = _this.db.create(docs[i]); if (result.length < limit && queryFilter(doc)) { result.push(doc); } } resolve(result); stopped = true; }); }); } /** * Rterive all ids given in constructor. * If some id is not retrived (retrived qith error), * then returned promise will be rejected with that error. * @return {Promise} */ }, { key: 'retriveIds', value: function retriveIds() { var queryFilter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_QUERY_FILTER; var _this2 = this; var ids = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var uniqIds = (0, _filter3.default)(ids, function (id, i) { return ids.indexOf(id) === i; }); var retrPromises = (0, _map3.default)(uniqIds, function (id) { return _this2.retriveOne(id); }); var limit = options.limit || +Infinity; return Promise.all(retrPromises).then(function (res) { var filteredRes = []; for (var i = 0; i < res.length; i++) { var doc = res[i]; if (doc && queryFilter(doc)) { filteredRes.push(doc); if (filteredRes.length === limit) { break; } } } return filteredRes; }); } /** * Retrive one document by given id * @param {String} id * @return {Promise} */ }, { key: 'retriveOne', value: function retriveOne(id) { var _this3 = this; return this.db.storage.get(id).then(function (buf) { return _this3.db.create(buf); }); } }]); return DocumentRetriver; }(); exports.default = DocumentRetriver;