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

Parse additional group by columns from a raw query

This needs some further polishing but now parse out additional group by
columns from a raw query, although it really only supports one
additional column.
Clicky 11 лет назад
Родитель
Сommit
f231af07f9
1 измененных файлов с 45 добавлено и 29 удалено
  1. 45 29
      src/app/services/influxdb/influxdbDatasource.js

+ 45 - 29
src/app/services/influxdb/influxdbDatasource.js

@@ -17,7 +17,6 @@ function (angular, _, kbn) {
       this.username = datasource.username;
       this.username = datasource.username;
       this.password = datasource.password;
       this.password = datasource.password;
       this.name = datasource.name;
       this.name = datasource.name;
-
       this.templateSettings = {
       this.templateSettings = {
         interpolate : /\[\[([\s\S]+?)\]\]/g,
         interpolate : /\[\[([\s\S]+?)\]\]/g,
       };
       };
@@ -33,7 +32,8 @@ function (angular, _, kbn) {
         }
         }
 
 
         var timeFilter = getTimeFilter(options);
         var timeFilter = getTimeFilter(options);
-
+        var additionalGroups = [];
+        
         if (target.rawQuery) {
         if (target.rawQuery) {
           query = target.query;
           query = target.query;
           query = query.replace(";", "");
           query = query.replace(";", "");
@@ -42,6 +42,17 @@ function (angular, _, kbn) {
           var whereIndex = lowerCaseQueryElements.indexOf("where");
           var whereIndex = lowerCaseQueryElements.indexOf("where");
           var groupByIndex = lowerCaseQueryElements.indexOf("group");
           var groupByIndex = lowerCaseQueryElements.indexOf("group");
           var orderIndex = lowerCaseQueryElements.indexOf("order");
           var orderIndex = lowerCaseQueryElements.indexOf("order");
+          
+          var afterGroup = _.rest(lowerCaseQueryElements, groupByIndex);
+          for (var i = 0; i < afterGroup.length; i++) {
+            var el = afterGroup[i];
+            if (el === "order") break;
+            if ( /,$/.test(el) && 
+                _.size(afterGroup) > i && 
+                ! /^time\(/.test(afterGroup[i + 1])) {
+              additionalGroups.push(queryElements[groupByIndex + i + 1]);
+            }
+          }
 
 
           if (whereIndex !== -1) {
           if (whereIndex !== -1) {
             queryElements.splice(whereIndex+1, 0, timeFilter, "and");
             queryElements.splice(whereIndex+1, 0, timeFilter, "and");
@@ -88,7 +99,7 @@ function (angular, _, kbn) {
           target.query = query;
           target.query = query;
         }
         }
 
 
-        return this.doInfluxRequest(query, target.alias).then(handleInfluxQueryResponse);
+        return this.doInfluxRequest(query, target.alias).then(handleInfluxQueryResponse(additionalGroups));
 
 
       }, this);
       }, this);
 
 
@@ -157,38 +168,43 @@ function (angular, _, kbn) {
       return deferred.promise;
       return deferred.promise;
     };
     };
 
 
-    function handleInfluxQueryResponse(data) {
-      var output = [];
-
-      _.each(data, function(series) {
-        var timeCol = series.columns.indexOf('time');
-        var groupByColumn = series.columns.indexOf('host');
-
-        _.each(series.columns, function(column, index) {
-          if (column === "time" || column === "sequence_number" || column === "host") {
-            return;
-          }
+    function handleInfluxQueryResponse(additionalGroup) { 
+      return function(data) {
+        var output = [];
 
 
-          var target = data.alias || series.name + "." + column;
-          var datapoints = _.groupBy(series.points, function (point) { 
-            if (groupByColumn == -1 ) return null; 
-            else return point[groupByColumn];
-          });
-          datapoints = _.map(_.pairs(datapoints), function(values) {
-            return [values[0], _.map(values[1], function (point) { return [point[index], point[timeCol]]; }) ];
+        _.each(data, function(series) {
+          var timeCol = series.columns.indexOf('time');
+          var groupCols = _.map(additionalGroup, function(col) { 
+            return series.columns.indexOf(col);
           });
           });
-          
-          _.each(datapoints, function(values) {
-            if (values[0] == null) {
-              output.push({ target: target, datapoints: values[1]});
-            } else {
-              output.push({ target: values[0] + "-" + target, datapoints: values[1] });
+          var groupByColumn = _.find(groupCols, function(col) { return col > -1; });
+
+          _.each(series.columns, function(column, index) {
+            if (column === "time" || column === "sequence_number" || _.contains(additionalGroup, column)) {
+              return;
             }
             }
+
+            var target = data.alias || series.name + "." + column;
+            var datapoints = _.groupBy(series.points, function (point) { 
+              if (groupByColumn == undefined) return null; 
+              else return point[groupByColumn];
+            });
+            datapoints = _.map(_.pairs(datapoints), function(values) {
+              return [values[0], _.map(values[1], function (point) { return [point[index], point[timeCol]]; }) ];
+            });
+            
+            _.each(datapoints, function(values) {
+              if (values[0] == null) {
+                output.push({ target: target, datapoints: values[1]});
+              } else {
+                output.push({ target: values[0] + "-" + target, datapoints: values[1] });
+              }
+            });
           });
           });
         });
         });
-      });
 
 
-      return output;
+        return output;
+      }
     }
     }
 
 
     function getTimeFilter(options) {
     function getTimeFilter(options) {