Просмотр исходного кода

feat(elasticsearch): added new templating all format and muli format named , also added automatic setting of correct all and multi format depending on data source, closes #2696

Torkel Ödegaard 10 лет назад
Родитель
Сommit
f632b3b029

+ 11 - 0
public/app/features/templating/editorCtrl.js

@@ -36,6 +36,17 @@ function (angular, _) {
           $scope.reset();
         }
       });
+
+      $scope.$watch('current.datasource', function(val) {
+        if ($scope.mode === 'new') {
+          datasourceSrv.get(val).then(function(ds) {
+            if (ds.meta.defaultMatchFormat) {
+              $scope.current.allFormat = ds.meta.defaultMatchFormat;
+              $scope.current.multiFormat = ds.meta.defaultMatchFormat;
+            }
+          });
+        }
+      });
     };
 
     $scope.add = function() {

+ 2 - 2
public/app/features/templating/partials/editor.html

@@ -186,7 +186,7 @@
 									All format
 								</li>
 								<li ng-show="current.includeAll">
-									<select class="input-medium tight-form-input last" ng-model="current.allFormat" ng-change="runQuery()" ng-options="f for f in ['glob', 'wildcard', 'regex wildcard', 'regex values']"></select>
+									<select class="input-medium tight-form-input last" ng-model="current.allFormat" ng-change="runQuery()" ng-options="f for f in ['glob', 'wildcard', 'regex wildcard', 'regex values', 'lucene']"></select>
 								</li>
 							</ul>
 							<div class="clearfix"></div>
@@ -217,7 +217,7 @@
 								Multi format
 							</li>
 							<li ng-show="current.multi">
-								<select class="input-medium tight-form-input last" ng-model="current.multiFormat" ng-change="runQuery()" ng-options="f for f in ['glob', 'regex values']"></select>
+								<select class="input-medium tight-form-input last" ng-model="current.multiFormat" ng-change="runQuery()" ng-options="f for f in ['glob', 'regex values', 'lucene']"></select>
 							</li>
 						</ul>
 						<div class="clearfix"></div>

+ 10 - 3
public/app/features/templating/templateSrv.js

@@ -39,10 +39,17 @@ function (angular, _) {
       if (_.isString(value)) {
         return value;
       } else {
-        if (variable.multiFormat === 'regex values') {
-          return '(' + value.join('|') + ')';
+        switch(variable.multiFormat) {
+          case "regex values": {
+            return '(' + value.join('|') + ')';
+          }
+          case "lucene": {
+            return '(' + value.join(' OR ') + ')';
+          }
+          default:  {
+            return '{' + value.join(',') + '}';
+          }
         }
-        return '{' + value.join(',') + '}';
       }
     };
 

+ 23 - 15
public/app/features/templating/templateValuesSrv.js

@@ -253,21 +253,29 @@ function (angular, _, kbn) {
     this.addAllOption = function(variable) {
       var allValue = '';
       switch(variable.allFormat) {
-      case 'wildcard':
-        allValue = '*';
-        break;
-      case 'regex wildcard':
-        allValue = '.*';
-        break;
-      case 'regex values':
-        allValue = '(' + _.map(variable.options, function(option) {
-          return self.regexEscape(option.text);
-        }).join('|') + ')';
-        break;
-      default:
-        allValue = '{';
-        allValue += _.pluck(variable.options, 'text').join(',');
-        allValue += '}';
+        case 'wildcard': {
+          allValue = '*';
+          break;
+        }
+        case 'regex wildcard': {
+          allValue = '.*';
+          break;
+        }
+        case 'lucene': {
+          allValue = '(' + _.pluck(variable.options, 'text').join(' OR ') + ')';
+          break;
+        }
+        case 'regex values': {
+          allValue = '(' + _.map(variable.options, function(option) {
+            return self.regexEscape(option.text);
+          }).join('|') + ')';
+          break;
+        }
+        default: {
+          allValue = '{';
+          allValue += _.pluck(variable.options, 'text').join(',');
+          allValue += '}';
+        }
       }
 
       variable.options.unshift({text: 'All', value: allValue});

+ 3 - 0
public/app/plugins/datasource/elasticsearch/datasource.js

@@ -233,6 +233,9 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes
     ElasticDatasource.prototype.metricFindQuery = function(query) {
       query = templateSrv.replace(query);
       query = angular.fromJson(query);
+      if (!query) {
+        return $q.when([]);
+      }
 
       if (query.find === 'fields') {
         return this.getFields(query);

+ 1 - 0
public/app/plugins/datasource/elasticsearch/plugin.json

@@ -12,6 +12,7 @@
     "annotations": "app/plugins/datasource/elasticsearch/partials/annotations.editor.html"
   },
 
+  "defaultMatchFormat": "lucene",
   "annotations": true,
   "metrics": true
 }

+ 1 - 0
public/app/plugins/datasource/graphite/plugin.json

@@ -11,6 +11,7 @@
     "config": "app/plugins/datasource/graphite/partials/config.html"
   },
 
+  "defaultMatchFormat": "glob",
   "metrics": true,
   "annotations": true
 }

+ 1 - 0
public/app/plugins/datasource/influxdb/plugin.json

@@ -11,6 +11,7 @@
     "config": "app/plugins/datasource/influxdb/partials/config.html"
   },
 
+  "defaultMatchFormat": "regex values",
   "metrics": true,
   "annotations": true
 }

+ 1 - 0
public/app/plugins/datasource/influxdb_08/plugin.json

@@ -11,6 +11,7 @@
     "config": "app/plugins/datasource/influxdb_08/partials/config.html"
   },
 
+  "defaultMatchFormat": "regex values",
   "metrics": true,
   "annotations": true
 }

+ 10 - 0
public/test/specs/templateSrv-specs.js

@@ -61,6 +61,16 @@ define([
         expect(result).to.be('{test,test2}');
       });
 
+      it('multi value and lucene should render as lucene expr', function() {
+        var result = _templateSrv.renderVariableValue({
+          multiFormat: 'lucene',
+          current: {
+            value: ['test','test2'],
+          }
+        });
+        expect(result).to.be('(test OR test2)');
+      });
+
       it('multi value and regex format should render regex string', function() {
         var result = _templateSrv.renderVariableValue({
           multiFormat: 'regex values',

+ 11 - 0
public/test/specs/templateValuesSrv-specs.js

@@ -314,6 +314,17 @@ define([
       });
     });
 
+    describeUpdateVariable('with include all lucene and values', function(scenario) {
+      scenario.setup(function() {
+        scenario.variable = { type: 'query', query: 'apps.*', name: 'test', includeAll: true, allFormat: 'lucene' };
+        scenario.queryResult = [{text: 'backend1'}, { text: 'backend2'}];
+      });
+
+      it('should add lucene glob', function() {
+        expect(scenario.variable.options[0].value).to.be('(backend1 OR backend2)');
+      });
+    });
+
     describeUpdateVariable('with include all regex all values', function(scenario) {
       scenario.setup(function() {
         scenario.variable = { type: 'query', query: 'apps.*', name: 'test', includeAll: true, allFormat: 'regex values' };