all files / lib/deps/ bulkGetShim.js

100% Statements 47/47
81.25% Branches 13/16
100% Functions 15/15
100% Lines 46/46
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106                  409×     409× 409× 1669× 1206×   463×       409× 409× 409×   409× 409× 463× 1669×           409×     463× 409×       463× 463×     409×   463×               463× 463×   1669×       463× 1669×     463× 457×     463×                     463× 1389× 1122×     463× 463×        
'use strict';
 
Object.defineProperty(exports, "__esModule", {
  value: true
});
 
var _pick = require('../deps/pick');
 
var _pick2 = _interopRequireDefault(_pick);
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
// shim for P/CouchDB adapters that don't directly implement _bulk_get
function bulkGet(db, opts, callback) {
  var requests = Array.isArray(opts) ? opts : opts.docs;
 
  // consolidate into one request per doc if possible
  var requestsById = {};
  requests.forEach(function (request) {
    if (request.id in requestsById) {
      requestsById[request.id].push(request);
    } else {
      requestsById[request.id] = [request];
    }
  });
 
  var numDocs = Object.keys(requestsById).length;
  var numDone = 0;
  var perDocResults = new Array(numDocs);
 
  function collapseResults() {
    var results = [];
    perDocResults.forEach(function (res) {
      res.docs.forEach(function (info) {
        results.push({
          id: res.id,
          docs: [info]
        });
      });
    });
    callback(null, { results: results });
  }
 
  function checkDone() {
    if (++numDone === numDocs) {
      collapseResults();
    }
  }
 
  function gotResult(i, id, docs) {
    perDocResults[i] = { id: id, docs: docs };
    checkDone();
  }
 
  Object.keys(requestsById).forEach(function (docId, i) {
 
    var docRequests = requestsById[docId];
 
    // just use the first request as the "template"
    // TODO: The _bulk_get API allows for more subtle use cases than this,
    // but for now it is unlikely that there will be a mix of different
    // "atts_since" or "attachments" in the same request, since it's just
    // replicate.js that is using this for the moment.
    // Also, atts_since is aspirational, since we don't support it yet.
    var docOpts = (0, _pick2.default)(docRequests[0], ['atts_since', 'attachments']);
    docOpts.open_revs = docRequests.map(function (request) {
      // rev is optional, open_revs disallowed
      return request.rev;
    });
 
    // remove falsey / undefined revisions
    docOpts.open_revs = docOpts.open_revs.filter(function (e) {
      return e;
    });
 
    var formatResult = function (result) {
      return result;
    };
 
    if (docOpts.open_revs.length === 0) {
      delete docOpts.open_revs;
 
      // when fetching only the "winning" leaf,
      // transform the result so it looks like an open_revs
      // request
      formatResult = function (result) {
        return [{
          ok: result
        }];
      };
    }
 
    // globally-supplied options
    ['revs', 'attachments', 'binary'].forEach(function (param) {
      if (param in opts) {
        docOpts[param] = opts[param];
      }
    });
    db.get(docId, docOpts, function (err, res) {
      gotResult(i, docId, err ? [{ error: err }] : formatResult(res));
    });
  });
}
 
exports.default = bulkGet;
module.exports = exports['default'];