grafana/public/app/plugins/datasource/postgres/query_builder.ts

70 lines
2.5 KiB
TypeScript
Raw Normal View History

2018-02-08 03:19:43 -06:00
export class PostgresQueryBuilder {
constructor(private target, private queryModel) {}
buildSchemaQuery() {
var query = 'SELECT quote_ident(schema_name) FROM information_schema.schemata WHERE';
2018-02-08 03:19:43 -06:00
query += " schema_name NOT LIKE 'pg_%' AND schema_name NOT LIKE '\\_%' AND schema_name <> 'information_schema';";
return query;
}
buildTableQuery() {
var query = 'SELECT quote_ident(table_name) FROM information_schema.tables WHERE ';
query += 'table_schema = ' + this.quoteIdentAsLiteral(this.target.schema);
2018-02-08 03:19:43 -06:00
return query;
}
// quote identifier as literal to use in metadata queries
quoteIdentAsLiteral(value) {
return this.queryModel.quoteLiteral(this.queryModel.unquoteIdentifier(value));
}
2018-02-08 03:19:43 -06:00
buildColumnQuery(type?: string) {
var query = 'SELECT quote_ident(column_name) FROM information_schema.columns WHERE ';
query += 'table_schema = ' + this.quoteIdentAsLiteral(this.target.schema);
query += ' AND table_name = ' + this.quoteIdentAsLiteral(this.target.table);
2018-02-08 03:19:43 -06:00
switch (type) {
case 'time': {
query +=
" AND data_type IN ('timestamp without time zone','timestamp with time zone','bigint','integer','double precision','real')";
2018-02-08 03:19:43 -06:00
break;
}
case 'metric': {
2018-02-08 03:19:43 -06:00
query += " AND data_type IN ('text','char','varchar')";
break;
}
case 'value': {
2018-02-08 03:19:43 -06:00
query += " AND data_type IN ('bigint','integer','double precision','real')";
break;
}
}
return query;
}
buildValueQuery(column: string) {
var query = 'SELECT DISTINCT quote_literal(' + column + ')';
query += ' FROM ' + this.target.schema + '.' + this.target.table;
2018-07-13 02:31:39 -05:00
query += ' WHERE $__timeFilter(' + this.target.timeColumn + ')';
query += ' ORDER BY 1 LIMIT 100';
2018-02-08 03:19:43 -06:00
return query;
}
2018-03-13 17:06:39 -05:00
buildDatatypeQuery(column: string) {
var query = 'SELECT data_type FROM information_schema.columns WHERE ';
query += ' table_schema = ' + this.quoteIdentAsLiteral(this.target.schema);
query += ' AND table_name = ' + this.quoteIdentAsLiteral(this.target.table);
query += ' AND column_name = ' + this.quoteIdentAsLiteral(column);
2018-03-13 17:06:39 -05:00
return query;
}
2018-03-14 16:59:48 -05:00
buildAggregateQuery() {
var query = 'SELECT DISTINCT proname FROM pg_aggregate ';
query += 'INNER JOIN pg_proc ON pg_aggregate.aggfnoid = pg_proc.oid ';
query += 'INNER JOIN pg_type ON pg_type.oid=pg_proc.prorettype ';
2018-03-14 16:59:48 -05:00
query += "WHERE pronargs=1 AND typname IN ('int8','float8') AND aggkind='n' ORDER BY 1";
return query;
}
2018-02-08 03:19:43 -06:00
}