Code coverage report for ranking/src/index.js

Statements: 94.12% (64 / 68)      Branches: 77.78% (28 / 36)      Functions: 100% (10 / 10)      Lines: 96.15% (50 / 52)      Ignored: none     

All files » ranking/src/ » index.js
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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148    1       3   21   1   1 1 1                         1 1 21 21   21   21 21 21     1     16     16 2     14   14     14   14 14 14   14 5                   9 9 9   9                       14         4   4     4   4         211 211   211   211 2     209                         1     1           1 42 27     15 15         1  
'use strict';
 
Object.defineProperty(exports, '__esModule', {
  value: true
});
 
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; Eif ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { Eif (protoProps) defineProperties(Constructor.prototype, protoProps); Iif (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
 
function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
var _core = require('./core');
 
var debug = require('./debug')('ranking');
var REGEXP_POSITIVE_NUMBER = /^\d+$/;
var REGEXP_NUMBER = /^-?\d+$/;
 
/**
 
  Nodes
  =============================================================
   {
      amount: 10,   // total number of playerIds
      children: [], // list of nodes  (only existing on non-leaf)
      playerIds: [] // users id       (only existing on leaf)
    }
 */
 
var Ranking = (function () {
  function Ranking(_ref) {
    var maxScore = _ref.maxScore;
    var branchFactor = _ref.branchFactor;
 
    _classCallCheck(this, Ranking);
 
    this.maxScore = maxScore;
    this.branchFactor = branchFactor;
    this.tree = { amount: 0, children: null };
  }
 
  _createClass(Ranking, [{
    key: 'find',
    value: function find(query) {
      debug('find');
 
      // rank is empty
      if (!this.tree.children) {
        return [];
      }
 
      var result = { position: 0, list: [] };
 
      Iif (!query) {
        query = {};
      }
      query.$limit = query.$limit || 10;
 
      prepareQueryByRange(query, 'playerId');
      prepareQueryByRange(query, 'position');
      prepareQueryByRange(query, 'score');
 
      if (query.position) {
        (0, _core.findByPosition)({
          branchFactor: this.branchFactor,
          node: this.tree,
          nodeScoreRange: {
            beginAt: 0,
            endAt: this.maxScore - 1 /*base 0*/
          },
          query: query,
          result: result
        });
      } else Eif (query.score) {
        query.score.$gte = query.score.$gte; /*base 0*/
        query.score.$lte = query.score.$lte || this.maxScore - 1 /*base 0*/;
 
        (0, _core.findByScore)({
          branchFactor: this.branchFactor,
          node: this.tree,
          nodeScoreRange: {
            beginAt: 0,
            endAt: this.maxScore /*base 0*/
          },
          query: query,
          result: result
        });
      }
 
      return result.list;
    }
  }, {
    key: 'findOne',
    value: function findOne(query) {
      debug('findOne');
 
      Iif (!query) {
        query = {};
      }
      query.$limit = 1;
 
      return this.find(query)[0];
    }
  }, {
    key: 'setScore',
    value: function setScore(_ref2) {
      var score = _ref2.score;
      var playerId = _ref2.playerId;
 
      debug('setScore');
 
      if (!REGEXP_POSITIVE_NUMBER.test(playerId)) {
        throw new Error('playerId must be a number');
      }
 
      return (0, _core.setScore)({
        branchFactor: this.branchFactor,
        score: score,
        playerId: playerId,
        node: this.tree,
        nodeScoreRange: {
          beginAt: 0,
          endAt: this.maxScore - 1 /*base 0*/
        }
      });
    }
  }]);
 
  return Ranking;
})();
 
exports['default'] = Ranking;
 
/**
 * prepares the query before searching in the ranking
 * it is possible to filter by a specific value or a range ($gte and $lte)
 */
function prepareQueryByRange(query, field) {
  if (!query[field]) {
    return;
  }
 
  var value = REGEXP_NUMBER.test(query[field]) && query[field];
  query[field] = {
    $gte: value || query[field].$gte || 1,
    $lte: value || query[field].$lte || 100
  };
}
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXhjbnVuZXMvRGV2ZWxvcG1lbnQvbWUvcmFua2luZy9zcmMvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztvQkFBc0QsUUFBUTs7QUFFOUQsSUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzVDLElBQU0sc0JBQXNCLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLElBQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQzs7Ozs7Ozs7Ozs7OztJQVlYLE9BQU87QUFDZCxXQURPLE9BQU8sQ0FDYixJQUEwQixFQUFFO1FBQTFCLFFBQVEsR0FBVixJQUEwQixDQUF4QixRQUFRO1FBQUUsWUFBWSxHQUF4QixJQUEwQixDQUFkLFlBQVk7OzBCQURsQixPQUFPOztBQUV4QixRQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUN6QixRQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztBQUNqQyxRQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7R0FDM0M7O2VBTGtCLE9BQU87O1dBT3RCLGNBQUMsS0FBSyxFQUFFO0FBQ1YsV0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDOzs7QUFHZCxVQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7QUFBRSxlQUFPLEVBQUUsQ0FBQztPQUFFOztBQUV2QyxVQUFNLE1BQU0sR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDOztBQUV6QyxVQUFJLENBQUMsS0FBSyxFQUFFO0FBQUUsYUFBSyxHQUFHLEVBQUUsQ0FBQztPQUFFO0FBQzNCLFdBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7O0FBRWxDLHlCQUFtQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FB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LENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUNyQyxRQUFJLEVBQUUsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRztHQUN4QyxDQUFDO0NBQ0giLCJmaWxlIjoiL1VzZXJzL21heGNudW5lcy9EZXZlbG9wbWVudC9tZS9yYW5raW5nL3NyYy9pbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpbmRCeVNjb3JlLCBmaW5kQnlQb3NpdGlvbiwgc2V0U2NvcmUgfSBmcm9tICcuL2NvcmUnO1xuXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4vZGVidWcnKSgncmFua2luZycpO1xuY29uc3QgUkVHRVhQX1BPU0lUSVZFX05VTUJFUiA9IC9eXFxkKyQvO1xuY29uc3QgUkVHRVhQX05VTUJFUiA9IC9eLT9cXGQrJC87XG5cbi8qKlxuXG4gIE5vZGVzXG4gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgIHtcbiAgICAgIGFtb3VudDogMTAsICAgLy8gdG90YWwgbnVtYmVyIG9mIHBsYXllcklkc1xuICAgICAgY2hpbGRyZW46IFtdLCAvLyBsaXN0IG9mIG5vZGVzICAob25seSBleGlzdGluZyBvbiBub24tbGVhZilcbiAgICAgIHBsYXllcklkczogW10gLy8gdXNlcnMgaWQgICAgICAgKG9ubHkgZXhpc3Rpbmcgb24gbGVhZilcbiAgICB9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhbmtpbmcge1xuICBjb25zdHJ1Y3RvciAoeyBtYXhTY29yZSwgYnJhbmNoRmFjdG9yIH0pIHtcbiAgICB0aGlzLm1heFNjb3JlID0gbWF4U2NvcmU7XG4gICAgdGhpcy5icmFuY2hGYWN0b3IgPSBicmFuY2hGYWN0b3I7XG4gICAgdGhpcy50cmVlID0geyBhbW91bnQ6IDAsIGNoaWxkcmVuOiBudWxsIH07XG4gIH1cblxuICBmaW5kKHF1ZXJ5KSB7XG4gICAgZGVidWcoJ2ZpbmQnKTtcblxuICAgIC8vIHJhbmsgaXMgZW1wdHlcbiAgICBpZiAoIXRoaXMudHJlZS5jaGlsZHJlbikgeyByZXR1cm4gW107IH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHsgcG9zaXRpb246IDAsIGxpc3Q6IFtdIH07XG5cbiAgICBpZiAoIXF1ZXJ5KSB7IHF1ZXJ5ID0ge307IH1cbiAgICBxdWVyeS4kbGltaXQgPSBxdWVyeS4kbGltaXQgfHwgMTA7XG5cbiAgICBwcmVwYXJlUXVlcnlCeVJhbmdlKHF1ZXJ5LCAncGxheWVySWQnKTtcbiAgICBwcmVwYXJlUXVlcnlCeVJhbmdlKHF1ZXJ5LCAncG9zaXRpb24nKTtcbiAgICBwcmVwYXJlUXVlcnlCeVJhbmdlKHF1ZXJ5LCAnc2NvcmUnKTtcblxuICAgIGlmIChxdWVyeS5wb3NpdGlvbikge1xuICAgICAgZmluZEJ5UG9zaXRpb24oe1xuICAgICAgICBicmFuY2hGYWN0b3I6IHRoaXMuYnJhbmNoRmFjdG9yLFxuICAgICAgICBub2RlOiB0aGlzLnRyZWUsXG4gICAgICAgIG5vZGVTY29yZVJhbmdlOiB7XG4gICAgICAgICAgYmVnaW5BdDogMCxcbiAgICAgICAgICBlbmRBdDogdGhpcy5tYXhTY29yZSAtIDEvKmJhc2UgMCovXG4gICAgICAgIH0sXG4gICAgICAgIHF1ZXJ5OiBxdWVyeSxcbiAgICAgICAgcmVzdWx0XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAocXVlcnkuc2NvcmUpIHtcbiAgICAgIHF1ZXJ5LnNjb3JlLiRndGUgPSBxdWVyeS5zY29yZS4kZ3RlOy8qYmFzZSAwKi9cbiAgICAgIHF1ZXJ5LnNjb3JlLiRsdGUgPSAocXVlcnkuc2NvcmUuJGx0ZSB8fCB0aGlzLm1heFNjb3JlIC0gMS8qYmFzZSAwKi8pO1xuXG4gICAgICBmaW5kQnlTY29yZSh7XG4gICAgICAgIGJyYW5jaEZhY3RvcjogdGhpcy5icmFuY2hGYWN0b3IsXG4gICAgICAgIG5vZGU6IHRoaXMudHJlZSxcbiAgICAgICAgbm9kZVNjb3JlUmFuZ2U6IHtcbiAgICAgICAgICBiZWdpbkF0OiAwLFxuICAgICAgICAgIGVuZEF0OiB0aGlzLm1heFNjb3JlLypiYXNlIDAqL1xuICAgICAgICB9LFxuICAgICAgICBxdWVyeTogcXVlcnksXG4gICAgICAgIHJlc3VsdFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5saXN0O1xuICB9XG5cbiAgZmluZE9uZShxdWVyeSkge1xuICAgIGRlYnVnKCdmaW5kT25lJyk7XG5cbiAgICBpZiAoIXF1ZXJ5KSB7IHF1ZXJ5ID0ge307IH1cbiAgICBxdWVyeS4kbGltaXQgPSAxO1xuXG4gICAgcmV0dXJuIHRoaXMuZmluZChxdWVyeSlbMF07XG4gIH1cblxuICBzZXRTY29yZSh7IHNjb3JlLCBwbGF5ZXJJZCB9KSB7XG4gICAgZGVidWcoJ3NldFNjb3JlJyk7XG5cbiAgICBpZiAoIVJFR0VYUF9QT1NJVElWRV9OVU1CRVIudGVzdChwbGF5ZXJJZCkpIHsgdGhyb3cgbmV3IEVycm9yKCdwbGF5ZXJJZCBtdXN0IGJlIGEgbnVtYmVyJyk7IH1cblxuICAgIHJldHVybiBzZXRTY29yZSh7XG4gICAgICBicmFuY2hGYWN0b3I6IHRoaXMuYnJhbmNoRmFjdG9yLFxuICAgICAgc2NvcmUsXG4gICAgICBwbGF5ZXJJZCxcbiAgICAgIG5vZGU6IHRoaXMudHJlZSxcbiAgICAgIG5vZGVTY29yZVJhbmdlOiB7XG4gICAgICAgIGJlZ2luQXQ6IDAsXG4gICAgICAgIGVuZEF0OiB0aGlzLm1heFNjb3JlIC0gMS8qYmFzZSAwKi9cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5cbi8qKlxuICogcHJlcGFyZXMgdGhlIHF1ZXJ5IGJlZm9yZSBzZWFyY2hpbmcgaW4gdGhlIHJhbmtpbmdcbiAqIGl0IGlzIHBvc3NpYmxlIHRvIGZpbHRlciBieSBhIHNwZWNpZmljIHZhbHVlIG9yIGEgcmFuZ2UgKCRndGUgYW5kICRsdGUpXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVRdWVyeUJ5UmFuZ2UgKHF1ZXJ5LCBmaWVsZCkge1xuICBpZiAoIXF1ZXJ5W2ZpZWxkXSkgeyByZXR1cm47IH1cblxuICBjb25zdCB2YWx1ZSA9IFJFR0VYUF9OVU1CRVIudGVzdChxdWVyeVtmaWVsZF0pICYmIHF1ZXJ5W2ZpZWxkXTtcbiAgcXVlcnlbZmllbGRdID0ge1xuICAgICRndGU6IHZhbHVlIHx8IHF1ZXJ5W2ZpZWxkXS4kZ3RlIHx8IDEsXG4gICAgJGx0ZTogdmFsdWUgfHwgcXVlcnlbZmllbGRdLiRsdGUgfHwgMTAwXG4gIH07XG59XG4iXX0=