all files / lib/deps/docs/ processDocs.js

100% Statements 70/70
97.06% Branches 33/34
100% Functions 10/10
100% Lines 69/69
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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130                                      9027×         3948×     10467× 10467× 10467× 11× 11×       10456×   10456×     10454×   10454×     3948× 3948×   3948× 3948×   21023× 3946×       3948×   22630× 3632× 3632× 3632× 3632×   3632×     18998× 18998× 1605× 1605×   17393×           3948× 17393×   18996× 1605×   17391×     18998× 18998× 18998×   18998× 8531×     10467× 10467× 10467×     17393×      
'use strict';
 
Object.defineProperty(exports, "__esModule", {
  value: true
});
 
var _errors = require('../errors');
 
var _updateDoc = require('./updateDoc');
 
var _updateDoc2 = _interopRequireDefault(_updateDoc);
 
var _isDeleted = require('./isDeleted');
 
var _isDeleted2 = _interopRequireDefault(_isDeleted);
 
var _isLocalId = require('./isLocalId');
 
var _isLocalId2 = _interopRequireDefault(_isLocalId);
 
var _winningRev = require('../../deps/merge/winningRev');
 
var _winningRev2 = _interopRequireDefault(_winningRev);
 
var _index = require('../../deps/merge/index');
 
var _index2 = _interopRequireDefault(_index);
 
var _pouchdbCollections = require('pouchdb-collections');
 
var _pouchdbCollections2 = _interopRequireDefault(_pouchdbCollections);
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
function rootIsMissing(docInfo) {
  return docInfo.metadata.rev_tree[0].ids[1].status === 'missing';
}
 
function processDocs(revLimit, docInfos, api, fetchedDocs, tx, results, writeDoc, opts, overallCallback) {
 
  // Default to 1000 locally
  revLimit = revLimit || 1000;
 
  function insertDoc(docInfo, resultsIdx, callback) {
    // Cant insert new deleted documents
    var winningRev = (0, _winningRev2.default)(docInfo.metadata);
    var deleted = (0, _isDeleted2.default)(docInfo.metadata, winningRev);
    if ('was_delete' in opts && deleted) {
      results[resultsIdx] = (0, _errors.createError)(_errors.MISSING_DOC, 'deleted');
      return callback();
    }
 
    // 4712 - detect whether a new document was inserted with a _rev
    var inConflict = newEdits && rootIsMissing(docInfo);
 
    if (inConflict) {
      var err = (0, _errors.createError)(_errors.REV_CONFLICT);
      results[resultsIdx] = err;
      return callback();
    }
 
    var delta = deleted ? 0 : 1;
 
    writeDoc(docInfo, winningRev, deleted, deleted, false, delta, resultsIdx, callback);
  }
 
  var newEdits = opts.new_edits;
  var idsToDocs = new _pouchdbCollections2.default.Map();
 
  var docsDone = 0;
  var docsToDo = docInfos.length;
 
  function checkAllDocsDone() {
    if (++docsDone === docsToDo && overallCallback) {
      overallCallback();
    }
  }
 
  docInfos.forEach(function (currentDoc, resultsIdx) {
 
    if (currentDoc._id && (0, _isLocalId2.default)(currentDoc._id)) {
      var fun = currentDoc._deleted ? '_removeLocal' : '_putLocal';
      api[fun](currentDoc, { ctx: tx }, function (err, res) {
        results[resultsIdx] = err || res;
        checkAllDocsDone();
      });
      return;
    }
 
    var id = currentDoc.metadata.id;
    if (idsToDocs.has(id)) {
      docsToDo--; // duplicate
      idsToDocs.get(id).push([currentDoc, resultsIdx]);
    } else {
      idsToDocs.set(id, [[currentDoc, resultsIdx]]);
    }
  });
 
  // in the case of new_edits, the user can provide multiple docs
  // with the same id. these need to be processed sequentially
  idsToDocs.forEach(function (docs, id) {
    var numDone = 0;
 
    function docWritten() {
      if (++numDone < docs.length) {
        nextDoc();
      } else {
        checkAllDocsDone();
      }
    }
    function nextDoc() {
      var value = docs[numDone];
      var currentDoc = value[0];
      var resultsIdx = value[1];
 
      if (fetchedDocs.has(id)) {
        (0, _updateDoc2.default)(revLimit, fetchedDocs.get(id), currentDoc, results, resultsIdx, docWritten, writeDoc, newEdits);
      } else {
        // Ensure stemming applies to new writes as well
        var merged = (0, _index2.default)([], currentDoc.metadata.rev_tree[0], revLimit);
        currentDoc.metadata.rev_tree = merged.tree;
        insertDoc(currentDoc, resultsIdx, docWritten);
      }
    }
    nextDoc();
  });
}
 
exports.default = processDocs;
module.exports = exports['default'];