all files / lib/mapreduce/ createView.js

100% Statements 49/49
96.67% Branches 29/30
100% Functions 9/9
100% Lines 48/48
1 statement, 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 88 89 90 91 92                        516× 516× 516× 516× 516×     516×   516× 147× 147× 142×       374×   374×       700× 700× 700×   700×   700× 139×   561× 561×   374× 374× 374× 374× 374×               374×   347×     374× 374× 147× 147× 147× 144×     374×            
'use strict';
 
Object.defineProperty(exports, "__esModule", {
  value: true
});
 
var _upsert = require('../deps/upsert');
 
var _upsert2 = _interopRequireDefault(_upsert);
 
var _promise = require('../deps/promise');
 
var _promise2 = _interopRequireDefault(_promise);
 
var _md = require('./md5');
 
var _md2 = _interopRequireDefault(_md);
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
function createView(opts) {
  var sourceDB = opts.db;
  var viewName = opts.viewName;
  var mapFun = opts.map;
  var reduceFun = opts.reduce;
  var temporary = opts.temporary;
 
  // the "undefined" part is for backwards compatibility
  var viewSignature = mapFun.toString() + (reduceFun && reduceFun.toString()) + 'undefined';
 
  if (!temporary && sourceDB._cachedViews) {
    var cachedView = sourceDB._cachedViews[viewSignature];
    if (cachedView) {
      return _promise2.default.resolve(cachedView);
    }
  }
 
  return sourceDB.info().then(function (info) {
 
    var depDbName = info.db_name + '-mrview-' + (temporary ? 'temp' : (0, _md2.default)(viewSignature));
 
    // save the view name in the source db so it can be cleaned up if necessary
    // (e.g. when the _design doc is deleted, remove all associated view data)
    function diffFunction(doc) {
      doc.views = doc.views || {};
      var fullViewName = viewName;
      if (fullViewName.indexOf('/') === -1) {
        fullViewName = viewName + '/' + viewName;
      }
      var depDbs = doc.views[fullViewName] = doc.views[fullViewName] || {};
      /* istanbul ignore if */
      if (depDbs[depDbName]) {
        return; // no update necessary
      }
      depDbs[depDbName] = true;
      return doc;
    }
    return (0, _upsert2.default)(sourceDB, '_local/mrviews', diffFunction).then(function () {
      return sourceDB.registerDependentDatabase(depDbName).then(function (res) {
        var db = res.db;
        db.auto_compaction = true;
        var view = {
          name: depDbName,
          db: db,
          sourceDB: sourceDB,
          adapter: sourceDB.adapter,
          mapFun: mapFun,
          reduceFun: reduceFun
        };
        return view.db.get('_local/lastSeq').catch(function (err) {
          /* istanbul ignore if */
          Iif (err.status !== 404) {
            throw err;
          }
        }).then(function (lastSeqDoc) {
          view.seq = lastSeqDoc ? lastSeqDoc.seq : 0;
          if (!temporary) {
            sourceDB._cachedViews = sourceDB._cachedViews || {};
            sourceDB._cachedViews[viewSignature] = view;
            view.db.once('destroyed', function () {
              delete sourceDB._cachedViews[viewSignature];
            });
          }
          return view;
        });
      });
    });
  });
}
 
exports.default = createView;
module.exports = exports['default'];