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

This commit is contained in:
Torkel Ödegaard 2015-09-22 14:29:41 +02:00
parent b37f9a7db0
commit f632b3b029
11 changed files with 74 additions and 20 deletions

View File

@ -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() {

View File

@ -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>

View File

@ -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(',') + '}';
}
};

View File

@ -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});

View File

@ -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);

View File

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

View File

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

View File

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

View File

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

View File

@ -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',

View File

@ -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' };