tripnomics_7.5.5/public/app/plugins/datasource/cloudwatch/utils/query/getStatsGroups.ts
venbatechnologies@gmail.com 91fce5c4bf Initial commit
2021-07-05 13:49:40 +05:30

42 lines
1.5 KiB
TypeScript

const antlr4 = require('antlr4');
const ScrollQLLexer = require('./ScrollQLLexer').ScrollQLLexer;
const ScrollQLParser = require('./ScrollQLParser').ScrollQLParser;
const ScrollQLParserListener = require('./ScrollQLParserListener').ScrollQLParserListener;
class GroupListener extends ScrollQLParserListener {
groupNames: string[] = [];
enterLogStats(ctx: any) {
this.groupNames = [];
if (ctx.groups && ctx.groups.length > 0) {
const groups = ctx.groups;
groups.forEach((group: any) => {
// This code is for handling the case where a field specifier is aliased, with the alias available via
// the proj property. Otherwise we can just take the group text as it is.
const proj = group.fieldSpec?.().proj;
if (proj) {
this.groupNames.push(proj.getText());
} else {
this.groupNames.push(group.getText());
}
});
}
}
}
export function getStatsGroups(text: string): string[] {
// Dummy prefix needed here for parser to function correctly
const dummyPrefix = 'source test start=0 end=1|';
const queryText = dummyPrefix + text;
const chars = new antlr4.InputStream(queryText);
const lexer = new ScrollQLLexer(chars);
const tokens = new antlr4.CommonTokenStream(lexer);
const parser = new ScrollQLParser(tokens);
parser.buildParseTrees = true;
const tree = parser.query();
const groupListener = new GroupListener();
antlr4.tree.ParseTreeWalker.DEFAULT.walk(groupListener, tree);
return groupListener.groupNames;
}