|
|
|
|
@ -1,11 +1,12 @@ |
|
|
|
|
import _ from 'lodash'; |
|
|
|
|
import queryPart from './query_part'; |
|
|
|
|
import sqlPart from './sql_part'; |
|
|
|
|
|
|
|
|
|
export default class PostgresQuery { |
|
|
|
|
target: any; |
|
|
|
|
selectModels: any[]; |
|
|
|
|
queryBuilder: any; |
|
|
|
|
groupByParts: any; |
|
|
|
|
groupByParts: any[]; |
|
|
|
|
whereParts: any[]; |
|
|
|
|
templateSrv: any; |
|
|
|
|
scopedVars: any; |
|
|
|
|
|
|
|
|
|
@ -31,18 +32,19 @@ export default class PostgresQuery { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
quoteIdentifier(value) { |
|
|
|
|
return '"' + value.replace('"','""') + '"'; |
|
|
|
|
return '"' + value.replace('"', '""') + '"'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
quoteLiteral(value) { |
|
|
|
|
return "'" + value.replace("'","''") + "'"; |
|
|
|
|
return "'" + value.replace("'", "''") + "'"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
updateProjection() { |
|
|
|
|
this.selectModels = _.map(this.target.select, function(parts: any) { |
|
|
|
|
return _.map(parts, queryPart.create); |
|
|
|
|
return _.map(parts, sqlPart.create); |
|
|
|
|
}); |
|
|
|
|
this.groupByParts = _.map(this.target.groupBy, queryPart.create); |
|
|
|
|
this.whereParts = _.map(this.target.where, sqlPart.create); |
|
|
|
|
this.groupByParts = _.map(this.target.groupBy, sqlPart.create); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
updatePersistedParts() { |
|
|
|
|
@ -51,6 +53,9 @@ export default class PostgresQuery { |
|
|
|
|
return { type: part.def.type, params: part.params }; |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
this.target.where = _.map(this.whereParts, function(part: any) { |
|
|
|
|
return { type: part.def.type, params: part.params }; |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
hasGroupByTime() { |
|
|
|
|
@ -60,8 +65,8 @@ export default class PostgresQuery { |
|
|
|
|
addGroupBy(value) { |
|
|
|
|
var stringParts = value.match(/^(\w+)(\((.*)\))?$/); |
|
|
|
|
var typePart = stringParts[1]; |
|
|
|
|
var args = stringParts[3].split(","); |
|
|
|
|
var partModel = queryPart.create({ type: typePart, params: args }); |
|
|
|
|
var args = stringParts[3].split(','); |
|
|
|
|
var partModel = sqlPart.create({ type: typePart, params: args }); |
|
|
|
|
var partCount = this.target.groupBy.length; |
|
|
|
|
|
|
|
|
|
if (partCount === 0) { |
|
|
|
|
@ -86,7 +91,7 @@ export default class PostgresQuery { |
|
|
|
|
// remove aggregations
|
|
|
|
|
this.target.select = _.map(this.target.select, (s: any) => { |
|
|
|
|
return _.filter(s, (part: any) => { |
|
|
|
|
if (part.type === "aggregate") { |
|
|
|
|
if (part.type === 'aggregate') { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
@ -118,27 +123,17 @@ export default class PostgresQuery { |
|
|
|
|
this.updatePersistedParts(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
removeWherePart(whereParts, part) { |
|
|
|
|
var partIndex = _.indexOf(whereParts, part); |
|
|
|
|
whereParts.splice(partIndex, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
addSelectPart(selectParts, type) { |
|
|
|
|
var partModel = queryPart.create({ type: type }); |
|
|
|
|
var partModel = sqlPart.create({ type: type }); |
|
|
|
|
partModel.def.addStrategy(selectParts, partModel, this); |
|
|
|
|
this.updatePersistedParts(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private renderWhereConstraint(constraint, index, interpolate) { |
|
|
|
|
var str = ''; |
|
|
|
|
var operator = constraint.operator; |
|
|
|
|
var value = constraint.value; |
|
|
|
|
if (index > 0) { |
|
|
|
|
str = (constraint.condition || 'AND') + ' '; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (interpolate) { |
|
|
|
|
value = this.templateSrv.replace(value, this.scopedVars); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return str + constraint.key + ' ' + operator + ' ' + value; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
interpolateQueryStr(value, variable, defaultFormatFn) { |
|
|
|
|
// if no multi or include all do not regexEscape
|
|
|
|
|
if (!variable.multi && !variable.includeAll) { |
|
|
|
|
@ -170,8 +165,8 @@ export default class PostgresQuery { |
|
|
|
|
|
|
|
|
|
if (timeGroup) { |
|
|
|
|
var args; |
|
|
|
|
if (timeGroup.params.length > 1 && timeGroup.params[1] !== "none") { |
|
|
|
|
args = timeGroup.params.join(","); |
|
|
|
|
if (timeGroup.params.length > 1 && timeGroup.params[1] !== 'none') { |
|
|
|
|
args = timeGroup.params.join(','); |
|
|
|
|
} else { |
|
|
|
|
args = timeGroup.params[0]; |
|
|
|
|
} |
|
|
|
|
@ -181,7 +176,7 @@ export default class PostgresQuery { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (this.target.metricColumn !== 'None') { |
|
|
|
|
query += "," + this.quoteIdentifier(this.target.metricColumn) + " AS metric"; |
|
|
|
|
query += ',' + this.quoteIdentifier(this.target.metricColumn) + ' AS metric'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var i, y; |
|
|
|
|
@ -198,7 +193,7 @@ export default class PostgresQuery { |
|
|
|
|
|
|
|
|
|
query += ' FROM ' + this.quoteIdentifier(target.schema) + '.' + this.quoteIdentifier(target.table) + ' WHERE '; |
|
|
|
|
var conditions = _.map(target.where, (tag, index) => { |
|
|
|
|
return this.renderWhereConstraint(tag, index, false); |
|
|
|
|
return tag.params.join(' '); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
if (conditions.length > 0) { |
|
|
|
|
@ -222,8 +217,8 @@ export default class PostgresQuery { |
|
|
|
|
|
|
|
|
|
if (groupBySection.length) { |
|
|
|
|
query += ' GROUP BY ' + groupBySection; |
|
|
|
|
if (this.target.metricColumn !== "None") { |
|
|
|
|
query += ",2"; |
|
|
|
|
if (this.target.metricColumn !== 'None') { |
|
|
|
|
query += ',2'; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -235,5 +230,4 @@ export default class PostgresQuery { |
|
|
|
|
} |
|
|
|
|
return query; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|