| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- ///<reference path="../../../headers/common.d.ts" />
- ///<amd-dependency path="./query_builder" name="InfluxQueryBuilder" />
- import _ = require('lodash');
- import queryPart = require('./query_part');
- declare var InfluxQueryBuilder: any;
- class InfluxQuery {
- target: any;
- selectModels: any[];
- groupByParts: any;
- queryBuilder: any;
- constructor(target) {
- this.target = target;
- target.tags = target.tags || [];
- target.groupBy = target.groupBy || [{type: 'time', interval: 'auto'}];
- target.select = target.select || [[
- {type: 'field', params: ['value']},
- {type: 'mean', params: []},
- ]];
- this.updateSelectParts();
- this.groupByParts = [
- queryPart.create({type: 'time', params: ['$interval']})
- ];
- }
- updateSelectParts() {
- this.selectModels = _.map(this.target.select, function(parts: any) {
- return _.map(parts, queryPart.create);
- });
- }
- updatePersistedParts() {
- this.target.select = _.map(this.selectModels, function(selectParts) {
- return _.map(selectParts, function(part: any) {
- return {type: part.def.type, params: part.params};
- });
- });
- }
- removeSelect(index: number) {
- this.target.select.splice(index, 1);
- this.updateSelectParts();
- }
- removeSelectPart(selectParts, part) {
- // if we remove the field remove the whole statement
- if (part.def.type === 'field') {
- if (this.selectModels.length > 1) {
- var modelsIndex = _.indexOf(this.selectModels, selectParts);
- this.selectModels.splice(modelsIndex, 1);
- }
- } else {
- var partIndex = _.indexOf(selectParts, part);
- selectParts.splice(partIndex, 1);
- }
- this.updatePersistedParts();
- }
- addSelectPart(selectParts, type) {
- var partModel = queryPart.create({type: type});
- partModel.def.addStrategy(selectParts, partModel, this);
- this.updatePersistedParts();
- }
- private renderTagCondition(tag, index) {
- var str = "";
- var operator = tag.operator;
- var value = tag.value;
- if (index > 0) {
- str = (tag.condition || 'AND') + ' ';
- }
- if (!operator) {
- if (/^\/.*\/$/.test(tag.value)) {
- operator = '=~';
- } else {
- operator = '=';
- }
- }
- // quote value unless regex
- if (operator !== '=~' && operator !== '!~') {
- value = "'" + value + "'";
- }
- return str + '"' + tag.key + '" ' + operator + ' ' + value;
- }
- private getGroupByTimeInterval(interval) {
- if (interval === 'auto') {
- return '$interval';
- }
- return interval;
- }
- render() {
- var target = this.target;
- if (target.rawQuery) {
- return target.query;
- }
- if (!target.measurement) {
- throw "Metric measurement is missing";
- }
- var query = 'SELECT ';
- var i, y;
- for (i = 0; i < this.selectModels.length; i++) {
- let parts = this.selectModels[i];
- var selectText = "";
- for (y = 0; y < parts.length; y++) {
- let part = parts[y];
- selectText = part.render(selectText);
- }
- if (i > 0) {
- query += ', ';
- }
- query += selectText;
- }
- var measurement = target.measurement;
- if (!measurement.match('^/.*/') && !measurement.match(/^merge\(.*\)/)) {
- measurement = '"' + measurement+ '"';
- }
- query += ' FROM ' + measurement + ' WHERE ';
- var conditions = _.map(target.tags, (tag, index) => {
- return this.renderTagCondition(tag, index);
- });
- query += conditions.join(' ');
- query += (conditions.length > 0 ? ' AND ' : '') + '$timeFilter';
- query += ' GROUP BY';
- for (i = 0; i < target.groupBy.length; i++) {
- var group = target.groupBy[i];
- if (group.type === 'time') {
- query += ' time(' + this.getGroupByTimeInterval(group.interval) + ')';
- } else {
- query += ', "' + group.key + '"';
- }
- }
- if (target.fill) {
- query += ' fill(' + target.fill + ')';
- }
- target.query = query;
- return query;
- }
- }
- export = InfluxQuery;
|