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

100% Statements 46/46
91.67% Branches 33/36
100% Functions 2/2
100% Lines 45/45
1 branch Ignored     
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                                  8531× 32× 32×       8499× 8499× 8499× 8499×   8499× 287× 287× 287× 287×     8499×   8499×   8499× 329× 329× 329×     8170× 8170×   8170× 8170×       8170× 8170×       8170×   8170× 8170×   6500×     1670×     8170×    
'use strict';
 
Object.defineProperty(exports, "__esModule", {
  value: true
});
 
var _errors = require('../errors');
 
var _isDeleted = require('./isDeleted');
 
var _isDeleted2 = _interopRequireDefault(_isDeleted);
 
var _parseDoc = require('./parseDoc');
 
var _winningRev = require('../../deps/merge/winningRev');
 
var _winningRev2 = _interopRequireDefault(_winningRev);
 
var _index = require('../../deps/merge/index');
 
var _index2 = _interopRequireDefault(_index);
 
var _revExists = require('../../deps/merge/revExists');
 
var _revExists2 = _interopRequireDefault(_revExists);
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
function updateDoc(revLimit, prev, docInfo, results, i, cb, writeDoc, newEdits) {
 
  if ((0, _revExists2.default)(prev.rev_tree, docInfo.metadata.rev)) {
    results[i] = docInfo;
    return cb();
  }
 
  // sometimes this is pre-calculated. historically not always
  var previousWinningRev = prev.winningRev || (0, _winningRev2.default)(prev);
  var previouslyDeleted = 'deleted' in prev ? prev.deleted : (0, _isDeleted2.default)(prev, previousWinningRev);
  var deleted = 'deleted' in docInfo.metadata ? docInfo.metadata.deleted : (0, _isDeleted2.default)(docInfo.metadata);
  var isRoot = /^1-/.test(docInfo.metadata.rev);
 
  if (previouslyDeleted && !deleted && newEdits && isRoot) {
    var newDoc = docInfo.data;
    newDoc._rev = previousWinningRev;
    newDoc._id = docInfo.metadata.id;
    docInfo = (0, _parseDoc.parseDoc)(newDoc, newEdits);
  }
 
  var merged = (0, _index2.default)(prev.rev_tree, docInfo.metadata.rev_tree[0], revLimit);
 
  var inConflict = newEdits && (previouslyDeleted && deleted || !previouslyDeleted && merged.conflicts !== 'new_leaf' || previouslyDeleted && !deleted && merged.conflicts === 'new_branch');
 
  if (inConflict) {
    var err = (0, _errors.createError)(_errors.REV_CONFLICT);
    results[i] = err;
    return cb();
  }
 
  var newRev = docInfo.metadata.rev;
  docInfo.metadata.rev_tree = merged.tree;
  /* istanbul ignore else */
  Eif (prev.rev_map) {
    docInfo.metadata.rev_map = prev.rev_map; // used only by leveldb
  }
 
  // recalculate
  var winningRev = (0, _winningRev2.default)(docInfo.metadata);
  var winningRevIsDeleted = (0, _isDeleted2.default)(docInfo.metadata, winningRev);
 
  // calculate the total number of documents that were added/removed,
  // from the perspective of total_rows/doc_count
  var delta = previouslyDeleted === winningRevIsDeleted ? 0 : previouslyDeleted < winningRevIsDeleted ? -1 : 1;
 
  var newRevIsDeleted;
  if (newRev === winningRev) {
    // if the new rev is the same as the winning rev, we can reuse that value
    newRevIsDeleted = winningRevIsDeleted;
  } else {
    // if they're not the same, then we need to recalculate
    newRevIsDeleted = (0, _isDeleted2.default)(docInfo.metadata, newRev);
  }
 
  writeDoc(docInfo, winningRev, winningRevIsDeleted, newRevIsDeleted, true, delta, i, cb);
}
 
exports.default = updateDoc;
module.exports = exports['default'];