mirror of
https://github.com/grafana/grafana.git
synced 2025-02-12 08:35:43 -06:00
* SQL: toRawSQL required and escape table * Fix autocomplete for MySQL * Change the way we escape for builder * Rework escape ident to be smart instead * Fix A11y for alias * Add first e2e test * Add test for code editor * Add doc * Review comments * Move functions to sqlUtil
86 lines
2.3 KiB
TypeScript
86 lines
2.3 KiB
TypeScript
import { isEmpty } from 'lodash';
|
|
|
|
import { RAQBFieldTypes, SQLQuery } from 'app/features/plugins/sql/types';
|
|
import { createSelectClause, haveColumns } from 'app/features/plugins/sql/utils/sql.utils';
|
|
|
|
export function getFieldConfig(type: string): { raqbFieldType: RAQBFieldTypes; icon: string } {
|
|
switch (type) {
|
|
case 'boolean': {
|
|
return { raqbFieldType: 'boolean', icon: 'toggle-off' };
|
|
}
|
|
case 'bit':
|
|
case 'bit varying':
|
|
case 'character':
|
|
case 'character varying':
|
|
case 'text': {
|
|
return { raqbFieldType: 'text', icon: 'text' };
|
|
}
|
|
case 'smallint':
|
|
case 'integer':
|
|
case 'bigint':
|
|
case 'decimal':
|
|
case 'numeric':
|
|
case 'real':
|
|
case 'double precision':
|
|
case 'serial':
|
|
case 'bigserial':
|
|
case 'smallserial': {
|
|
return { raqbFieldType: 'number', icon: 'calculator-alt' };
|
|
}
|
|
case 'date': {
|
|
return { raqbFieldType: 'date', icon: 'clock-nine' };
|
|
}
|
|
case 'time':
|
|
case 'time with time zone':
|
|
case 'time without time zone':
|
|
case 'interval': {
|
|
return { raqbFieldType: 'time', icon: 'clock-nine' };
|
|
}
|
|
case 'timestamp':
|
|
case 'timestamp with time zone':
|
|
case 'timestamp without time zone': {
|
|
return { raqbFieldType: 'datetime', icon: 'clock-nine' };
|
|
}
|
|
default:
|
|
return { raqbFieldType: 'text', icon: 'text' };
|
|
}
|
|
}
|
|
|
|
export function toRawSql({ sql, table }: SQLQuery): string {
|
|
let rawQuery = '';
|
|
|
|
// Return early with empty string if there is no sql column
|
|
if (!sql || !haveColumns(sql.columns)) {
|
|
return rawQuery;
|
|
}
|
|
|
|
rawQuery += createSelectClause(sql.columns);
|
|
|
|
if (table) {
|
|
rawQuery += `FROM ${table} `;
|
|
}
|
|
|
|
if (sql.whereString) {
|
|
rawQuery += `WHERE ${sql.whereString} `;
|
|
}
|
|
|
|
if (sql.groupBy?.[0]?.property.name) {
|
|
const groupBy = sql.groupBy.map((g) => g.property.name).filter((g) => !isEmpty(g));
|
|
rawQuery += `GROUP BY ${groupBy.join(', ')} `;
|
|
}
|
|
|
|
if (sql.orderBy?.property.name) {
|
|
rawQuery += `ORDER BY ${sql.orderBy.property.name} `;
|
|
}
|
|
|
|
if (sql.orderBy?.property.name && sql.orderByDirection) {
|
|
rawQuery += `${sql.orderByDirection} `;
|
|
}
|
|
|
|
// Altough LIMIT 0 doesn't make sense, it is still possible to have LIMIT 0
|
|
if (sql.limit !== undefined && sql.limit >= 0) {
|
|
rawQuery += `LIMIT ${sql.limit} `;
|
|
}
|
|
return rawQuery;
|
|
}
|