| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- export class MysqlMetaQuery {
- constructor(private target, private queryModel) {}
- 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) {
- 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;
- }
- }
|