From a02db6d5e9f6dc960a2949010401fb8a94ac75cb Mon Sep 17 00:00:00 2001 From: Rashid Khan Date: Mon, 2 Dec 2013 14:07:48 -0700 Subject: [PATCH] Eliminate idQueue property from filterSrv and querySrv. Replace with binary search for smallest id. Closes #730. Closes #739 --- src/app/components/kbn.js | 20 ++++++++++++++++++++ src/app/services/filterSrv.js | 15 +++++++-------- src/app/services/querySrv.js | 16 +++++++--------- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/app/components/kbn.js b/src/app/components/kbn.js index 7d8efef2e43..8a7bb392b74 100644 --- a/src/app/components/kbn.js +++ b/src/app/components/kbn.js @@ -479,6 +479,26 @@ function($, _, moment) { }); }; + // Find the smallest missing number in an array + kbn.smallestMissing = function(arr,start,end) { + start = start || 0; + end = end || arr.length-1; + + if(start > end) { + return end + 1; + } + if(start !== arr[start]) { + return start; + } + var middle = Math.floor((start + end) / 2); + + if (arr[middle] > middle) { + return kbn.smallestMissing(arr, start, middle); + } else { + return kbn.smallestMissing(arr, middle + 1, end); + } + }; + kbn.byteFormat = function(size, decimals) { var ext, steps = 0; decimals = decimals || 2; diff --git a/src/app/services/filterSrv.js b/src/app/services/filterSrv.js index e5def56bb2b..fa25390083d 100644 --- a/src/app/services/filterSrv.js +++ b/src/app/services/filterSrv.js @@ -14,14 +14,12 @@ define([ // Defaults for it var _d = { - idQueue : [], list : {}, ids : [] }; // For convenience var ejs = ejsResource(config.elasticsearch); - var _f = dashboard.current.services.filter; // Save a reference to this var self = this; @@ -34,7 +32,6 @@ define([ // Accessors self.list = dashboard.current.services.filter.list; self.ids = dashboard.current.services.filter.ids; - _f = dashboard.current.services.filter; _.each(self.list,function(f) { self.set(f,f.id,true); @@ -97,8 +94,6 @@ define([ delete self.list[id]; // This must happen on the full path also since _.without returns a copy self.ids = dashboard.current.services.filter.ids = _.without(self.ids,id); - _f.idQueue.unshift(id); - _f.idQueue.sort(function(v,k){return v-k;}); _r = true; } else { _r = false; @@ -230,10 +225,14 @@ define([ }; var nextId = function() { - if(_f.idQueue.length > 0) { - return _f.idQueue.shift(); + var idCount = dashboard.current.services.filter.ids.length; + if(idCount > 0) { + // Make a sorted copy of the ids array + var ids = _.clone(dashboard.current.services.filter.ids).sort(); + return kbn.smallestMissing(ids); } else { - return self.ids.length; + // No ids currently in list + return 0; } }; diff --git a/src/app/services/querySrv.js b/src/app/services/querySrv.js index 3b0b447d1d1..9cd6829c259 100644 --- a/src/app/services/querySrv.js +++ b/src/app/services/querySrv.js @@ -14,7 +14,6 @@ function (angular, _, config, kbn) { // Create an object to hold our service state on the dashboard dashboard.current.services.query = dashboard.current.services.query || {}; _.defaults(dashboard.current.services.query,{ - idQueue : [], list : {}, ids : [], }); @@ -31,7 +30,6 @@ function (angular, _, config, kbn) { // For convenience var ejs = ejsResource(config.elasticsearch); - var _q = dashboard.current.services.query; // Holds all actual queries, including all resolved abstract queries var resolvedQueries = []; @@ -176,10 +174,6 @@ function (angular, _, config, kbn) { delete self.list[id]; // This must happen on the full path also since _.without returns a copy self.ids = dashboard.current.services.query.ids = _.without(self.ids,id); - _q.idQueue.unshift(id); - _q.idQueue.sort(function(v,k){ - return v-k; - }); return true; } else { return false; @@ -246,10 +240,14 @@ function (angular, _, config, kbn) { }; var nextId = function() { - if(_q.idQueue.length > 0) { - return _q.idQueue.shift(); + var idCount = dashboard.current.services.query.ids.length; + if(idCount > 0) { + // Make a sorted copy of the ids array + var ids = _.clone(dashboard.current.services.query.ids).sort(); + return kbn.smallestMissing(ids); } else { - return self.ids.length; + // No ids currently in list + return 0; } };