Преглед изворни кода

Merge pull request #255 from rashidkpc/master

renamed query service to querySrv, added query pinning
Rashid Khan пре 12 година
родитељ
комит
87afc4dd50

+ 17 - 4
js/filters.js

@@ -4,7 +4,20 @@
 
 
 angular.module('kibana.filters', [])
 angular.module('kibana.filters', [])
 .filter('stringSort', function() {
 .filter('stringSort', function() {
-    return function(input) {
-      return input.sort();
-    };
-  });
+  return function(input) {
+    return input.sort();
+  };
+}).filter('pinnedQuery', function(querySrv) {
+  return function( items, pinned) {
+    var ret = _.filter(querySrv.ids,function(id){
+      var v = querySrv.list[id];
+      if(!_.isUndefined(v.pin) && v.pin === true && pinned === true) {
+        return true;
+      }
+      if((_.isUndefined(v.pin) || v.pin === false) && pinned === false) {
+        return true;
+      }
+    });
+    return ret;
+  };
+});

+ 21 - 4
js/services.js

@@ -193,7 +193,7 @@ angular.module('kibana.services', [])
   };
   };
 
 
 })
 })
-.service('query', function(dashboard) {
+.service('querySrv', function(dashboard, ejsResource) {
   // 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,{
@@ -203,7 +203,9 @@ angular.module('kibana.services', [])
   });
   });
 
 
   // For convenience 
   // For convenience 
+  var ejs = ejsResource(config.elasticsearch);  
   var _q = dashboard.current.services.query;
   var _q = dashboard.current.services.query;
+
   this.colors = [ 
   this.colors = [ 
     "#7EB26D","#EAB839","#6ED0E0","#EF843C","#E24D42","#1F78C1","#BA43A9","#705DA0", //1
     "#7EB26D","#EAB839","#6ED0E0","#EF843C","#E24D42","#1F78C1","#BA43A9","#705DA0", //1
     "#508642","#CCA300","#447EBC","#C15C17","#890F02","#0A437C","#6D1F62","#584477", //2
     "#508642","#CCA300","#447EBC","#C15C17","#890F02","#0A437C","#6D1F62","#584477", //2
@@ -243,6 +245,7 @@ angular.module('kibana.services', [])
         query: '*',
         query: '*',
         alias: '',
         alias: '',
         color: colorAt(_id),
         color: colorAt(_id),
+        pin: false,
         id: _id,
         id: _id,
         type: 'lucene'
         type: 'lucene'
       };
       };
@@ -268,6 +271,20 @@ angular.module('kibana.services', [])
     }
     }
   };
   };
 
 
+  this.getEjsObj = function(id) {
+    return self.toEjsObj(self.list[id]);
+  };
+
+  this.toEjsObj = function (q) {
+    switch(q.type)
+    {
+    case 'lucene':
+      return ejs.QueryStringQuery(q.query || '*');
+    default:
+      return _.isUndefined(q.query) ? false : ejs.QueryStringQuery(q.query || '*');
+    }
+  };
+
   this.findQuery = function(queryString) {
   this.findQuery = function(queryString) {
     return _.findWhere(self.list,{query:queryString});
     return _.findWhere(self.list,{query:queryString});
   };
   };
@@ -485,7 +502,7 @@ angular.module('kibana.services', [])
 
 
   // Store a reference to this
   // Store a reference to this
   var self = this;
   var self = this;
-  var filterSrv,query;
+  var filterSrv,querySrv;
 
 
   this.current = {};
   this.current = {};
   this.last = {};
   this.last = {};
@@ -574,11 +591,11 @@ angular.module('kibana.services', [])
     self.current = _.clone(dashboard);
     self.current = _.clone(dashboard);
 
 
     // Ok, now that we've setup the current dashboard, we can inject our services
     // Ok, now that we've setup the current dashboard, we can inject our services
-    query = $injector.get('query');
+    querySrv = $injector.get('querySrv');
     filterSrv = $injector.get('filterSrv');
     filterSrv = $injector.get('filterSrv');
 
 
     // Make sure these re-init
     // Make sure these re-init
-    query.init();
+    querySrv.init();
     filterSrv.init();
     filterSrv.init();
 
 
     if(dashboard.index.interval !== 'none' && filterSrv.idsByType('time').length === 0) {
     if(dashboard.index.interval !== 'none' && filterSrv.idsByType('time').length === 0) {

+ 3 - 3
panels/bettermap/module.js

@@ -20,7 +20,7 @@
 'use strict';
 'use strict';
 
 
 angular.module('kibana.bettermap', [])
 angular.module('kibana.bettermap', [])
-.controller('bettermap', function($scope, query, dashboard, filterSrv) {
+.controller('bettermap', function($scope, querySrv, dashboard, filterSrv) {
 
 
   // Set and populate defaults
   // Set and populate defaults
   var _d = {
   var _d = {
@@ -67,8 +67,8 @@ angular.module('kibana.bettermap', [])
     var _segment = _.isUndefined(segment) ? 0 : segment;
     var _segment = _.isUndefined(segment) ? 0 : segment;
 
 
     var boolQuery = $scope.ejs.BoolQuery();
     var boolQuery = $scope.ejs.BoolQuery();
-    _.each(query.list,function(q) {
-      boolQuery = boolQuery.should($scope.ejs.QueryStringQuery((q.query || '*')));
+    _.each(querySrv.list,function(q) {
+      boolQuery = boolQuery.should(querySrv.toEjsObj(q));
     });
     });
 
 
     var request = $scope.ejs.Request().indices(dashboard.indices[_segment])
     var request = $scope.ejs.Request().indices(dashboard.indices[_segment])

+ 1 - 1
panels/fields/module.js

@@ -24,7 +24,7 @@
 'use strict';
 'use strict';
 
 
 angular.module('kibana.fields', [])
 angular.module('kibana.fields', [])
-.controller('fields', function($scope, eventBus, $timeout, dashboard, query, filterSrv) {
+.controller('fields', function($scope, eventBus, $timeout, dashboard, filterSrv) {
 
 
   // Set and populate defaults
   // Set and populate defaults
   var _d = {
   var _d = {

+ 8 - 8
panels/histogram/module.js

@@ -41,15 +41,15 @@
 'use strict';
 'use strict';
 
 
 angular.module('kibana.histogram', [])
 angular.module('kibana.histogram', [])
-.controller('histogram', function($scope, eventBus, query, dashboard, filterSrv) {
+.controller('histogram', function($scope, eventBus, querySrv, dashboard, filterSrv) {
 
 
   // Set and populate defaults
   // Set and populate defaults
   var _d = {
   var _d = {
     status      : "Stable",
     status      : "Stable",
     group       : "default",
     group       : "default",
-    query       : [ {query: "*", label:"Query"} ],
     mode        : 'count',
     mode        : 'count',
     time_field  : '@timestamp',
     time_field  : '@timestamp',
+    queries     : [],
     value_field : null,
     value_field : null,
     auto_int    : true,
     auto_int    : true,
     resolution  : 100, 
     resolution  : 100, 
@@ -73,7 +73,7 @@ angular.module('kibana.histogram', [])
 
 
   $scope.init = function() {
   $scope.init = function() {
 
 
-    $scope.queries = query;
+    $scope.querySrv = querySrv;
 
 
     $scope.$on('refresh',function(){
     $scope.$on('refresh',function(){
       $scope.get_data();
       $scope.get_data();
@@ -103,9 +103,9 @@ angular.module('kibana.histogram', [])
     var request = $scope.ejs.Request().indices(dashboard.indices[_segment]);
     var request = $scope.ejs.Request().indices(dashboard.indices[_segment]);
 
 
     // Build the query
     // Build the query
-    _.each($scope.queries.ids, function(id) {
+    _.each(querySrv.ids, function(id) {
       var query = $scope.ejs.FilteredQuery(
       var query = $scope.ejs.FilteredQuery(
-        $scope.ejs.QueryStringQuery($scope.queries.list[id].query || '*'),
+        querySrv.getEjsObj(id),
         filterSrv.getBoolFilter(filterSrv.ids)
         filterSrv.getBoolFilter(filterSrv.ids)
       );
       );
 
 
@@ -151,13 +151,13 @@ angular.module('kibana.histogram', [])
 
 
       // Make sure we're still on the same query/queries
       // Make sure we're still on the same query/queries
       if($scope.query_id === query_id && 
       if($scope.query_id === query_id && 
-        _.intersection(facetIds,query.ids).length === query.ids.length
+        _.intersection(facetIds,querySrv.ids).length === querySrv.ids.length
         ) {
         ) {
 
 
         var i = 0;
         var i = 0;
         var data, hits;
         var data, hits;
 
 
-        _.each(query.ids, function(id) {
+        _.each(querySrv.ids, function(id) {
           var v = results.facets[id];
           var v = results.facets[id];
 
 
           // Null values at each end of the time range ensure we see entire range
           // Null values at each end of the time range ensure we see entire range
@@ -184,7 +184,7 @@ angular.module('kibana.histogram', [])
           // Create the flot series object
           // Create the flot series object
           var series = { 
           var series = { 
             data: {
             data: {
-              info: $scope.queries.list[id],
+              info: querySrv.list[id],
               data: data,
               data: data,
               hits: hits
               hits: hits
             },
             },

+ 9 - 9
panels/hits/module.js

@@ -22,7 +22,7 @@
 'use strict';
 'use strict';
 
 
 angular.module('kibana.hits', [])
 angular.module('kibana.hits', [])
-.controller('hits', function($scope, query, dashboard, filterSrv) {
+.controller('hits', function($scope, querySrv, dashboard, filterSrv) {
 
 
   // Set and populate defaults
   // Set and populate defaults
   var _d = {
   var _d = {
@@ -62,9 +62,9 @@ angular.module('kibana.hits', [])
     var request = $scope.ejs.Request().indices(dashboard.indices[_segment]);
     var request = $scope.ejs.Request().indices(dashboard.indices[_segment]);
     
     
     // Build the question part of the query
     // Build the question part of the query
-    _.each(query.ids, function(id) {
+    _.each(querySrv.ids, function(id) {
       var _q = $scope.ejs.FilteredQuery(
       var _q = $scope.ejs.FilteredQuery(
-        $scope.ejs.QueryStringQuery(query.list[id].query || '*'),
+        querySrv.getEjsObj(id),
         filterSrv.getBoolFilter(filterSrv.ids));
         filterSrv.getBoolFilter(filterSrv.ids));
     
     
       request = request
       request = request
@@ -99,10 +99,10 @@ angular.module('kibana.hits', [])
 
 
       // Make sure we're still on the same query/queries
       // Make sure we're still on the same query/queries
       if($scope.query_id === query_id && 
       if($scope.query_id === query_id && 
-        _.intersection(facetIds,query.ids).length === query.ids.length
+        _.intersection(facetIds,querySrv.ids).length === querySrv.ids.length
         ) {
         ) {
         var i = 0;
         var i = 0;
-        _.each(query.ids, function(id) {
+        _.each(querySrv.ids, function(id) {
           var v = results.facets[id];
           var v = results.facets[id];
           var hits = _.isUndefined($scope.data[i]) || _segment === 0 ? 
           var hits = _.isUndefined($scope.data[i]) || _segment === 0 ? 
             v.count : $scope.data[i].hits+v.count;
             v.count : $scope.data[i].hits+v.count;
@@ -110,7 +110,7 @@ angular.module('kibana.hits', [])
 
 
           // Create series
           // Create series
           $scope.data[i] = { 
           $scope.data[i] = { 
-            info: query.list[id],
+            info: querySrv.list[id],
             id: id,
             id: id,
             hits: hits,
             hits: hits,
             data: [[i,hits]]
             data: [[i,hits]]
@@ -144,7 +144,7 @@ angular.module('kibana.hits', [])
     $scope.get_data();
     $scope.get_data();
   }
   }
 
 
-}).directive('hitsChart', function(query) {
+}).directive('hitsChart', function(querySrv) {
   return {
   return {
     restrict: 'A',
     restrict: 'A',
     link: function(scope, elem, attrs, ctrl) {
     link: function(scope, elem, attrs, ctrl) {
@@ -195,7 +195,7 @@ angular.module('kibana.hits', [])
                   color: "#eee",
                   color: "#eee",
                   hoverable: true,
                   hoverable: true,
                 },
                 },
-                colors: query.colors
+                colors: querySrv.colors
               });
               });
             }
             }
             if(scope.panel.chart === 'pie') {
             if(scope.panel.chart === 'pie') {
@@ -227,7 +227,7 @@ angular.module('kibana.hits', [])
                 },
                 },
                 //grid: { hoverable: true, clickable: true },
                 //grid: { hoverable: true, clickable: true },
                 grid:   { hoverable: true, clickable: true },
                 grid:   { hoverable: true, clickable: true },
-                colors: query.colors
+                colors: querySrv.colors
               });
               });
             }
             }
 
 

+ 2 - 2
panels/map/module.js

@@ -28,7 +28,7 @@
 'use strict';
 'use strict';
 
 
 angular.module('kibana.map', [])
 angular.module('kibana.map', [])
-.controller('map', function($scope, $rootScope, query, dashboard, filterSrv) {
+.controller('map', function($scope, $rootScope, querySrv, dashboard, filterSrv) {
 
 
   // Set and populate defaults
   // Set and populate defaults
   var _d = {
   var _d = {
@@ -62,7 +62,7 @@ angular.module('kibana.map', [])
     request = $scope.ejs.Request().indices(dashboard.indices);
     request = $scope.ejs.Request().indices(dashboard.indices);
 
 
     var boolQuery = $scope.ejs.BoolQuery();
     var boolQuery = $scope.ejs.BoolQuery();
-    _.each(query.list,function(q) {
+    _.each(querySrv.list,function(q) {
       boolQuery = boolQuery.should($scope.ejs.QueryStringQuery(q.query || '*'));
       boolQuery = boolQuery.should($scope.ejs.QueryStringQuery(q.query || '*'));
     });
     });
 
 

+ 6 - 5
panels/pie/module.js

@@ -29,7 +29,7 @@
 'use strict';
 'use strict';
 
 
 angular.module('kibana.pie', [])
 angular.module('kibana.pie', [])
-.controller('pie', function($scope, $rootScope, query, dashboard, filterSrv) {
+.controller('pie', function($scope, $rootScope, querySrv, dashboard, filterSrv) {
 
 
   // Set and populate defaults
   // Set and populate defaults
   var _d = {
   var _d = {
@@ -89,8 +89,8 @@ angular.module('kibana.pie', [])
 
 
     // This could probably be changed to a BoolFilter 
     // This could probably be changed to a BoolFilter 
     var boolQuery = $scope.ejs.BoolQuery();
     var boolQuery = $scope.ejs.BoolQuery();
-    _.each(query.list,function(q) {
-      boolQuery = boolQuery.should($scope.ejs.QueryStringQuery(q.query || '*'));
+    _.each(querySrv.list,function(q) {
+      boolQuery = boolQuery.should(querySrv.toEjsObj(q));
     });
     });
 
 
     var results;
     var results;
@@ -162,7 +162,7 @@ angular.module('kibana.pie', [])
   };
   };
 
 
 })
 })
-.directive('pie', function(query, filterSrv, dashboard) {
+.directive('pie', function(querySrv, filterSrv, dashboard) {
   return {
   return {
     restrict: 'A',
     restrict: 'A',
     link: function(scope, elem, attrs) {
     link: function(scope, elem, attrs) {
@@ -239,7 +239,7 @@ angular.module('kibana.pie', [])
             clickable: true 
             clickable: true 
           },
           },
           legend: { show: false },
           legend: { show: false },
-          colors: query.colors
+          colors: querySrv.colors
         };
         };
 
 
         // Populate element
         // Populate element
@@ -248,6 +248,7 @@ angular.module('kibana.pie', [])
             scope.plot = $.plot(elem, scope.data, pie);
             scope.plot = $.plot(elem, scope.data, pie);
           });
           });
         }
         }
+
       }
       }
 
 
       function tt(x, y, contents) {
       function tt(x, y, contents) {

+ 9 - 4
panels/query/meta.html

@@ -1,15 +1,20 @@
-<div>
+<div class="panel-query-meta row-fluid" style="width:170px">
+
   <style>
   <style>
     .input-query-alias {
     .input-query-alias {
       margin-bottom: 5px !important;
       margin-bottom: 5px !important;
     }
     }
+    .panel-query-meta .pin {
+      text-decoration: underline;
+    }
   </style>
   </style>
   <a class="close" ng-click="render();dismiss();" href="">×</a>
   <a class="close" ng-click="render();dismiss();" href="">×</a>
-  <h6>Query Alias</h6>
+  <i ng-click="toggle_pin(id);dismiss();" class="small pointer icon-pushpin"></i> 
+  <span class="strong small">Query Alias</span> 
   <form>
   <form>
-    <input class="input-medium input-query-alias" type="text" ng-model="queries.list[id].alias" placeholder='Alias...' />
+    <input class="input-medium input-query-alias" type="text" ng-model="querySrv.list[id].alias" placeholder='Alias...' />
     <div>
     <div>
-      <i ng-repeat="color in queries.colors" class="pointer" ng-class="{'icon-circle-blank':queries.list[id].color == color,'icon-circle':queries.list[id].color != color}" ng-style="{color:color}" ng-click="queries.list[id].color = color;render();"> </i>
+      <i ng-repeat="color in querySrv.colors" class="pointer" ng-class="{'icon-circle-blank':querySrv.list[id].color == color,'icon-circle':querySrv.list[id].color != color}" ng-style="{color:color}" ng-click="querySrv.list[id].color = color;render();"> </i>
     </div>
     </div>
   </form>
   </form>
 </div>
 </div>

+ 21 - 9
panels/query/module.html

@@ -1,12 +1,12 @@
-<kibana-panel ng-controller='query' ng-init="init()">
+<kibana-panel ng-controller='query' ng-init="init()" class="query-panel">
 <style>
 <style>
   .short-query {
   .short-query {
     display:inline-block;
     display:inline-block;
-    margin-left: 10px;
+    margin-right: 10px;
   }
   }
   .begin-query {
   .begin-query {
     position:absolute;
     position:absolute;
-    left:15px;
+    left:13px;
     top:5px;
     top:5px;
   }
   }
   .end-query {
   .end-query {
@@ -33,19 +33,31 @@
   .form-search:hover .remove-query {
   .form-search:hover .remove-query {
     opacity: 1;
     opacity: 1;
   }
   }
+  .query-panel .pins {
+    text-decoration: underline;
+  }
+  .query-panel .pinned {
+    margin-right: 5px;
+  }
 </style>
 </style>
   <label class="small">{{panel.label}}</label>
   <label class="small">{{panel.label}}</label>
-  <div ng-repeat="id in queries.ids" ng-class="{'short-query': queries.ids.length>1}">
-    <form class="form-search" style="position:relative" ng-submit="refresh()">
+  <div ng-repeat="id in querySrv.ids|pinnedQuery:false" ng-class="{'short-query': querySrv.ids.length>1}">
+    <form class="form-search" style="position:relative;margin-bottom:5px;" ng-submit="refresh()">
       <span class="begin-query">
       <span class="begin-query">
-        <i class="icon-circle pointer" data-unique="1" bs-popover="'panels/query/meta.html'" data-placement="right" ng-style="{color: queries.list[id].color}"></i>
-        <i class="icon-remove-sign pointer remove-query" ng-show="queries.ids.length>1" ng-click="queries.remove(id);refresh()"></i>
+        <i class="icon-circle pointer" data-unique="1" bs-popover="'panels/query/meta.html'" data-placement="right" ng-style="{color: querySrv.list[id].color}"></i>
+        <i class="icon-remove-sign pointer remove-query" ng-show="querySrv.ids.length>1" ng-click="querySrv.remove(id);refresh()"></i>
       </span>
       </span>
-      <input class="search-query panel-query" ng-class="{'input-block-level': queries.ids.length==1,'last-query': $last,'has-remove': queries.ids.length>1}" bs-typeahead="panel.history" data-min-length=0 data-items=100 type="text" ng-model="queries.list[id].query"/>
+      <input class="search-query panel-query" ng-class="{'input-block-level': querySrv.ids.length==1,'last-query': $last,'has-remove': querySrv.ids.length>1}" bs-typeahead="panel.history" data-min-length=0 data-items=100 type="text" ng-model="querySrv.list[id].query"/>
       <span class="end-query">
       <span class="end-query">
         <i class="icon-search pointer" ng-click="refresh()" ng-show="$last"></i>
         <i class="icon-search pointer" ng-click="refresh()" ng-show="$last"></i>
-        <i class="icon-plus pointer" ng-click="queries.set({})" ng-show="$last"></i>
+        <i class="icon-plus pointer" ng-click="querySrv.set({})" ng-show="$last"></i>
       </span>
       </span>
     </form>
     </form>
   </div>
   </div>
+  <div style="display:inline-block" ng-repeat="id in querySrv.ids|pinnedQuery:true">
+    <span class="pointer" ng-show="$first" ng-click="panel.pinned = !panel.pinned"><small class="pins">Pinned</small> <i ng-class="{'icon-caret-right':panel.pinned,'icon-caret-left':!panel.pinned}"></i></span>
+    <span ng-show="panel.pinned" class="pinned badge">
+      <i class="icon-circle pointer" ng-style="{color: querySrv.list[id].color}" data-unique="1" bs-popover="'panels/query/meta.html'"></i><span bs-tooltip="querySrv.list[id].query"> {{querySrv.list[id].alias || querySrv.list[id].query}}</span>
+    </span>
+  </div>
 </kibana-panel>
 </kibana-panel>

+ 8 - 3
panels/query/module.js

@@ -16,26 +16,27 @@
 'use strict';
 'use strict';
 
 
 angular.module('kibana.query', [])
 angular.module('kibana.query', [])
-.controller('query', function($scope, query, $rootScope) {
+.controller('query', function($scope, querySrv, $rootScope) {
 
 
   // Set and populate defaults
   // Set and populate defaults
   var _d = {
   var _d = {
     status  : "Experimental",
     status  : "Experimental",
     label   : "Search",
     label   : "Search",
     query   : "*",
     query   : "*",
+    pinned  : true,
     group   : "default",
     group   : "default",
     history : [],
     history : [],
     remember: 10 // max: 100, angular strap can't take a variable for items param
     remember: 10 // max: 100, angular strap can't take a variable for items param
   };
   };
   _.defaults($scope.panel,_d);
   _.defaults($scope.panel,_d);
 
 
-  $scope.queries = query;
+  $scope.querySrv = querySrv;
 
 
   $scope.init = function() {
   $scope.init = function() {
   };
   };
 
 
   $scope.refresh = function(query) {
   $scope.refresh = function(query) {
-    update_history(_.pluck($scope.queries.list,'query'));
+    update_history(_.pluck($scope.querySrv.list,'query'));
     $rootScope.$broadcast('refresh');
     $rootScope.$broadcast('refresh');
   };
   };
 
 
@@ -43,6 +44,10 @@ angular.module('kibana.query', [])
     $rootScope.$broadcast('render');
     $rootScope.$broadcast('render');
   };
   };
 
 
+  $scope.toggle_pin = function(id) {
+    querySrv.list[id].pin = querySrv.list[id].pin ? false : true;
+  };
+
   var update_history = function(query) {
   var update_history = function(query) {
     if($scope.panel.remember > 0) {
     if($scope.panel.remember > 0) {
       $scope.panel.history = _.union(query.reverse(),$scope.panel.history);
       $scope.panel.history = _.union(query.reverse(),$scope.panel.history);

+ 5 - 5
panels/table/module.js

@@ -30,7 +30,7 @@
 'use strict';
 'use strict';
 
 
 angular.module('kibana.table', [])
 angular.module('kibana.table', [])
-.controller('table', function($rootScope, $scope, eventBus, fields, query, dashboard, filterSrv) {
+.controller('table', function($rootScope, $scope, eventBus, fields, querySrv, dashboard, filterSrv) {
 
 
   // Set and populate defaults
   // Set and populate defaults
   var _d = {
   var _d = {
@@ -69,7 +69,7 @@ angular.module('kibana.table', [])
       $scope.panel.fields = _.clone(fields);
       $scope.panel.fields = _.clone(fields);
     });
     });
     eventBus.register($scope,'table_documents', function(event, docs) {
     eventBus.register($scope,'table_documents', function(event, docs) {
-      query.list[query.ids[0]].query = docs.query;
+      querySrv.list[querySrv.ids[0]].query = docs.query;
       $scope.data = docs.docs;
       $scope.data = docs.docs;
     });
     });
   };
   };
@@ -139,8 +139,8 @@ angular.module('kibana.table', [])
     var request = $scope.ejs.Request().indices(dashboard.indices[_segment]);
     var request = $scope.ejs.Request().indices(dashboard.indices[_segment]);
 
 
     var boolQuery = $scope.ejs.BoolQuery();
     var boolQuery = $scope.ejs.BoolQuery();
-    _.each(query.list,function(q) {
-      boolQuery = boolQuery.should($scope.ejs.QueryStringQuery(q.query || '*'));
+    _.each(querySrv.list,function(q) {
+      boolQuery = boolQuery.should(querySrv.toEjsObj(q));
     });
     });
 
 
     request = request.query(
     request = request.query(
@@ -250,7 +250,7 @@ angular.module('kibana.table', [])
     });
     });
     eventBus.broadcast($scope.$id,$scope.panel.group,"table_documents", 
     eventBus.broadcast($scope.$id,$scope.panel.group,"table_documents", 
       {
       {
-        query: query.list[query.ids[0]].query,
+        query: querySrv.list[querySrv.ids[0]].query,
         docs : _.pluck($scope.data,'_source'),
         docs : _.pluck($scope.data,'_source'),
         index: $scope.index
         index: $scope.index
       });
       });

+ 2 - 2
panels/trends/module.html

@@ -2,10 +2,10 @@
 
 
   <div ng-style="panel.style" style="line-height:{{panel.style['font-size']}};display:inline-block;padding-right: 5px;" ng-repeat="query in trends">
   <div ng-style="panel.style" style="line-height:{{panel.style['font-size']}};display:inline-block;padding-right: 5px;" ng-repeat="query in trends">
     <i class="icon-circle" style="color:{{query.info.color}}"></i>
     <i class="icon-circle" style="color:{{query.info.color}}"></i>
-    <span ng-class="{'text-success': query.hits.new >= query.hits.old, 'text-error': query.hits.old > query.hits.new}" class='strong'>
+    <span bs-tooltip="'Then: '+query.hits.old+', Now: '+query.hits.new"  ng-class="{'text-success': query.hits.new >= query.hits.old, 'text-error': query.hits.old > query.hits.new}" class='pointer strong'>
       <i class='large' ng-class="{'icon-caret-up': query.hits.new >= query.hits.old, 'icon-caret-down': query.hits.old > query.hits.new}"></i> {{query.percent}}% 
       <i class='large' ng-class="{'icon-caret-up': query.hits.new >= query.hits.old, 'icon-caret-down': query.hits.old > query.hits.new}"></i> {{query.percent}}% 
     </span>
     </span>
-    <span class="tiny pointer light" bs-tooltip="'Then: '+query.hits.old+', Now: '+query.hits.new" ng-show="query.info.alias != ''">({{query.info.alias}})</span>
+    <span class="tiny light" ng-show="query.info.alias != ''">({{query.info.alias}})</span>
     <br ng-show="panel.arrangement == 'vertical'">
     <br ng-show="panel.arrangement == 'vertical'">
   </div>
   </div>
 </kibana-panel>         
 </kibana-panel>         

+ 11 - 11
panels/trends/module.js

@@ -22,7 +22,7 @@
 'use strict';
 'use strict';
 
 
 angular.module('kibana.trends', [])
 angular.module('kibana.trends', [])
-.controller('trends', function($scope, kbnIndex, query, dashboard, filterSrv) {
+.controller('trends', function($scope, kbnIndex, querySrv, dashboard, filterSrv) {
 
 
   // Set and populate defaults
   // Set and populate defaults
   var _d = {
   var _d = {
@@ -78,9 +78,9 @@ angular.module('kibana.trends', [])
 
 
 
 
     // Build the question part of the query
     // Build the question part of the query
-    _.each(query.ids, function(id) {
+    _.each(querySrv.ids, function(id) {
       var q = $scope.ejs.FilteredQuery(
       var q = $scope.ejs.FilteredQuery(
-        $scope.ejs.QueryStringQuery(query.list[id].query || '*'),
+        querySrv.getEjsObj(id),
         filterSrv.getBoolFilter(_ids_without_time).must(
         filterSrv.getBoolFilter(_ids_without_time).must(
           $scope.ejs.RangeFilter(timeField)
           $scope.ejs.RangeFilter(timeField)
           .from($scope.time.from)
           .from($scope.time.from)
@@ -93,10 +93,11 @@ angular.module('kibana.trends', [])
         ).size(0);
         ).size(0);
     });
     });
 
 
+
     // And again for the old time period
     // And again for the old time period
-    _.each(query.ids, function(id) {
+    _.each(querySrv.ids, function(id) {
       var q = $scope.ejs.FilteredQuery(
       var q = $scope.ejs.FilteredQuery(
-        $scope.ejs.QueryStringQuery(query.list[id].query || '*'),
+        querySrv.getEjsObj(id),
         filterSrv.getBoolFilter(_ids_without_time).must(
         filterSrv.getBoolFilter(_ids_without_time).must(
           $scope.ejs.RangeFilter(timeField)
           $scope.ejs.RangeFilter(timeField)
           .from($scope.old_time.from)
           .from($scope.old_time.from)
@@ -108,6 +109,7 @@ angular.module('kibana.trends', [])
         ).size(0);
         ).size(0);
     });
     });
 
 
+
     // TODO: Spy for trend panel
     // TODO: Spy for trend panel
     //$scope.populate_modal(request);
     //$scope.populate_modal(request);
 
 
@@ -121,8 +123,7 @@ angular.module('kibana.trends', [])
       ).then(function (p) {
       ).then(function (p) {
         $scope.index = _.union(p,$scope.index);
         $scope.index = _.union(p,$scope.index);
         request = request.indices($scope.index[_segment]);
         request = request.indices($scope.index[_segment]);
-        process_results(request.doSearch());
-
+        process_results(request.doSearch(),_segment,query_id);
       });
       });
     } else {
     } else {
       process_results(request.indices($scope.index[_segment]).doSearch(),_segment,query_id);
       process_results(request.indices($scope.index[_segment]).doSearch(),_segment,query_id);
@@ -133,7 +134,6 @@ angular.module('kibana.trends', [])
   // Populate scope when we have results
   // Populate scope when we have results
   var process_results = function(results,_segment,query_id) { 
   var process_results = function(results,_segment,query_id) { 
     results.then(function(results) {
     results.then(function(results) {
-
       $scope.panel.loading = false;
       $scope.panel.loading = false;
       if(_segment === 0) {
       if(_segment === 0) {
         $scope.hits = {};
         $scope.hits = {};
@@ -152,10 +152,10 @@ angular.module('kibana.trends', [])
 
 
       // Make sure we're still on the same query/queries
       // Make sure we're still on the same query/queries
       if($scope.query_id === query_id && 
       if($scope.query_id === query_id && 
-        _.intersection(facetIds,query.ids).length === query.ids.length
+        _.intersection(facetIds,querySrv.ids).length === querySrv.ids.length
         ) {
         ) {
         var i = 0;
         var i = 0;
-        _.each(query.ids, function(id) {
+        _.each(querySrv.ids, function(id) {
           var v = results.facets[id];
           var v = results.facets[id];
           var n = results.facets[id].count;
           var n = results.facets[id].count;
           var o = results.facets['old_'+id].count;
           var o = results.facets['old_'+id].count;
@@ -172,7 +172,7 @@ angular.module('kibana.trends', [])
             '?' : Math.round(percentage(hits.old,hits.new)*100)/100;
             '?' : Math.round(percentage(hits.old,hits.new)*100)/100;
           // Create series
           // Create series
           $scope.data[i] = { 
           $scope.data[i] = { 
-            info: query.list[id],
+            info: querySrv.list[id],
             hits: {
             hits: {
               new : hits.new,
               new : hits.new,
               old : hits.old
               old : hits.old