fix rate special function when using group by

This commit is contained in:
Sven Klemm
2018-07-15 15:14:12 +02:00
parent c3c20ef2e2
commit 6e824e81bf
4 changed files with 29 additions and 25 deletions

View File

@@ -2,7 +2,7 @@ import _ from 'lodash';
import $ from 'jquery'; import $ from 'jquery';
import coreModule from 'app/core/core_module'; import coreModule from 'app/core/core_module';
var template = ` let template = `
<div class="dropdown cascade-open"> <div class="dropdown cascade-open">
<a ng-click="showActionsMenu()" class="query-part-name pointer dropdown-toggle" data-toggle="dropdown">{{part.label}}</a> <a ng-click="showActionsMenu()" class="query-part-name pointer dropdown-toggle" data-toggle="dropdown">{{part.label}}</a>
<span>{{part.def.wrapOpen}}</span><span class="query-part-parameters"></span><span>{{part.def.wrapClose}}</span> <span>{{part.def.wrapOpen}}</span><span class="query-part-parameters"></span><span>{{part.def.wrapClose}}</span>
@@ -15,7 +15,7 @@ var template = `
/** @ngInject */ /** @ngInject */
export function sqlPartEditorDirective($compile, templateSrv) { export function sqlPartEditorDirective($compile, templateSrv) {
var paramTemplate = '<input type="text" class="hide input-mini"></input>'; let paramTemplate = '<input type="text" class="hide input-mini"></input>';
return { return {
restrict: 'E', restrict: 'E',
@@ -26,18 +26,18 @@ export function sqlPartEditorDirective($compile, templateSrv) {
debounce: '@', debounce: '@',
}, },
link: function postLink($scope, elem) { link: function postLink($scope, elem) {
var part = $scope.part; let part = $scope.part;
var partDef = part.def; let partDef = part.def;
var $paramsContainer = elem.find('.query-part-parameters'); let $paramsContainer = elem.find('.query-part-parameters');
var debounceLookup = $scope.debounce; let debounceLookup = $scope.debounce;
var cancelBlur = null; let cancelBlur = null;
$scope.partActions = []; $scope.partActions = [];
function clickFuncParam(paramIndex) { function clickFuncParam(paramIndex) {
/*jshint validthis:true */ /*jshint validthis:true */
var $link = $(this); let $link = $(this);
var $input = $link.next(); let $input = $link.next();
$input.val(part.params[paramIndex]); $input.val(part.params[paramIndex]);
$input.css('width', $link.width() + 16 + 'px'); $input.css('width', $link.width() + 16 + 'px');
@@ -47,7 +47,7 @@ export function sqlPartEditorDirective($compile, templateSrv) {
$input.focus(); $input.focus();
$input.select(); $input.select();
var typeahead = $input.data('typeahead'); let typeahead = $input.data('typeahead');
if (typeahead) { if (typeahead) {
$input.val(''); $input.val('');
typeahead.lookup(); typeahead.lookup();
@@ -62,8 +62,8 @@ export function sqlPartEditorDirective($compile, templateSrv) {
function switchToLink($input, paramIndex) { function switchToLink($input, paramIndex) {
/*jshint validthis:true */ /*jshint validthis:true */
var $link = $input.prev(); let $link = $input.prev();
var newValue = $input.val(); let newValue = $input.val();
if (newValue !== '' || part.def.params[paramIndex].optional) { if (newValue !== '' || part.def.params[paramIndex].optional) {
$link.html(templateSrv.highlightVariablesAsHtml(newValue)); $link.html(templateSrv.highlightVariablesAsHtml(newValue));
@@ -95,9 +95,9 @@ export function sqlPartEditorDirective($compile, templateSrv) {
return; return;
} }
var typeaheadSource = function(query, callback) { let typeaheadSource = function(query, callback) {
if (param.options) { if (param.options) {
var options = param.options; let options = param.options;
if (param.type === 'int') { if (param.type === 'int') {
options = _.map(options, function(val) { options = _.map(options, function(val) {
return val.toString(); return val.toString();
@@ -108,7 +108,7 @@ export function sqlPartEditorDirective($compile, templateSrv) {
$scope.$apply(function() { $scope.$apply(function() {
$scope.handleEvent({ $event: { name: 'get-param-options', param: param } }).then(function(result) { $scope.handleEvent({ $event: { name: 'get-param-options', param: param } }).then(function(result) {
var dynamicOptions = _.map(result, function(op) { let dynamicOptions = _.map(result, function(op) {
return op.value; return op.value;
}); });
@@ -138,10 +138,10 @@ export function sqlPartEditorDirective($compile, templateSrv) {
}, },
}); });
var typeahead = $input.data('typeahead'); let typeahead = $input.data('typeahead');
typeahead.lookup = function() { typeahead.lookup = function() {
this.query = this.$element.val() || ''; this.query = this.$element.val() || '';
var items = this.source(this.query, $.proxy(this.process, this)); let items = this.source(this.query, $.proxy(this.process, this));
return items ? this.process(items) : items; return items ? this.process(items) : items;
}; };
@@ -170,9 +170,9 @@ export function sqlPartEditorDirective($compile, templateSrv) {
$('<span>' + partDef.separator + '</span>').appendTo($paramsContainer); $('<span>' + partDef.separator + '</span>').appendTo($paramsContainer);
} }
var paramValue = templateSrv.highlightVariablesAsHtml(part.params[index]); let paramValue = templateSrv.highlightVariablesAsHtml(part.params[index]);
var $paramLink = $('<a class="graphite-func-param-link pointer">' + paramValue + '</a>'); let $paramLink = $('<a class="graphite-func-param-link pointer">' + paramValue + '</a>');
var $input = $(paramTemplate); let $input = $(paramTemplate);
$paramLink.appendTo($paramsContainer); $paramLink.appendTo($paramsContainer);
$input.appendTo($paramsContainer); $input.appendTo($paramsContainer);

View File

@@ -27,17 +27,17 @@ export class PostgresDatasource {
return value; return value;
} }
var quotedValues = _.map(value, function(val) { let quotedValues = _.map(value, function(val) {
return "'" + val + "'"; return "'" + val + "'";
}); });
return quotedValues.join(','); return quotedValues.join(',');
} }
query(options) { query(options) {
var queries = _.filter(options.targets, target => { let queries = _.filter(options.targets, target => {
return target.hide !== true; return target.hide !== true;
}).map(target => { }).map(target => {
var queryModel = new PostgresQuery(target, this.templateSrv, options.scopedVars); let queryModel = new PostgresQuery(target, this.templateSrv, options.scopedVars);
return { return {
refId: target.refId, refId: target.refId,

View File

@@ -154,6 +154,10 @@ export default class PostgresQuery {
break; break;
case 'rate': case 'rate':
let timeColumn = this.target.timeColumn; let timeColumn = this.target.timeColumn;
if (aggregate) {
timeColumn = 'min(' + timeColumn + ')';
}
let curr = query; let curr = query;
let prev = 'lag(' + curr + ') OVER (' + over + ')'; let prev = 'lag(' + curr + ') OVER (' + over + ')';
query = '(CASE WHEN ' + curr + ' >= ' + prev + ' THEN ' + curr + ' - ' + prev + ' ELSE ' + curr + ' END)'; query = '(CASE WHEN ' + curr + ' >= ' + prev + ' THEN ' + curr + ' - ' + prev + ' ELSE ' + curr + ' END)';

View File

@@ -1,9 +1,9 @@
import { SqlPartDef, SqlPart } from 'app/core/components/sql_part/sql_part'; import { SqlPartDef, SqlPart } from 'app/core/components/sql_part/sql_part';
var index = []; let index = [];
function createPart(part): any { function createPart(part): any {
var def = index[part.type]; let def = index[part.type];
if (!def) { if (!def) {
return null; return null;
} }