mirror of
https://github.com/grafana/grafana.git
synced 2025-01-06 14:13:11 -06:00
4e27ba9646
* noImplicitAny Stackdriver * Sub 3000 noImplicitAny * Update error count limit * Add DataQueryRequest type
143 lines
4.1 KiB
TypeScript
143 lines
4.1 KiB
TypeScript
export class MysqlMetaQuery {
|
|
constructor(private target: any, private queryModel: any) {}
|
|
|
|
getOperators(datatype: string) {
|
|
switch (datatype) {
|
|
case 'double':
|
|
case 'float': {
|
|
return ['=', '!=', '<', '<=', '>', '>='];
|
|
}
|
|
case 'text':
|
|
case 'tinytext':
|
|
case 'mediumtext':
|
|
case 'longtext':
|
|
case 'varchar':
|
|
case 'char': {
|
|
return ['=', '!=', '<', '<=', '>', '>=', 'IN', 'NOT IN', 'LIKE', 'NOT LIKE'];
|
|
}
|
|
default: {
|
|
return ['=', '!=', '<', '<=', '>', '>=', 'IN', 'NOT IN'];
|
|
}
|
|
}
|
|
}
|
|
|
|
// quote identifier as literal to use in metadata queries
|
|
quoteIdentAsLiteral(value: string) {
|
|
return this.queryModel.quoteLiteral(this.queryModel.unquoteIdentifier(value));
|
|
}
|
|
|
|
findMetricTable() {
|
|
// query that returns first table found that has a timestamp(tz) column and a float column
|
|
const query = `
|
|
SELECT
|
|
table_name as table_name,
|
|
( SELECT
|
|
column_name as column_name
|
|
FROM information_schema.columns c
|
|
WHERE
|
|
c.table_schema = t.table_schema AND
|
|
c.table_name = t.table_name AND
|
|
c.data_type IN ('timestamp', 'datetime')
|
|
ORDER BY ordinal_position LIMIT 1
|
|
) AS time_column,
|
|
( SELECT
|
|
column_name AS column_name
|
|
FROM information_schema.columns c
|
|
WHERE
|
|
c.table_schema = t.table_schema AND
|
|
c.table_name = t.table_name AND
|
|
c.data_type IN('float', 'int', 'bigint')
|
|
ORDER BY ordinal_position LIMIT 1
|
|
) AS value_column
|
|
FROM information_schema.tables t
|
|
WHERE
|
|
t.table_schema = database() AND
|
|
EXISTS
|
|
( SELECT 1
|
|
FROM information_schema.columns c
|
|
WHERE
|
|
c.table_schema = t.table_schema AND
|
|
c.table_name = t.table_name AND
|
|
c.data_type IN ('timestamp', 'datetime')
|
|
) AND
|
|
EXISTS
|
|
( SELECT 1
|
|
FROM information_schema.columns c
|
|
WHERE
|
|
c.table_schema = t.table_schema AND
|
|
c.table_name = t.table_name AND
|
|
c.data_type IN('float', 'int', 'bigint')
|
|
)
|
|
LIMIT 1
|
|
;`;
|
|
return query;
|
|
}
|
|
|
|
buildTableConstraint(table: string) {
|
|
let query = '';
|
|
|
|
// check for schema qualified table
|
|
if (table.includes('.')) {
|
|
const parts = table.split('.');
|
|
query = 'table_schema = ' + this.quoteIdentAsLiteral(parts[0]);
|
|
query += ' AND table_name = ' + this.quoteIdentAsLiteral(parts[1]);
|
|
return query;
|
|
} else {
|
|
query = 'table_schema = database() AND table_name = ' + this.quoteIdentAsLiteral(table);
|
|
|
|
return query;
|
|
}
|
|
}
|
|
|
|
buildTableQuery() {
|
|
return 'SELECT table_name FROM information_schema.tables WHERE table_schema = database() ORDER BY table_name';
|
|
}
|
|
|
|
buildColumnQuery(type?: string) {
|
|
let query = 'SELECT column_name FROM information_schema.columns WHERE ';
|
|
query += this.buildTableConstraint(this.target.table);
|
|
|
|
switch (type) {
|
|
case 'time': {
|
|
query += " AND data_type IN ('timestamp','datetime','bigint','int','double','float')";
|
|
break;
|
|
}
|
|
case 'metric': {
|
|
query += " AND data_type IN ('text','tinytext','mediumtext','longtext','varchar','char')";
|
|
break;
|
|
}
|
|
case 'value': {
|
|
query += " AND data_type IN ('bigint','int','smallint','mediumint','tinyint','double','decimal','float')";
|
|
query += ' AND column_name <> ' + this.quoteIdentAsLiteral(this.target.timeColumn);
|
|
break;
|
|
}
|
|
case 'group': {
|
|
query += " AND data_type IN ('text','tinytext','mediumtext','longtext','varchar','char')";
|
|
break;
|
|
}
|
|
}
|
|
|
|
query += ' ORDER BY column_name';
|
|
|
|
return query;
|
|
}
|
|
|
|
buildValueQuery(column: string) {
|
|
let query = 'SELECT DISTINCT QUOTE(' + column + ')';
|
|
query += ' FROM ' + this.target.table;
|
|
query += ' WHERE $__timeFilter(' + this.target.timeColumn + ')';
|
|
query += ' ORDER BY 1 LIMIT 100';
|
|
return query;
|
|
}
|
|
|
|
buildDatatypeQuery(column: string) {
|
|
let query = `
|
|
SELECT data_type
|
|
FROM information_schema.columns
|
|
WHERE `;
|
|
query += ' table_name = ' + this.quoteIdentAsLiteral(this.target.table);
|
|
query += ' AND column_name = ' + this.quoteIdentAsLiteral(column);
|
|
return query;
|
|
}
|
|
}
|