/usr/share/grafana/public/app/plugins/datasource/mssql
import { isEmpty } from 'lodash'; import { RAQBFieldTypes, SQLExpression, SQLQuery, haveColumns } from '@grafana/sql'; export function getIcon(type: string): string | undefined { switch (type) { case 'datetimeoffset': case 'date': case 'datetime2': case 'smalldatetime': case 'datetime': case 'time': return 'clock-nine'; case 'bit': return 'toggle-off'; case 'tinyint': case 'smallint': case 'int': case 'bigint': case 'decimal': case 'numeric': case 'real': case 'float': case 'money': case 'smallmoney': return 'calculator-alt'; case 'char': case 'varchar': case 'text': case 'nchar': case 'nvarchar': case 'ntext': case 'binary': case 'varbinary': case 'image': return 'text'; default: return undefined; } } export function getRAQBType(type: string): RAQBFieldTypes { switch (type) { case 'datetimeoffset': case 'datetime2': case 'smalldatetime': case 'datetime': return 'datetime'; case 'time': return 'time'; case 'date': return 'date'; case 'bit': return 'boolean'; case 'tinyint': case 'smallint': case 'int': case 'bigint': case 'decimal': case 'numeric': case 'real': case 'float': case 'money': case 'smallmoney': return 'number'; case 'char': case 'varchar': case 'text': case 'nchar': case 'nvarchar': case 'ntext': case 'binary': case 'varbinary': case 'image': return 'text'; default: return 'text'; } } export function toRawSql({ sql, dataset, 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, sql.limit); if (dataset && table) { rawQuery += `FROM [${dataset}].${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} `; } return rawQuery; } function createSelectClause(sqlColumns: NonNullable<SQLExpression['columns']>, limit?: number): string { const columns = sqlColumns.map((c) => { let rawColumn = ''; if (c.name && c.alias) { rawColumn += `${c.name}(${c.parameters?.map((p) => `${p.name}`)}) AS ${c.alias}`; } else if (c.name) { rawColumn += `${c.name}(${c.parameters?.map((p) => `${p.name}`)})`; } else if (c.alias) { rawColumn += `${c.parameters?.map((p) => `${p.name}`)} AS ${c.alias}`; } else { rawColumn += `${c.parameters?.map((p) => `${p.name}`)}`; } return rawColumn; }); return `SELECT ${isLimit(limit) ? 'TOP(' + limit + ')' : ''} ${columns.join(', ')} `; } const isLimit = (limit: number | undefined): boolean => limit !== undefined && limit >= 0;
.
Edit
..
Edit
CHANGELOG.md
Edit
CheatSheet.tsx
Edit
MSSqlMetaQuery.test.ts
Edit
MSSqlMetaQuery.ts
Edit
MSSqlQueryModel.ts
Edit
README.md
Edit
azureauth
Edit
configuration
Edit
datasource.test.ts
Edit
datasource.ts
Edit
dist
Edit
i18next.config.ts
Edit
img
Edit
locales
Edit
module.ts
Edit
package.json
Edit
plugin.json
Edit
project.json
Edit
sqlCompletionProvider.ts
Edit
sqlUtil.test.ts
Edit
sqlUtil.ts
Edit
tsconfig.json
Edit
types.ts
Edit
webpack.config.ts
Edit