瀏覽代碼

Eliminate idQueue property from filterSrv and querySrv. Replace with binary search for smallest id. Closes #730. Closes #739

Rashid Khan 12 年之前
父節點
當前提交
a02db6d5e9
共有 3 個文件被更改,包括 34 次插入17 次删除
  1. 20 0
      src/app/components/kbn.js
  2. 7 8
      src/app/services/filterSrv.js
  3. 7 9
      src/app/services/querySrv.js

+ 20 - 0
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) {
   kbn.byteFormat = function(size, decimals) {
     var ext, steps = 0;
     var ext, steps = 0;
     decimals = decimals || 2;
     decimals = decimals || 2;

+ 7 - 8
src/app/services/filterSrv.js

@@ -14,14 +14,12 @@ define([
 
 
     // Defaults for it
     // Defaults for it
     var _d = {
     var _d = {
-      idQueue : [],
       list : {},
       list : {},
       ids : []
       ids : []
     };
     };
 
 
     // For convenience
     // For convenience
     var ejs = ejsResource(config.elasticsearch);
     var ejs = ejsResource(config.elasticsearch);
-    var _f = dashboard.current.services.filter;
 
 
     // Save a reference to this
     // Save a reference to this
     var self = this;
     var self = this;
@@ -34,7 +32,6 @@ define([
       // Accessors
       // Accessors
       self.list = dashboard.current.services.filter.list;
       self.list = dashboard.current.services.filter.list;
       self.ids = dashboard.current.services.filter.ids;
       self.ids = dashboard.current.services.filter.ids;
-      _f = dashboard.current.services.filter;
 
 
       _.each(self.list,function(f) {
       _.each(self.list,function(f) {
         self.set(f,f.id,true);
         self.set(f,f.id,true);
@@ -97,8 +94,6 @@ define([
         delete self.list[id];
         delete self.list[id];
         // This must happen on the full path also since _.without returns a copy
         // This must happen on the full path also since _.without returns a copy
         self.ids = dashboard.current.services.filter.ids = _.without(self.ids,id);
         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;
         _r = true;
       } else {
       } else {
         _r = false;
         _r = false;
@@ -230,10 +225,14 @@ define([
     };
     };
 
 
     var nextId = function() {
     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 {
       } else {
-        return self.ids.length;
+        // No ids currently in list
+        return 0;
       }
       }
     };
     };
 
 

+ 7 - 9
src/app/services/querySrv.js

@@ -14,7 +14,6 @@ function (angular, _, config, kbn) {
     // Create an object to hold our service state on the dashboard
     // Create an object to hold our service state on the dashboard
     dashboard.current.services.query = dashboard.current.services.query || {};
     dashboard.current.services.query = dashboard.current.services.query || {};
     _.defaults(dashboard.current.services.query,{
     _.defaults(dashboard.current.services.query,{
-      idQueue : [],
       list : {},
       list : {},
       ids : [],
       ids : [],
     });
     });
@@ -31,7 +30,6 @@ function (angular, _, config, kbn) {
 
 
     // For convenience
     // For convenience
     var ejs = ejsResource(config.elasticsearch);
     var ejs = ejsResource(config.elasticsearch);
-    var _q = dashboard.current.services.query;
 
 
     // Holds all actual queries, including all resolved abstract queries
     // Holds all actual queries, including all resolved abstract queries
     var resolvedQueries = [];
     var resolvedQueries = [];
@@ -176,10 +174,6 @@ function (angular, _, config, kbn) {
         delete self.list[id];
         delete self.list[id];
         // This must happen on the full path also since _.without returns a copy
         // This must happen on the full path also since _.without returns a copy
         self.ids = dashboard.current.services.query.ids = _.without(self.ids,id);
         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;
         return true;
       } else {
       } else {
         return false;
         return false;
@@ -246,10 +240,14 @@ function (angular, _, config, kbn) {
     };
     };
 
 
     var nextId = function() {
     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 {
       } else {
-        return self.ids.length;
+        // No ids currently in list
+        return 0;
       }
       }
     };
     };