mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Fixes #38, Lexer & parser now handles metrics segments that begin with numbers or only have numbers
This commit is contained in:
parent
1c17c8661a
commit
89224401a9
@ -116,6 +116,7 @@ define([
|
||||
|
||||
for (var i = 0; i < 128; i++) {
|
||||
identifierStartTable[i] =
|
||||
i >= 48 && i <= 57 || // 0-9
|
||||
i === 36 || // $
|
||||
i >= 65 && i <= 90 || // A-Z
|
||||
i === 95 || // _
|
||||
@ -183,10 +184,10 @@ define([
|
||||
}
|
||||
|
||||
match =
|
||||
this.scanIdentifier() ||
|
||||
this.scanTemplateSequence() ||
|
||||
this.scanPunctuator() ||
|
||||
this.scanNumericLiteral();
|
||||
this.scanNumericLiteral() ||
|
||||
this.scanIdentifier() ||
|
||||
this.scanTemplateSequence();
|
||||
|
||||
if (match) {
|
||||
this.skip(match.value.length);
|
||||
@ -402,7 +403,6 @@ define([
|
||||
}
|
||||
|
||||
// Numbers must start either with a decimal digit or a point.
|
||||
|
||||
if (char !== "." && !isDecimalDigit(char)) {
|
||||
return null;
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ define([
|
||||
return curly;
|
||||
}
|
||||
|
||||
if (this.match('identifier')) {
|
||||
if (this.match('identifier') || this.match('number')) {
|
||||
return {
|
||||
type: 'segment',
|
||||
value: this.consumeToken().value
|
||||
@ -97,7 +97,7 @@ define([
|
||||
},
|
||||
|
||||
metricExpression: function() {
|
||||
if (!this.match('templateStart') && !this.match('identifier')) {
|
||||
if (!this.match('templateStart') && !this.match('identifier') && !this.match('number')) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -153,8 +153,8 @@ define([
|
||||
|
||||
var param =
|
||||
this.functionCall() ||
|
||||
this.metricExpression() ||
|
||||
this.numericLiteral() ||
|
||||
this.metricExpression() ||
|
||||
this.stringLiteral();
|
||||
|
||||
if (!this.match(',')) {
|
||||
|
@ -31,21 +31,25 @@ define([
|
||||
expect(tokens[6].value).to.be('second');
|
||||
});
|
||||
|
||||
|
||||
it('should tokenize functions and args', function() {
|
||||
var lexer = new Lexer("sum(metric.test, 12, 'test')");
|
||||
it('should tokenize metric expression with number segments', function() {
|
||||
var lexer = new Lexer("metric.10.12_10.test");
|
||||
var tokens = lexer.tokenize();
|
||||
expect(tokens[0].value).to.be('sum');
|
||||
expect(tokens[0].type).to.be('identifier');
|
||||
expect(tokens[1].value).to.be('(');
|
||||
expect(tokens[1].type).to.be('(');
|
||||
expect(tokens[5].type).to.be(',');
|
||||
expect(tokens[5].value).to.be(',');
|
||||
expect(tokens[2].type).to.be('identifier');
|
||||
expect(tokens[2].value).to.be('10');
|
||||
expect(tokens[4].value).to.be('12_10');
|
||||
expect(tokens[4].type).to.be('identifier');
|
||||
});
|
||||
|
||||
it('should tokenize func call with numbered metric and number arg', function() {
|
||||
var lexer = new Lexer("scale(metric.10, 15)");
|
||||
var tokens = lexer.tokenize();
|
||||
expect(tokens[0].type).to.be('identifier');
|
||||
expect(tokens[2].type).to.be('identifier');
|
||||
expect(tokens[2].value).to.be('metric');
|
||||
expect(tokens[4].value).to.be('10');
|
||||
expect(tokens[4].type).to.be('number');
|
||||
expect(tokens[6].type).to.be('number');
|
||||
expect(tokens[6].value).to.be('12');
|
||||
expect(tokens[8].type).to.be('string');
|
||||
expect(tokens[8].value).to.be('test');
|
||||
expect(tokens[tokens.length - 1].value).to.be(')');
|
||||
});
|
||||
|
||||
it('should tokenize metric with template parameter', function() {
|
||||
|
@ -13,6 +13,17 @@ define([
|
||||
expect(rootNode.segments[0].value).to.be('metric');
|
||||
});
|
||||
|
||||
it('simple metric expression with numbers in segments', function() {
|
||||
var parser = new Parser('metric.10.15_20.5');
|
||||
var rootNode = parser.getAst();
|
||||
|
||||
expect(rootNode.type).to.be('metric');
|
||||
expect(rootNode.segments.length).to.be(4);
|
||||
expect(rootNode.segments[1].value).to.be('10');
|
||||
expect(rootNode.segments[2].value).to.be('15_20');
|
||||
expect(rootNode.segments[3].value).to.be('5');
|
||||
});
|
||||
|
||||
it('simple metric expression with curly braces', function() {
|
||||
var parser = new Parser('metric.se1-{count, max}');
|
||||
var rootNode = parser.getAst();
|
||||
|
Loading…
Reference in New Issue
Block a user