From: Moriel Schottlender Date: Mon, 28 Aug 2017 20:06:31 +0000 (-0700) Subject: RCFilters: Minimize saved query before comparison X-Git-Tag: 1.31.0-rc.0~2279 X-Git-Url: https://git.heureux-cyclage.org/?a=commitdiff_plain;h=bf625c2b3a7c90cb69b4418a109dce0e35f1fd8b;p=lhc%2Fweb%2Fwiklou.git RCFilters: Minimize saved query before comparison Bug: T174193 Change-Id: I8e9345e8899fd27565930896e62c4d3be235ad58 --- diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js index a7f3d2312f..d87ef73407 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js +++ b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js @@ -18,6 +18,7 @@ OO.EmitterList.call( this ); this.default = config.default; + this.baseState = {}; // Events this.aggregate( { update: 'itemUpdate' } ); @@ -171,14 +172,44 @@ * @return {mw.rcfilters.dm.SavedQueryItemModel} Matching item model */ mw.rcfilters.dm.SavedQueriesModel.prototype.findMatchingQuery = function ( fullQueryComparison ) { + var model = this; + + fullQueryComparison = this.getDifferenceFromBase( fullQueryComparison ); + return this.getItems().filter( function ( item ) { + var comparedData = model.getDifferenceFromBase( item.getData() ); return OO.compare( - item.getData(), + comparedData, fullQueryComparison ); } )[ 0 ]; }; + /** + * Get a minimal representation of the state for comparison + * + * @param {Object} state Given state + * @return {Object} Minimal state + */ + mw.rcfilters.dm.SavedQueriesModel.prototype.getDifferenceFromBase = function ( state ) { + var result = { filters: {}, highlights: {}, invert: state.invert }, + baseState = this.baseState; + + // XOR results + $.each( state.filters, function ( name, value ) { + if ( baseState.filters !== undefined && baseState.filters[ name ] !== value ) { + result.filters[ name ] = value; + } + } ); + + $.each( state.highlights, function ( name, value ) { + if ( baseState.highlights !== undefined && baseState.highlights[ name ] !== value && name !== 'highlight' ) { + result.highlights[ name ] = value; + } + } ); + + return result; + }; /** * Get query by its identifier *