module.exports = class Query { constructor (data) { this.data = data.map(item => { item.sortScore = 0; return item; }); } get results () { return this.data; } filter (func) { this.data = this.data.filter(func); return this; } filterBy (key, func) { this.data = this.data.filter(item => func(item[key])); return this; } search (key, term, score = 0) { switch (typeof term) { case 'boolean': this.data = this.data.filter(item => item[key] === term); break; case 'string': this.data = this.data.filter(item => { let regFind = new RegExp(term, 'gi'); let termMatches = (item[key].match(regFind) || []).length; item.sortScore += termMatches; return termMatches; }); break; } return this; } sort (key = 'sortScore') { this.data = this.data.sort((a, b) => { if (a[key] < b[key]) return -1; if (a[key] > b[key]) return 1; return 0; }); return this; } paginate (page = 1, perPage = 10) { let min = page * perPage - perPage; let max = min + perPage; this.data = this.data.slice(min, max); return this; } };