filter: Cache/store sorted_term_types.

Given that the sorted term types depends only on the filter, it makes
sense to only build them once and cache the results.
This commit is contained in:
YashRE42
2020-03-15 19:49:18 +05:30
committed by Tim Abbott
parent 83ad56aa64
commit 4d972e1d10
2 changed files with 29 additions and 1 deletions

View File

@@ -1179,10 +1179,31 @@ run_test('term_type', () => {
{operator: 'sender', operand: 'steve@foo.com'}, {operator: 'sender', operand: 'steve@foo.com'},
{operator: 'stream', operand: 'Verona'}, {operator: 'stream', operand: 'Verona'},
]; ];
const filter = new Filter(terms); let filter = new Filter(terms);
const term_types = filter.sorted_term_types(); const term_types = filter.sorted_term_types();
assert.deepEqual(term_types, ['stream', 'topic', 'sender']); assert.deepEqual(term_types, ['stream', 'topic', 'sender']);
// test caching of term types
// init and stub
filter = new Filter(terms);
filter.stub = filter._build_sorted_term_types;
filter._build_sorted_term_types = function () {
this._build_sorted_term_types_called = true;
return this.stub();
};
// uncached trial
filter._build_sorted_term_types_called = false;
const built_terms = filter.sorted_term_types();
assert.deepEqual(built_terms, ['stream', 'topic', 'sender']);
assert(filter._build_sorted_term_types_called);
// cached trial
filter._build_sorted_term_types_called = false;
const cached_terms = filter.sorted_term_types();
assert.deepEqual(cached_terms, ['stream', 'topic', 'sender']);
assert(!filter._build_sorted_term_types_called);
}); });
run_test('first_valid_id_from', () => { run_test('first_valid_id_from', () => {

View File

@@ -502,6 +502,13 @@ Filter.prototype = {
}, },
sorted_term_types: function () { sorted_term_types: function () {
if (this._sorted_term_types === undefined) {
this._sorted_term_types = this._build_sorted_term_types();
}
return this._sorted_term_types;
},
_build_sorted_term_types: function () {
const terms = this._operators; const terms = this._operators;
const term_types = terms.map(Filter.term_type); const term_types = terms.map(Filter.term_type);
const sorted_terms = Filter.sorted_term_types(term_types); const sorted_terms = Filter.sorted_term_types(term_types);