| 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= |