kibana-sinatra 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/lib/kibana/assets/app/app.js +0 -1
  4. data/lib/kibana/assets/app/components/extend-jquery.js +1 -0
  5. data/lib/kibana/assets/app/components/kbn.js +31 -10
  6. data/lib/kibana/assets/app/components/require.config.js +5 -2
  7. data/lib/kibana/assets/app/components/underscore.extended.js +4 -0
  8. data/lib/kibana/assets/app/controllers/dash.js +10 -6
  9. data/lib/kibana/assets/app/controllers/dashLoader.js +0 -3
  10. data/lib/kibana/assets/app/dashboards/logstash.js +2 -2
  11. data/lib/kibana/assets/app/directives/all.js +2 -1
  12. data/lib/kibana/assets/app/directives/esVersion.js +24 -0
  13. data/lib/kibana/assets/app/directives/kibanaPanel.js +9 -8
  14. data/lib/kibana/assets/app/directives/kibanaSimplePanel.js +25 -4
  15. data/lib/kibana/assets/app/filters/all.js +13 -1
  16. data/lib/kibana/assets/app/panels/bettermap/module.js +4 -3
  17. data/lib/kibana/assets/app/panels/derivequeries/editor.html +1 -23
  18. data/lib/kibana/assets/app/panels/derivequeries/module.html +1 -31
  19. data/lib/kibana/assets/app/panels/derivequeries/module.js +3 -110
  20. data/lib/kibana/assets/app/panels/filtering/module.html +8 -8
  21. data/lib/kibana/assets/app/panels/filtering/module.js +11 -1
  22. data/lib/kibana/assets/app/panels/histogram/editor.html +37 -66
  23. data/lib/kibana/assets/app/panels/histogram/module.html +14 -8
  24. data/lib/kibana/assets/app/panels/histogram/module.js +191 -65
  25. data/lib/kibana/assets/app/panels/histogram/queriesEditor.html +43 -0
  26. data/lib/kibana/assets/app/panels/histogram/styleEditor.html +84 -0
  27. data/lib/kibana/assets/app/panels/histogram/timeSeries.js +39 -2
  28. data/lib/kibana/assets/app/panels/hits/module.js +10 -13
  29. data/lib/kibana/assets/app/panels/map/module.js +9 -6
  30. data/lib/kibana/assets/app/panels/pie/module.js +4 -3
  31. data/lib/kibana/assets/app/panels/query/editors/lucene.html +0 -0
  32. data/lib/kibana/assets/app/panels/query/editors/regex.html +0 -0
  33. data/lib/kibana/assets/app/panels/query/editors/topN.html +12 -0
  34. data/lib/kibana/assets/app/panels/query/help/lucene.html +30 -0
  35. data/lib/kibana/assets/app/panels/query/help/regex.html +10 -0
  36. data/lib/kibana/assets/app/panels/query/help/topN.html +14 -0
  37. data/lib/kibana/assets/app/panels/query/helpModal.html +12 -0
  38. data/lib/kibana/assets/app/panels/query/meta.html +29 -16
  39. data/lib/kibana/assets/app/panels/query/module.html +11 -6
  40. data/lib/kibana/assets/app/panels/query/module.js +50 -2
  41. data/lib/kibana/assets/app/panels/query/query.css +8 -0
  42. data/lib/kibana/assets/app/panels/sparklines/editor.html +23 -0
  43. data/lib/kibana/assets/app/panels/sparklines/interval.js +57 -0
  44. data/lib/kibana/assets/app/panels/sparklines/module.html +10 -0
  45. data/lib/kibana/assets/app/panels/sparklines/module.js +379 -0
  46. data/lib/kibana/assets/app/panels/sparklines/timeSeries.js +216 -0
  47. data/lib/kibana/assets/app/panels/table/micropanel.html +36 -18
  48. data/lib/kibana/assets/app/panels/table/modal.html +45 -0
  49. data/lib/kibana/assets/app/panels/table/module.html +15 -3
  50. data/lib/kibana/assets/app/panels/table/module.js +67 -16
  51. data/lib/kibana/assets/app/panels/terms/module.js +8 -4
  52. data/lib/kibana/assets/app/panels/timepicker/module.html +5 -2
  53. data/lib/kibana/assets/app/panels/trends/module.html +8 -2
  54. data/lib/kibana/assets/app/panels/trends/module.js +15 -18
  55. data/lib/kibana/assets/app/partials/dashLoader.html +11 -11
  56. data/lib/kibana/assets/app/partials/dashboard.html +1 -1
  57. data/lib/kibana/assets/app/partials/dasheditor.html +1 -1
  58. data/lib/kibana/assets/app/services/all.js +2 -1
  59. data/lib/kibana/assets/app/services/dashboard.js +5 -4
  60. data/lib/kibana/assets/app/services/esVersion.js +150 -0
  61. data/lib/kibana/assets/app/services/fields.js +3 -3
  62. data/lib/kibana/assets/app/services/filterSrv.js +6 -1
  63. data/lib/kibana/assets/app/services/querySrv.js +153 -38
  64. data/lib/kibana/assets/css/bootstrap.dark.min.css +1 -1
  65. data/lib/kibana/assets/css/bootstrap.light.min.css +1 -1
  66. data/lib/kibana/assets/img/small.png +0 -0
  67. data/lib/kibana/assets/index.html +2 -1
  68. data/lib/kibana/assets/vendor/bootstrap/bootstrap.js +14 -6
  69. data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.dark.less +2 -1
  70. data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +33 -12
  71. data/lib/kibana/assets/vendor/chromath.js +34 -0
  72. data/lib/kibana/assets/vendor/jquery/jquery.flot.events.js +641 -0
  73. data/lib/kibana/sinatra/version.rb +1 -1
  74. data/lib/kibana/views/config.erb +2 -1
  75. metadata +22 -2
@@ -36,7 +36,7 @@ function (angular, app, _, $, kbn) {
36
36
  editorTabs : [
37
37
  {title:'Queries', src:'app/partials/querySelect.html'}
38
38
  ],
39
- status : "Beta",
39
+ status : "Stable",
40
40
  description : "Displays the results of an elasticsearch facet as a pie chart, bar chart, or a "+
41
41
  "table"
42
42
  };
@@ -83,17 +83,21 @@ function (angular, app, _, $, kbn) {
83
83
  $scope.panelMeta.loading = true;
84
84
  var request,
85
85
  results,
86
- boolQuery;
86
+ boolQuery,
87
+ queries;
87
88
 
88
89
  request = $scope.ejs.Request().indices(dashboard.indices);
89
90
 
90
91
  $scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries);
92
+ queries = querySrv.getQueryObjs($scope.panel.queries.ids);
93
+
91
94
  // This could probably be changed to a BoolFilter
92
95
  boolQuery = $scope.ejs.BoolQuery();
93
- _.each($scope.panel.queries.ids,function(id) {
94
- boolQuery = boolQuery.should(querySrv.getEjsObj(id));
96
+ _.each(queries,function(q) {
97
+ boolQuery = boolQuery.should(querySrv.toEjsObj(q));
95
98
  });
96
99
 
100
+
97
101
  // Terms mode
98
102
  request = request
99
103
  .facet($scope.ejs.TermsFacet('terms')
@@ -13,9 +13,9 @@
13
13
  $scope.input isn't available on the controller unless the form element is in this file -->
14
14
  <form name="input" style="margin:3px 0 0 0">
15
15
  <ul class="nav nav-pills timepicker-dropdown">
16
- <li class="dropdown" bs-tooltip="(time.from.date | date:'yyyy-MM-dd HH:mm:ss.sss') + ' to ' +(time.to.date | date:'yyyy-MM-dd HH:mm:ss.sss')" data-placement="bottom" ng-click="dismiss();">
16
+ <li class="dropdown">
17
17
 
18
- <a class="dropdown-toggle timepicker-dropdown" data-toggle="dropdown" href="#">
18
+ <a class="dropdown-toggle timepicker-dropdown" data-toggle="dropdown" href="" bs-tooltip="(time.from.date | date:'yyyy-MM-dd HH:mm:ss.sss') + ' <br>to<br>' +(time.to.date | date:'yyyy-MM-dd HH:mm:ss.sss')" data-placement="bottom" ng-click="dismiss();">
19
19
 
20
20
  <span ng-show="filterSrv.idsByType('time').length">
21
21
  <span class="pointer" ng-hide="panel.now">{{time.from.date | date:'MMM d, y HH:mm:ss'}}</span>
@@ -47,6 +47,9 @@
47
47
  </ul>
48
48
 
49
49
  </li>
50
+ <li ng-show="!dashboard.current.refresh">
51
+ <a class="icon-refresh" ng-click="dashboard.refresh()"></a>
52
+ </li>
50
53
  </ul>
51
54
 
52
55
  </form>
@@ -1,11 +1,17 @@
1
1
  <div ng-controller='trends' ng-init="init()">
2
2
 
3
- <div ng-style="panel.style" style="line-height:{{panel.style['font-size']}};display:inline-block;padding-right: 5px;" ng-repeat="query in trends">
3
+ <style>
4
+ div.trends-horizontal {
5
+ display:inline-block;
6
+ padding-right: 5px;
7
+ }
8
+ </style>
9
+
10
+ <div ng-class="{'trends-horizontal':panel.arrangement == 'horizontal'}" ng-style="panel.style" style="line-height:{{panel.style['font-size']}};" ng-repeat="query in trends">
4
11
  <i class="icon-circle" style="color:{{query.info.color}}"></i>
5
12
  <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'>
6
13
  <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}}%
7
14
  </span>
8
15
  <span class="tiny light" ng-show="query.info.alias != ''">({{query.info.alias}})</span>
9
- <br ng-show="panel.arrangement == 'vertical'">
10
16
  </div>
11
17
  </div>
@@ -73,8 +73,6 @@ function (angular, app, _, kbn) {
73
73
  $scope.index = segment > 0 ? $scope.index : dashboard.indices;
74
74
  }
75
75
 
76
- $scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries);
77
-
78
76
  // Determine a time field
79
77
  var timeField = _.uniq(_.pluck(filterSrv.getByType('time'),'field'));
80
78
  if(timeField.length > 1) {
@@ -98,11 +96,13 @@ function (angular, app, _, kbn) {
98
96
  var request = $scope.ejs.Request();
99
97
  var _ids_without_time = _.difference(filterSrv.ids,filterSrv.idsByType('time'));
100
98
 
99
+ $scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries);
100
+ var queries = querySrv.getQueryObjs($scope.panel.queries.ids);
101
101
 
102
102
  // Build the question part of the query
103
- _.each($scope.panel.queries.ids, function(id) {
103
+ _.each(queries, function(query) {
104
104
  var q = $scope.ejs.FilteredQuery(
105
- querySrv.getEjsObj(id),
105
+ querySrv.toEjsObj(query),
106
106
  filterSrv.getBoolFilter(_ids_without_time).must(
107
107
  $scope.ejs.RangeFilter(timeField)
108
108
  .from($scope.time.from)
@@ -110,23 +110,23 @@ function (angular, app, _, kbn) {
110
110
  ));
111
111
 
112
112
  request = request
113
- .facet($scope.ejs.QueryFacet(id)
113
+ .facet($scope.ejs.QueryFacet(query.id)
114
114
  .query(q)
115
115
  ).size(0);
116
116
  });
117
117
 
118
118
 
119
119
  // And again for the old time period
120
- _.each($scope.panel.queries.ids, function(id) {
120
+ _.each(queries, function(query) {
121
121
  var q = $scope.ejs.FilteredQuery(
122
- querySrv.getEjsObj(id),
122
+ querySrv.toEjsObj(query),
123
123
  filterSrv.getBoolFilter(_ids_without_time).must(
124
124
  $scope.ejs.RangeFilter(timeField)
125
125
  .from($scope.old_time.from)
126
126
  .to($scope.old_time.to)
127
127
  ));
128
128
  request = request
129
- .facet($scope.ejs.QueryFacet("old_"+id)
129
+ .facet($scope.ejs.QueryFacet("old_"+query.id)
130
130
  .query(q)
131
131
  ).size(0);
132
132
  });
@@ -169,17 +169,14 @@ function (angular, app, _, kbn) {
169
169
  return;
170
170
  }
171
171
 
172
- // Convert facet ids to numbers
173
- var facetIds = _.map(_.keys(results.facets),function(k){if(!isNaN(k)){return parseInt(k, 10);}});
174
-
175
172
  // Make sure we're still on the same query/queries
176
- if($scope.query_id === query_id &&
177
- _.intersection(facetIds,$scope.panel.queries.ids).length === $scope.panel.queries.ids.length
178
- ) {
173
+ if($scope.query_id === query_id) {
179
174
  var i = 0;
180
- _.each($scope.panel.queries.ids, function(id) {
181
- var n = results.facets[id].count;
182
- var o = results.facets['old_'+id].count;
175
+ var queries = querySrv.getQueryObjs($scope.panel.queries.ids);
176
+
177
+ _.each(queries, function(query) {
178
+ var n = results.facets[query.id].count;
179
+ var o = results.facets['old_'+query.id].count;
183
180
 
184
181
  var hits = {
185
182
  new : _.isUndefined($scope.data[i]) || _segment === 0 ? n : $scope.data[i].hits.new+n,
@@ -193,7 +190,7 @@ function (angular, app, _, kbn) {
193
190
  '?' : Math.round(percentage(hits.old,hits.new)*100)/100;
194
191
  // Create series
195
192
  $scope.data[i] = {
196
- info: querySrv.list[id],
193
+ info: query,
197
194
  hits: {
198
195
  new : hits.new,
199
196
  old : hits.old
@@ -4,11 +4,11 @@
4
4
  }
5
5
  </style>
6
6
 
7
- <li ng-repeat="pulldown in dashboard.current.nav" ng-controller="PulldownCtrl" ng-show="pulldown.enable"><kibana-simple-panel type="pulldown.type" panel="pulldown" ng-cloak></kibana-simple-panel></li>
7
+ <li ng-repeat="pulldown in dashboard.current.nav" ng-controller="PulldownCtrl" ng-show="pulldown.enable"><kibana-simple-panel type="pulldown.type" ng-cloak></kibana-simple-panel></li>
8
8
 
9
9
  <li><a bs-tooltip="'Goto saved default'" data-placement="bottom" href='#/dashboard'><i class='icon-home'></i></a></li>
10
- <li class="dropdown" bs-tooltip="'Load'" data-placement="bottom" ng-show="showDropdown('load')" >
11
- <a href="#" class="dropdown-toggle" data-toggle="dropdown" ng-click="elasticsearch_dblist('title:'+elasticsearch.query+'*')">
10
+ <li class="dropdown" ng-show="showDropdown('load')" >
11
+ <a href="#" bs-tooltip="'Load'" data-placement="bottom" class="dropdown-toggle" data-toggle="dropdown" ng-click="elasticsearch_dblist('title:'+elasticsearch.query+'*')">
12
12
  <i class='icon-folder-open'></i>
13
13
  </a>
14
14
 
@@ -28,8 +28,8 @@
28
28
  </table>
29
29
  </li>
30
30
 
31
- <li class="dropdown-submenu noarrow">
32
- <a tabindex="-1" href="#" class="small" style="padding:0"><i class="icon-caret-left"></i> Advanced</a>
31
+ <li class="dropdown-submenu noarrow" ng-show="dashboard.current.loader.load_gist || dashboard.current.loader.load_local">
32
+ <a tabindex="-1" class="small" style="padding:0"><i class="icon-caret-left"></i> Advanced</a>
33
33
  <ul class="dropdown-menu" style="padding:10px">
34
34
  <li ng-show='dashboard.current.loader.load_local'>
35
35
  <h5>Local File <tip>Load dashboard JSON layout from file</tip></h5>
@@ -58,8 +58,8 @@
58
58
 
59
59
 
60
60
  </li>
61
- <li class="dropdown" bs-tooltip="'Save'" data-placement="bottom" ng-show="showDropdown('save')">
62
- <a href="#" class="dropdown-toggle" data-toggle="dropdown">
61
+ <li class="dropdown"ng-show="showDropdown('save')">
62
+ <a href="#" bs-tooltip="'Save'" data-placement="bottom" class="dropdown-toggle" data-toggle="dropdown">
63
63
  <i class='icon-save'></i>
64
64
  </a>
65
65
 
@@ -67,14 +67,14 @@
67
67
  <ul class="dropdown-menu" style="padding:10px">
68
68
 
69
69
  <li ng-show="dashboard.current.loader.save_elasticsearch">
70
- <form class="input-append nomargin">
70
+ <form class="input-prepend nomargin">
71
+ <button style="margin-top:-1px" class="btn" ng-click="elasticsearch_save('dashboard')"><i class="icon-save"></i></button>
71
72
  <input class='input-medium' ng-model="dashboard.current.title" type="text" ng-model="elasticsearch.title"/>
72
- <button class="btn" ng-click="elasticsearch_save('dashboard')"><i class="icon-save"></i></button>
73
73
  </form>
74
74
  </li>
75
75
 
76
- <li class="dropdown-submenu noarrow">
77
- <a tabindex="-1" href="#" class="small" style="padding:0"><i class="icon-caret-left"></i> Advanced</a>
76
+ <li class="dropdown-submenu noarrow" ng-show="dashboard.current.loader.save_local || dashboard.current.loader.save_gist || dashboard.current.loader.save_default">
77
+ <a tabindex="-1" class="small" style="padding:0"><i class="icon-caret-left"></i> Advanced</a>
78
78
  <ul class="dropdown-menu">
79
79
 
80
80
  <li ng-show="dashboard.current.loader.save_default">
@@ -54,7 +54,7 @@
54
54
  <div ng-repeat="(name, panel) in row.panels|filter:isPanel" ng-hide="panel.span == 0 || panel.hide" class="span{{panel.span}} panel nospace" style="min-height:{{row.height}}; position:relative" data-drop="true" ng-model="row.panels" data-jqyoui-options jqyoui-droppable="{index:$index,mutate:false,onDrop:'panelMoveDrop',onOver:'panelMoveOver(true)',onOut:'panelMoveOut'}">
55
55
  <!-- Error Panel -->
56
56
  <div class="row-fluid">
57
- <div class="span12 alert alert-error panel-error" ng-hide="!panel.error">
57
+ <div class="span12 alert-error panel-error" ng-hide="!panel.error">
58
58
  <a class="close" ng-click="panel.error=false">&times;</a>
59
59
  <i class="icon-exclamation-sign"></i> <strong>Oops!</strong> {{panel.error}}
60
60
  </div>
@@ -117,7 +117,7 @@
117
117
  <h5>Save to</h5>
118
118
  <div class="row-fluid">
119
119
  <div class="span2">
120
- <label class="small">File</label><input type="checkbox" ng-model="dashboard.current.loader.save_local" ng-checked="dashboard.current.loader.save_local">
120
+ <label class="small">Export</label><input type="checkbox" ng-model="dashboard.current.loader.save_local" ng-checked="dashboard.current.loader.save_local">
121
121
  </div>
122
122
  <div class="span2">
123
123
  <label class="small">Browser</label><input type="checkbox" ng-model="dashboard.current.loader.save_default" ng-checked="dashboard.current.loader.save_default">
@@ -6,6 +6,7 @@ define([
6
6
  './kbnIndex',
7
7
  './querySrv',
8
8
  './timer',
9
- './panelMove'
9
+ './panelMove',
10
+ './esVersion'
10
11
  ],
11
12
  function () {});
@@ -143,12 +143,13 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
143
143
  return false;
144
144
  }
145
145
  }
146
- $rootScope.$broadcast('refresh');
146
+ // Don't resolve queries until indices are updated
147
+ querySrv.resolve().then(function(){$rootScope.$broadcast('refresh');});
147
148
  });
148
149
  } else {
149
150
  if(self.current.failover) {
150
151
  self.indices = [self.current.index.default];
151
- $rootScope.$broadcast('refresh');
152
+ querySrv.resolve().then(function(){$rootScope.$broadcast('refresh');});
152
153
  } else {
153
154
  alertSrv.set("No time filter",
154
155
  'Timestamped indices are configured without a failover. Waiting for time filter.',
@@ -157,7 +158,7 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
157
158
  }
158
159
  } else {
159
160
  self.indices = [self.current.index.default];
160
- $rootScope.$broadcast('refresh');
161
+ querySrv.resolve().then(function(){$rootScope.$broadcast('refresh');});
161
162
  }
162
163
  };
163
164
 
@@ -292,7 +293,7 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
292
293
 
293
294
  this.elasticsearch_load = function(type,id) {
294
295
  return $http({
295
- url: config.elasticsearch + "/" + config.kibana_index + "/"+type+"/"+id,
296
+ url: config.elasticsearch + "/" + config.kibana_index + "/"+type+"/"+id+'?' + new Date().getTime(),
296
297
  method: "GET",
297
298
  transformResponse: function(response) {
298
299
  return renderTemplate(angular.fromJson(response)._source.dashboard, $routeParams);
@@ -0,0 +1,150 @@
1
+ define([
2
+ 'angular',
3
+ 'underscore',
4
+ 'config'
5
+ ],
6
+ function (angular, _, config) {
7
+ 'use strict';
8
+
9
+ var module = angular.module('kibana.services');
10
+
11
+ module.service('esVersion', function($http, alertSrv) {
12
+
13
+ this.versions = [];
14
+
15
+ // save a reference to this
16
+ var self = this;
17
+
18
+ this.init = function() {
19
+ getVersions();
20
+ };
21
+
22
+ var getVersions = function() {
23
+ var nodeInfo = $http({
24
+ url: config.elasticsearch + '/_nodes',
25
+ method: "GET"
26
+ }).error(function(data, status) {
27
+ if(status === 0) {
28
+ alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+
29
+ ". Please ensure that Elasticsearch is reachable from your system." ,'error');
30
+ } else {
31
+ alertSrv.set('Error',"Could not reach "+config.elasticsearch+"/_nodes. If you"+
32
+ " are using a proxy, ensure it is configured correctly",'error');
33
+ }
34
+ });
35
+
36
+ return nodeInfo.then(function(p) {
37
+ _.each(p.data.nodes, function(v) {
38
+ self.versions.push(v.version.split('-')[0]);
39
+ });
40
+ self.versions = sortVersions(_.uniq(self.versions));
41
+ });
42
+ };
43
+
44
+ // Get the max version in this cluster
45
+ this.max = function() {
46
+ return _.last(self.versions);
47
+ };
48
+
49
+ // Return the lowest version in the cluster
50
+ this.min = function() {
51
+ return _.first(self.versions);
52
+ };
53
+
54
+ // Sort versions from lowest to highest
55
+ var sortVersions = function(versions) {
56
+ var _versions = _.clone(versions),
57
+ _r = [];
58
+
59
+ while(_r.length < versions.length) {
60
+ var _h = "0";
61
+ /*jshint -W083 */
62
+ _.each(_versions,function(v){
63
+ if(self.compare(_h,v)) {
64
+ _h = v;
65
+ }
66
+ });
67
+ _versions = _.without(_versions,_h);
68
+ _r.push(_h);
69
+ }
70
+ return _r.reverse();
71
+ };
72
+
73
+ /*
74
+ Takes a version string with one of the following optional comparison prefixes: >,>=,<.<=
75
+ and evaluates if the cluster meets the requirement. If the prefix is omitted exact match
76
+ is assumed
77
+ */
78
+ this.is = function(equation) {
79
+ var _v = equation,
80
+ _cf;
81
+
82
+ if(_v.charAt(0) === '>') {
83
+ _cf = _v.charAt(1) === '=' ? self.gte(_v.slice(2)) : self.gt(_v.slice(1));
84
+ } else if (_v.charAt(0) === '<') {
85
+ _cf = _v.charAt(1) === '=' ? self.lte(_v.slice(2)) : self.lt(_v.slice(1));
86
+ } else {
87
+ _cf = self.eq(_v);
88
+ }
89
+
90
+ return _cf;
91
+ };
92
+
93
+ // check if lowest version in cluster = `version`
94
+ this.eq = function(version) {
95
+ return version === self.min() ? true : false;
96
+ };
97
+
98
+ // version > lowest version in cluster?
99
+ this.gt = function(version) {
100
+ return version === self.min() ? false : self.gte(version);
101
+ };
102
+
103
+ // version < highest version in cluster?
104
+ this.lt = function(version) {
105
+ return version === self.max() ? false : self.lte(version);
106
+ };
107
+
108
+ // Check if the lowest version in the cluster is >= to `version`
109
+ this.gte = function(version) {
110
+ return self.compare(version,self.min());
111
+ };
112
+
113
+ // Check if the highest version in the cluster is <= to `version`
114
+ this.lte = function(version) {
115
+ return self.compare(self.max(),version);
116
+ };
117
+
118
+ // Determine if a specific version is greater than or equal to another
119
+ this.compare = function (required,installed) {
120
+ var a = installed.split('.');
121
+ var b = required.split('.');
122
+ var i;
123
+
124
+ for (i = 0; i < a.length; ++i) {
125
+ a[i] = Number(a[i]);
126
+ }
127
+ for (i = 0; i < b.length; ++i) {
128
+ b[i] = Number(b[i]);
129
+ }
130
+ if (a.length === 2) {
131
+ a[2] = 0;
132
+ }
133
+
134
+ if (a[0] > b[0]){return true;}
135
+ if (a[0] < b[0]){return false;}
136
+
137
+ if (a[1] > b[1]){return true;}
138
+ if (a[1] < b[1]){return false;}
139
+
140
+ if (a[2] > b[2]){return true;}
141
+ if (a[2] < b[2]){return false;}
142
+
143
+ return true;
144
+ };
145
+
146
+ this.init();
147
+
148
+ });
149
+
150
+ });
@@ -19,7 +19,7 @@ function (angular, _, config) {
19
19
  if(!_.isUndefined(n) && n.length) {
20
20
  // Only get the mapping for indices we don't know it for
21
21
  var indices = _.difference(n,_.keys(self.mapping));
22
- // Only get the mapping if there are indices
22
+ // Only get the mapping if there are new indices
23
23
  if(indices.length > 0) {
24
24
  self.map(indices).then(function(result) {
25
25
  self.mapping = _.extend(self.mapping,result);
@@ -36,7 +36,7 @@ function (angular, _, config) {
36
36
  var fields = [];
37
37
  _.each(m, function(types) {
38
38
  _.each(types, function(v) {
39
- fields = _.union(fields,_.keys(v));
39
+ fields = _.without(_.union(fields,_.keys(v)),'_all','_source');
40
40
  });
41
41
  });
42
42
  return fields;
@@ -75,7 +75,7 @@ function (angular, _, config) {
75
75
  ret = {};
76
76
  for(var attr in obj){
77
77
  // For now only support multi field on the top level
78
- // and if if there is a default field set.
78
+ // and if there is a default field set.
79
79
  if(obj[attr]['type'] === 'multi_field') {
80
80
  ret[attr] = obj[attr]['fields'][attr] || obj[attr];
81
81
  continue;