1{"version":3,"file":"postgresPlugin.0e38943fa459e872fe93.js","mappings":"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","sources":["webpack://grafana/./public/app/angular/components/sql_part/sql_part.ts","webpack://grafana/./public/app/features/datasources/utils/passwordHandlers.ts","webpack://grafana/./public/app/plugins/datasource/postgres/response_parser.ts","webpack://grafana/./public/app/plugins/datasource/postgres/postgres_query_model.ts","webpack://grafana/./public/app/plugins/datasource/postgres/datasource.ts","webpack://grafana/./public/app/plugins/datasource/postgres/meta_query.ts","webpack://grafana/./public/app/plugins/datasource/postgres/sql_part.ts","webpack://grafana/./public/app/plugins/datasource/postgres/query_ctrl.ts","webpack://grafana/./public/app/plugins/datasource/postgres/config_ctrl.ts","webpack://grafana/./public/app/plugins/datasource/postgres/module.ts"],"sourcesContent":["import { clone } from 'lodash';\n\nexport class SqlPartDef {\n type: string;\n style: string;\n label: string;\n params: any[];\n defaultParams: any[];\n wrapOpen: string;\n wrapClose: string;\n separator: string;\n\n constructor(options: any) {\n this.type = options.type;\n if (options.label) {\n this.label = options.label;\n } else {\n this.label = this.type[0].toUpperCase() + this.type.substring(1) + ':';\n }\n this.style = options.style;\n if (this.style === 'function') {\n this.wrapOpen = '(';\n this.wrapClose = ')';\n this.separator = ', ';\n } else {\n this.wrapOpen = ' ';\n this.wrapClose = ' ';\n this.separator = ' ';\n }\n this.params = options.params;\n this.defaultParams = options.defaultParams;\n }\n}\n\nexport class SqlPart {\n part: any;\n def: SqlPartDef;\n params: any[];\n label: string;\n name: string;\n datatype: string;\n\n constructor(part: any, def: any) {\n this.part = part;\n this.def = def;\n if (!this.def) {\n throw { message: 'Could not find sql part ' + part.type };\n }\n\n this.datatype = part.datatype;\n\n if (part.name) {\n this.name = part.name;\n this.label = def.label + ' ' + part.name;\n } else {\n this.name = '';\n this.label = def.label;\n }\n\n part.params = part.params || clone(this.def.defaultParams);\n this.params = part.params;\n }\n\n updateParam(strValue: string, index: number) {\n // handle optional parameters\n if (strValue === '' && this.def.params[index].optional) {\n this.params.splice(index, 1);\n } else {\n this.params[index] = strValue;\n }\n\n this.part.params = this.params;\n }\n}\n","/**\n * Set of handlers for secure password field in Angular components. They handle backward compatibility with\n * passwords stored in plain text fields.\n */\n\nimport { SyntheticEvent } from 'react';\n\nexport enum PasswordFieldEnum {\n Password = 'password',\n BasicAuthPassword = 'basicAuthPassword',\n}\n\n/**\n * Basic shape for settings controllers in at the moment mostly angular data source plugins.\n */\nexport type Ctrl = {\n current: {\n secureJsonFields: {\n [key: string]: boolean;\n };\n secureJsonData?: {\n [key: string]: string;\n };\n password?: string;\n basicAuthPassword?: string;\n };\n};\n\nexport const createResetHandler = (ctrl: Ctrl, field: PasswordFieldEnum) => (\n event: SyntheticEvent<HTMLInputElement>\n) => {\n event.preventDefault();\n // Reset also normal plain text password to remove it and only save it in secureJsonData.\n ctrl.current[field] = undefined;\n ctrl.current.secureJsonFields[field] = false;\n ctrl.current.secureJsonData = ctrl.current.secureJsonData || {};\n ctrl.current.secureJsonData[field] = '';\n};\n\nexport const createChangeHandler = (ctrl: any, field: PasswordFieldEnum) => (\n event: SyntheticEvent<HTMLInputElement>\n) => {\n ctrl.current.secureJsonData = ctrl.current.secureJsonData || {};\n ctrl.current.secureJsonData[field] = event.currentTarget.value;\n};\n","import { AnnotationEvent, DataFrame, MetricFindValue } from '@grafana/data';\nimport { BackendDataSourceResponse, FetchResponse, toDataQueryResponse } from '@grafana/runtime';\n\nexport default class ResponseParser {\n transformMetricFindResponse(raw: FetchResponse<BackendDataSourceResponse>): MetricFindValue[] {\n const frames = toDataQueryResponse(raw).data as DataFrame[];\n\n if (!frames || !frames.length) {\n return [];\n }\n\n const frame = frames[0];\n\n const values: MetricFindValue[] = [];\n const textField = frame.fields.find((f) => f.name === '__text');\n const valueField = frame.fields.find((f) => f.name === '__value');\n\n if (textField && valueField) {\n for (let i = 0; i < textField.values.length; i++) {\n values.push({ text: '' + textField.values.get(i), value: '' + valueField.values.get(i) });\n }\n } else {\n values.push(\n ...frame.fields\n .flatMap((f) => f.values.toArray())\n .map((v) => ({\n text: v,\n }))\n );\n }\n\n return Array.from(new Set(values.map((v) => v.text))).map((text) => ({\n text,\n value: values.find((v) => v.text === text)?.value,\n }));\n }\n\n async transformAnnotationResponse(options: any, data: BackendDataSourceResponse): Promise<AnnotationEvent[]> {\n const frames = toDataQueryResponse({ data: data }).data as DataFrame[];\n if (!frames || !frames.length) {\n return [];\n }\n const frame = frames[0];\n const timeField = frame.fields.find((f) => f.name === 'time');\n\n if (!timeField) {\n throw new Error('Missing mandatory time column (with time column alias) in annotation query');\n }\n\n const timeEndField = frame.fields.find((f) => f.name === 'timeend');\n const textField = frame.fields.find((f) => f.name === 'text');\n const tagsField = frame.fields.find((f) => f.name === 'tags');\n\n const list: AnnotationEvent[] = [];\n for (let i = 0; i < frame.length; i++) {\n const timeEnd = timeEndField && timeEndField.values.get(i) ? Math.floor(timeEndField.values.get(i)) : undefined;\n list.push({\n annotation: options.annotation,\n time: Math.floor(timeField.values.get(i)),\n timeEnd,\n text: textField && textField.values.get(i) ? textField.values.get(i) : '',\n tags:\n tagsField && tagsField.values.get(i)\n ? tagsField.values\n .get(i)\n .trim()\n .split(/\\s*,\\s*/)\n : [],\n });\n }\n\n return list;\n }\n}\n","import { find, map } from 'lodash';\nimport { TemplateSrv } from '@grafana/runtime';\nimport { ScopedVars } from '@grafana/data';\n\nexport default class PostgresQueryModel {\n target: any;\n templateSrv: any;\n scopedVars: any;\n\n /** @ngInject */\n constructor(target: any, templateSrv?: TemplateSrv, scopedVars?: ScopedVars) {\n this.target = target;\n this.templateSrv = templateSrv;\n this.scopedVars = scopedVars;\n\n target.format = target.format || 'time_series';\n target.timeColumn = target.timeColumn || 'time';\n target.metricColumn = target.metricColumn || 'none';\n\n target.group = target.group || [];\n target.where = target.where || [{ type: 'macro', name: '$__timeFilter', params: [] }];\n target.select = target.select || [[{ type: 'column', params: ['value'] }]];\n\n // handle pre query gui panels gracefully\n if (!('rawQuery' in this.target)) {\n if ('rawSql' in target) {\n // pre query gui panel\n target.rawQuery = true;\n } else {\n // new panel\n target.rawQuery = false;\n }\n }\n\n // give interpolateQueryStr access to this\n this.interpolateQueryStr = this.interpolateQueryStr.bind(this);\n }\n\n // remove identifier quoting from identifier to use in metadata queries\n unquoteIdentifier(value: string) {\n if (value[0] === '\"' && value[value.length - 1] === '\"') {\n return value.substring(1, value.length - 1).replace(/\"\"/g, '\"');\n } else {\n return value;\n }\n }\n\n quoteIdentifier(value: any) {\n return '\"' + String(value).replace(/\"/g, '\"\"') + '\"';\n }\n\n quoteLiteral(value: any) {\n return \"'\" + String(value).replace(/'/g, \"''\") + \"'\";\n }\n\n escapeLiteral(value: any) {\n return String(value).replace(/'/g, \"''\");\n }\n\n hasTimeGroup() {\n return find(this.target.group, (g: any) => g.type === 'time');\n }\n\n hasMetricColumn() {\n return this.target.metricColumn !== 'none';\n }\n\n interpolateQueryStr(value: any, variable: { multi: any; includeAll: any }, defaultFormatFn: any) {\n // if no multi or include all do not regexEscape\n if (!variable.multi && !variable.includeAll) {\n return this.escapeLiteral(value);\n }\n\n if (typeof value === 'string') {\n return this.quoteLiteral(value);\n }\n\n const escapedValues = map(value, this.quoteLiteral);\n return escapedValues.join(',');\n }\n\n render(interpolate?: any) {\n const target = this.target;\n\n // new query with no table set yet\n if (!this.target.rawQuery && !('table' in this.target)) {\n return '';\n }\n\n if (!target.rawQuery) {\n target.rawSql = this.buildQuery();\n }\n\n if (interpolate) {\n return this.templateSrv.replace(target.rawSql, this.scopedVars, this.interpolateQueryStr);\n } else {\n return target.rawSql;\n }\n }\n\n hasUnixEpochTimecolumn() {\n return ['int4', 'int8', 'float4', 'float8', 'numeric'].indexOf(this.target.timeColumnType) > -1;\n }\n\n buildTimeColumn(alias = true) {\n const timeGroup = this.hasTimeGroup();\n let query;\n let macro = '$__timeGroup';\n\n if (timeGroup) {\n let args;\n if (timeGroup.params.length > 1 && timeGroup.params[1] !== 'none') {\n args = timeGroup.params.join(',');\n } else {\n args = timeGroup.params[0];\n }\n if (this.hasUnixEpochTimecolumn()) {\n macro = '$__unixEpochGroup';\n }\n if (alias) {\n macro += 'Alias';\n }\n query = macro + '(' + this.target.timeColumn + ',' + args + ')';\n } else {\n query = this.target.timeColumn;\n if (alias) {\n query += ' AS \"time\"';\n }\n }\n\n return query;\n }\n\n buildMetricColumn() {\n if (this.hasMetricColumn()) {\n return this.target.metricColumn + ' AS metric';\n }\n\n return '';\n }\n\n buildValueColumns() {\n let query = '';\n for (const column of this.target.select) {\n query += ',\\n ' + this.buildValueColumn(column);\n }\n\n return query;\n }\n\n buildValueColumn(column: any) {\n let query = '';\n\n const columnName: any = find(column, (g: any) => g.type === 'column');\n query = columnName.params[0];\n\n const aggregate: any = find(column, (g: any) => g.type === 'aggregate' || g.type === 'percentile');\n const windows: any = find(column, (g: any) => g.type === 'window' || g.type === 'moving_window');\n\n if (aggregate) {\n const func = aggregate.params[0];\n switch (aggregate.type) {\n case 'aggregate':\n if (func === 'first' || func === 'last') {\n query = func + '(' + query + ',' + this.target.timeColumn + ')';\n } else {\n query = func + '(' + query + ')';\n }\n break;\n case 'percentile':\n query = func + '(' + aggregate.params[1] + ') WITHIN GROUP (ORDER BY ' + query + ')';\n break;\n }\n }\n\n if (windows) {\n const overParts = [];\n if (this.hasMetricColumn()) {\n overParts.push('PARTITION BY ' + this.target.metricColumn);\n }\n overParts.push('ORDER BY ' + this.buildTimeColumn(false));\n\n const over = overParts.join(' ');\n let curr: string;\n let prev: string;\n switch (windows.type) {\n case 'window':\n switch (windows.params[0]) {\n case 'delta':\n curr = query;\n prev = 'lag(' + curr + ') OVER (' + over + ')';\n query = curr + ' - ' + prev;\n break;\n case 'increase':\n curr = query;\n prev = 'lag(' + curr + ') OVER (' + over + ')';\n query = '(CASE WHEN ' + curr + ' >= ' + prev + ' THEN ' + curr + ' - ' + prev;\n query += ' WHEN ' + prev + ' IS NULL THEN NULL ELSE ' + curr + ' END)';\n break;\n case 'rate':\n let timeColumn = this.target.timeColumn;\n if (aggregate) {\n timeColumn = 'min(' + timeColumn + ')';\n }\n\n curr = query;\n prev = 'lag(' + curr + ') OVER (' + over + ')';\n query = '(CASE WHEN ' + curr + ' >= ' + prev + ' THEN ' + curr + ' - ' + prev;\n query += ' WHEN ' + prev + ' IS NULL THEN NULL ELSE ' + curr + ' END)';\n query += '/extract(epoch from ' + timeColumn + ' - lag(' + timeColumn + ') OVER (' + over + '))';\n break;\n default:\n query = windows.params[0] + '(' + query + ') OVER (' + over + ')';\n break;\n }\n break;\n case 'moving_window':\n query = windows.params[0] + '(' + query + ') OVER (' + over + ' ROWS ' + windows.params[1] + ' PRECEDING)';\n break;\n }\n }\n\n const alias: any = find(column, (g: any) => g.type === 'alias');\n if (alias) {\n query += ' AS ' + this.quoteIdentifier(alias.params[0]);\n }\n\n return query;\n }\n\n buildWhereClause() {\n let query = '';\n const conditions = map(this.target.where, (tag, index) => {\n switch (tag.type) {\n case 'macro':\n return tag.name + '(' + this.target.timeColumn + ')';\n break;\n case 'expression':\n return tag.params.join(' ');\n break;\n }\n });\n\n if (conditions.length > 0) {\n query = '\\nWHERE\\n ' + conditions.join(' AND\\n ');\n }\n\n return query;\n }\n\n buildGroupClause() {\n let query = '';\n let groupSection = '';\n\n for (let i = 0; i < this.target.group.length; i++) {\n const part = this.target.group[i];\n if (i > 0) {\n groupSection += ', ';\n }\n if (part.type === 'time') {\n groupSection += '1';\n } else {\n groupSection += part.params[0];\n }\n }\n\n if (groupSection.length) {\n query = '\\nGROUP BY ' + groupSection;\n if (this.hasMetricColumn()) {\n query += ',2';\n }\n }\n return query;\n }\n\n buildQuery() {\n let query = 'SELECT';\n\n query += '\\n ' + this.buildTimeColumn();\n if (this.hasMetricColumn()) {\n query += ',\\n ' + this.buildMetricColumn();\n }\n query += this.buildValueColumns();\n\n query += '\\nFROM ' + this.target.table;\n\n query += this.buildWhereClause();\n query += this.buildGroupClause();\n\n query += '\\nORDER BY 1';\n if (this.hasMetricColumn()) {\n query += ',2';\n }\n\n return query;\n }\n}\n","import { map as _map } from 'lodash';\nimport { lastValueFrom, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { BackendDataSourceResponse, DataSourceWithBackend, FetchResponse, getBackendSrv } from '@grafana/runtime';\nimport { AnnotationEvent, DataSourceInstanceSettings, MetricFindValue, ScopedVars } from '@grafana/data';\n\nimport ResponseParser from './response_parser';\nimport PostgresQueryModel from 'app/plugins/datasource/postgres/postgres_query_model';\nimport { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_srv';\nimport { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';\n//Types\nimport { PostgresOptions, PostgresQuery, PostgresQueryForInterpolation } from './types';\nimport { getSearchFilterScopedVar } from '../../../features/variables/utils';\nimport { toTestingStatus } from '@grafana/runtime/src/utils/queryResponse';\n\nexport class PostgresDatasource extends DataSourceWithBackend<PostgresQuery, PostgresOptions> {\n id: any;\n name: any;\n jsonData: any;\n responseParser: ResponseParser;\n queryModel: PostgresQueryModel;\n interval: string;\n\n constructor(\n instanceSettings: DataSourceInstanceSettings<PostgresOptions>,\n private readonly templateSrv: TemplateSrv = getTemplateSrv(),\n private readonly timeSrv: TimeSrv = getTimeSrv()\n ) {\n super(instanceSettings);\n this.name = instanceSettings.name;\n this.id = instanceSettings.id;\n this.jsonData = instanceSettings.jsonData;\n this.responseParser = new ResponseParser();\n this.queryModel = new PostgresQueryModel({});\n const settingsData = instanceSettings.jsonData || ({} as PostgresOptions);\n this.interval = settingsData.timeInterval || '1m';\n }\n\n interpolateVariable = (value: string | string[], variable: { multi: any; includeAll: any }) => {\n if (typeof value === 'string') {\n if (variable.multi || variable.includeAll) {\n return this.queryModel.quoteLiteral(value);\n } else {\n return value;\n }\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n const quotedValues = _map(value, (v) => {\n return this.queryModel.quoteLiteral(v);\n });\n return quotedValues.join(',');\n };\n\n interpolateVariablesInQueries(\n queries: PostgresQueryForInterpolation[],\n scopedVars: ScopedVars\n ): PostgresQueryForInterpolation[] {\n let expandedQueries = queries;\n if (queries && queries.length > 0) {\n expandedQueries = queries.map((query) => {\n const expandedQuery = {\n ...query,\n datasource: this.getRef(),\n rawSql: this.templateSrv.replace(query.rawSql, scopedVars, this.interpolateVariable),\n rawQuery: true,\n };\n return expandedQuery;\n });\n }\n return expandedQueries;\n }\n\n filterQuery(query: PostgresQuery): boolean {\n return !query.hide;\n }\n\n applyTemplateVariables(target: PostgresQuery, scopedVars: ScopedVars): Record<string, any> {\n const queryModel = new PostgresQueryModel(target, this.templateSrv, scopedVars);\n return {\n refId: target.refId,\n datasource: this.getRef(),\n rawSql: queryModel.render(this.interpolateVariable as any),\n format: target.format,\n };\n }\n\n async annotationQuery(options: any): Promise<AnnotationEvent[]> {\n if (!options.annotation.rawQuery) {\n return Promise.reject({\n message: 'Query missing in annotation definition',\n });\n }\n\n const query = {\n refId: options.annotation.name,\n datasource: this.getRef(),\n rawSql: this.templateSrv.replace(options.annotation.rawQuery, options.scopedVars, this.interpolateVariable),\n format: 'table',\n };\n\n return lastValueFrom(\n getBackendSrv()\n .fetch<BackendDataSourceResponse>({\n url: '/api/ds/query',\n method: 'POST',\n data: {\n from: options.range.from.valueOf().toString(),\n to: options.range.to.valueOf().toString(),\n queries: [query],\n },\n requestId: options.annotation.name,\n })\n .pipe(\n map(\n async (res: FetchResponse<BackendDataSourceResponse>) =>\n await this.responseParser.transformAnnotationResponse(options, res.data)\n )\n )\n );\n }\n\n metricFindQuery(query: string, optionalOptions: any): Promise<MetricFindValue[]> {\n let refId = 'tempvar';\n if (optionalOptions && optionalOptions.variable && optionalOptions.variable.name) {\n refId = optionalOptions.variable.name;\n }\n\n const rawSql = this.templateSrv.replace(\n query,\n getSearchFilterScopedVar({ query, wildcardChar: '%', options: optionalOptions }),\n this.interpolateVariable\n );\n\n const interpolatedQuery = {\n refId: refId,\n datasource: this.getRef(),\n rawSql,\n format: 'table',\n };\n\n const range = this.timeSrv.timeRange();\n\n return lastValueFrom(\n getBackendSrv()\n .fetch<BackendDataSourceResponse>({\n url: '/api/ds/query',\n method: 'POST',\n data: {\n from: range.from.valueOf().toString(),\n to: range.to.valueOf().toString(),\n queries: [interpolatedQuery],\n },\n requestId: refId,\n })\n .pipe(\n map((rsp) => {\n return this.responseParser.transformMetricFindResponse(rsp);\n }),\n catchError((err) => {\n return of([]);\n })\n )\n );\n }\n\n private _metaRequest(rawSql: string) {\n const refId = 'meta';\n const range = this.timeSrv.timeRange();\n const query = {\n refId: refId,\n datasource: this.getRef(),\n rawSql,\n format: 'table',\n };\n return getBackendSrv().fetch<BackendDataSourceResponse>({\n url: '/api/ds/query',\n method: 'POST',\n data: {\n from: range.from.valueOf().toString(),\n to: range.to.valueOf().toString(),\n queries: [query],\n },\n requestId: refId,\n });\n }\n\n getVersion(): Promise<any> {\n return lastValueFrom(this._metaRequest(\"SELECT current_setting('server_version_num')::int/100\"));\n }\n\n getTimescaleDBVersion(): Promise<any> {\n return lastValueFrom(this._metaRequest(\"SELECT extversion FROM pg_extension WHERE extname = 'timescaledb'\"));\n }\n\n testDatasource(): Promise<any> {\n return lastValueFrom(this._metaRequest('SELECT 1'))\n .then(() => {\n return { status: 'success', message: 'Database Connection OK' };\n })\n .catch((err: any) => {\n return toTestingStatus(err);\n });\n }\n\n targetContainsTemplate(target: any) {\n let rawSql = '';\n\n if (target.rawQuery) {\n rawSql = target.rawSql;\n } else {\n const query = new PostgresQueryModel(target);\n rawSql = query.buildQuery();\n }\n\n rawSql = rawSql.replace('$__', '');\n\n return this.templateSrv.variableExists(rawSql);\n }\n}\n","import QueryModel from './postgres_query_model';\n\nexport class PostgresMetaQuery {\n constructor(private target: { table: string; timeColumn: string }, private queryModel: QueryModel) {}\n\n getOperators(datatype: string) {\n switch (datatype) {\n case 'float4':\n case 'float8': {\n return ['=', '!=', '<', '<=', '>', '>='];\n }\n case 'text':\n case 'varchar':\n case 'char': {\n return ['=', '!=', '<', '<=', '>', '>=', 'IN', 'NOT IN', 'LIKE', 'NOT LIKE', '~', '~*', '!~', '!~*'];\n }\n default: {\n return ['=', '!=', '<', '<=', '>', '>=', 'IN', 'NOT IN'];\n }\n }\n }\n\n // quote identifier as literal to use in metadata queries\n quoteIdentAsLiteral(value: string) {\n return this.queryModel.quoteLiteral(this.queryModel.unquoteIdentifier(value));\n }\n\n findMetricTable() {\n // query that returns first table found that has a timestamp(tz) column and a float column\n let query = `\nSELECT\n\tquote_ident(table_name) as table_name,\n\t( SELECT\n\t quote_ident(column_name) as column_name\n\t FROM information_schema.columns c\n WHERE\n c.table_schema = t.table_schema AND\n c.table_name = t.table_name AND\n udt_name IN ('timestamptz','timestamp')\n ORDER BY ordinal_position LIMIT 1\n ) AS time_column,\n ( SELECT\n quote_ident(column_name) AS column_name\n FROM information_schema.columns c\n WHERE\n c.table_schema = t.table_schema AND\n c.table_name = t.table_name AND\n udt_name='float8'\n ORDER BY ordinal_position LIMIT 1\n ) AS value_column\nFROM information_schema.tables t\nWHERE `;\n query += this.buildSchemaConstraint();\n query += ` AND\n EXISTS\n ( SELECT 1\n FROM information_schema.columns c\n WHERE\n c.table_schema = t.table_schema AND\n c.table_name = t.table_name AND\n udt_name IN ('timestamptz','timestamp')\n ) AND\n EXISTS\n ( SELECT 1\n FROM information_schema.columns c\n WHERE\n c.table_schema = t.table_schema AND\n c.table_name = t.table_name AND\n udt_name='float8'\n )\nLIMIT 1\n;`;\n return query;\n }\n\n buildSchemaConstraint() {\n const query = `\ntable_schema IN (\n SELECT\n CASE WHEN trim(s[i]) = '\"$user\"' THEN user ELSE trim(s[i]) END\n FROM\n generate_series(\n array_lower(string_to_array(current_setting('search_path'),','),1),\n array_upper(string_to_array(current_setting('search_path'),','),1)\n ) as i,\n string_to_array(current_setting('search_path'),',') s\n)`;\n return query;\n }\n\n buildTableConstraint(table: string) {\n let query = '';\n\n // check for schema qualified table\n if (table.includes('.')) {\n const parts = table.split('.');\n query = 'table_schema = ' + this.quoteIdentAsLiteral(parts[0]);\n query += ' AND table_name = ' + this.quoteIdentAsLiteral(parts[1]);\n return query;\n } else {\n query = this.buildSchemaConstraint();\n query += ' AND table_name = ' + this.quoteIdentAsLiteral(table);\n\n return query;\n }\n }\n\n buildTableQuery() {\n let query = 'SELECT quote_ident(table_name) FROM information_schema.tables WHERE ';\n query += this.buildSchemaConstraint();\n query += ' ORDER BY table_name';\n return query;\n }\n\n buildColumnQuery(type?: string) {\n let query = 'SELECT quote_ident(column_name) FROM information_schema.columns WHERE ';\n query += this.buildTableConstraint(this.target.table);\n\n switch (type) {\n case 'time': {\n query +=\n \" AND data_type IN ('timestamp without time zone','timestamp with time zone','bigint','integer','double precision','real')\";\n break;\n }\n case 'metric': {\n query += \" AND data_type IN ('text','character','character varying')\";\n break;\n }\n case 'value': {\n query += \" AND data_type IN ('bigint','integer','double precision','real')\";\n query += ' AND column_name <> ' + this.quoteIdentAsLiteral(this.target.timeColumn);\n break;\n }\n case 'group': {\n query += \" AND data_type IN ('text','character','character varying','uuid')\";\n break;\n }\n }\n\n query += ' ORDER BY column_name';\n\n return query;\n }\n\n buildValueQuery(column: string) {\n let query = 'SELECT DISTINCT quote_literal(' + column + ')';\n query += ' FROM ' + this.target.table;\n query += ' WHERE $__timeFilter(' + this.target.timeColumn + ')';\n query += ' AND ' + column + ' IS NOT NULL';\n query += ' ORDER BY 1 LIMIT 100';\n return query;\n }\n\n buildDatatypeQuery(column: string) {\n let query = 'SELECT udt_name FROM information_schema.columns WHERE ';\n query += this.buildTableConstraint(this.target.table);\n query += ' AND column_name = ' + this.quoteIdentAsLiteral(column);\n return query;\n }\n\n buildAggregateQuery() {\n let query = 'SELECT DISTINCT proname FROM pg_aggregate ';\n query += 'INNER JOIN pg_proc ON pg_aggregate.aggfnoid = pg_proc.oid ';\n query += 'INNER JOIN pg_type ON pg_type.oid=pg_proc.prorettype ';\n query += \"WHERE pronargs=1 AND typname IN ('float8') AND aggkind='n' ORDER BY 1\";\n return query;\n }\n}\n","import { SqlPartDef, SqlPart } from 'app/angular/components/sql_part/sql_part';\n\nconst index: any[] = [];\n\nfunction createPart(part: any): any {\n const def = index[part.type];\n if (!def) {\n return null;\n }\n\n return new SqlPart(part, def);\n}\n\nfunction register(options: any) {\n index[options.type] = new SqlPartDef(options);\n}\n\nregister({\n type: 'column',\n style: 'label',\n params: [{ type: 'column', dynamicLookup: true }],\n defaultParams: ['value'],\n});\n\nregister({\n type: 'expression',\n style: 'expression',\n label: 'Expr:',\n params: [\n { name: 'left', type: 'string', dynamicLookup: true },\n { name: 'op', type: 'string', dynamicLookup: true },\n { name: 'right', type: 'string', dynamicLookup: true },\n ],\n defaultParams: ['value', '=', 'value'],\n});\n\nregister({\n type: 'macro',\n style: 'label',\n label: 'Macro:',\n params: [],\n defaultParams: [],\n});\n\nregister({\n type: 'aggregate',\n style: 'label',\n params: [\n {\n name: 'name',\n type: 'string',\n options: ['avg', 'count', 'min', 'max', 'sum', 'stddev', 'variance'],\n },\n ],\n defaultParams: ['avg'],\n});\n\nregister({\n type: 'percentile',\n label: 'Aggregate:',\n style: 'label',\n params: [\n {\n name: 'name',\n type: 'string',\n options: ['percentile_cont', 'percentile_disc'],\n },\n {\n name: 'fraction',\n type: 'number',\n options: ['0.5', '0.75', '0.9', '0.95', '0.99'],\n },\n ],\n defaultParams: ['percentile_cont', '0.95'],\n});\n\nregister({\n type: 'alias',\n style: 'label',\n params: [{ name: 'name', type: 'string', quote: 'double' }],\n defaultParams: ['alias'],\n});\n\nregister({\n type: 'time',\n style: 'function',\n label: 'time',\n params: [\n {\n name: 'interval',\n type: 'interval',\n options: ['$__interval', '1s', '10s', '1m', '5m', '10m', '15m', '1h'],\n },\n {\n name: 'fill',\n type: 'string',\n options: ['none', 'NULL', 'previous', '0'],\n },\n ],\n defaultParams: ['$__interval', 'none'],\n});\n\nregister({\n type: 'window',\n style: 'label',\n params: [\n {\n name: 'function',\n type: 'string',\n options: ['delta', 'increase', 'rate', 'sum'],\n },\n ],\n defaultParams: ['increase'],\n});\n\nregister({\n type: 'moving_window',\n style: 'label',\n label: 'Moving Window:',\n params: [\n {\n name: 'function',\n type: 'string',\n options: ['avg'],\n },\n {\n name: 'window_size',\n type: 'number',\n options: ['3', '5', '7', '10', '20'],\n },\n ],\n defaultParams: ['avg', '5'],\n});\n\nexport default {\n create: createPart,\n};\n","import { clone, filter, find, findIndex, indexOf, map } from 'lodash';\nimport appEvents from 'app/core/app_events';\nimport { PostgresMetaQuery } from './meta_query';\nimport { QueryCtrl } from 'app/plugins/sdk';\nimport { SqlPart } from 'app/angular/components/sql_part/sql_part';\nimport PostgresQueryModel from './postgres_query_model';\nimport sqlPart from './sql_part';\nimport { auto } from 'angular';\nimport { PanelEvents, QueryResultMeta } from '@grafana/data';\nimport { VariableWithMultiSupport } from 'app/features/variables/types';\nimport { TemplateSrv } from '@grafana/runtime';\nimport { ShowConfirmModalEvent } from 'app/types/events';\n\nconst defaultQuery = `SELECT\n $__time(time_column),\n value1\nFROM\n metric_table\nWHERE\n $__timeFilter(time_column)\n`;\n\nexport class PostgresQueryCtrl extends QueryCtrl {\n static templateUrl = 'partials/query.editor.html';\n\n formats: any[];\n queryModel: PostgresQueryModel;\n metaBuilder: PostgresMetaQuery;\n lastQueryMeta?: QueryResultMeta;\n lastQueryError?: string;\n showHelp = false;\n tableSegment: any;\n whereAdd: any;\n timeColumnSegment: any;\n metricColumnSegment: any;\n selectMenu: any[] = [];\n selectParts: SqlPart[][] = [[]];\n groupParts: SqlPart[] = [];\n whereParts: SqlPart[] = [];\n groupAdd: any;\n\n /** @ngInject */\n constructor(\n $scope: any,\n $injector: auto.IInjectorService,\n private templateSrv: TemplateSrv,\n private uiSegmentSrv: any\n ) {\n super($scope, $injector);\n this.target = this.target;\n this.queryModel = new PostgresQueryModel(this.target, templateSrv, this.panel.scopedVars);\n this.metaBuilder = new PostgresMetaQuery(this.target, this.queryModel);\n this.updateProjection();\n\n this.formats = [\n { text: 'Time series', value: 'time_series' },\n { text: 'Table', value: 'table' },\n ];\n\n if (!this.target.rawSql) {\n // special handling when in table panel\n if (this.panelCtrl.panel.type === 'table') {\n this.target.format = 'table';\n this.target.rawSql = 'SELECT 1';\n this.target.rawQuery = true;\n } else {\n this.target.rawSql = defaultQuery;\n this.datasource.metricFindQuery(this.metaBuilder.findMetricTable()).then((result: any) => {\n if (result.length > 0) {\n this.target.table = result[0].text;\n let segment = this.uiSegmentSrv.newSegment(this.target.table);\n this.tableSegment.html = segment.html;\n this.tableSegment.value = segment.value;\n\n this.target.timeColumn = result[1].text;\n segment = this.uiSegmentSrv.newSegment(this.target.timeColumn);\n this.timeColumnSegment.html = segment.html;\n this.timeColumnSegment.value = segment.value;\n\n this.target.timeColumnType = 'timestamp';\n this.target.select = [[{ type: 'column', params: [result[2].text] }]];\n this.updateProjection();\n this.updateRawSqlAndRefresh();\n }\n });\n }\n }\n\n if (!this.target.table) {\n this.tableSegment = uiSegmentSrv.newSegment({ value: 'select table', fake: true });\n } else {\n this.tableSegment = uiSegmentSrv.newSegment(this.target.table);\n }\n\n this.timeColumnSegment = uiSegmentSrv.newSegment(this.target.timeColumn);\n this.metricColumnSegment = uiSegmentSrv.newSegment(this.target.metricColumn);\n\n this.buildSelectMenu();\n this.whereAdd = this.uiSegmentSrv.newPlusButton();\n this.groupAdd = this.uiSegmentSrv.newPlusButton();\n\n this.panelCtrl.events.on(PanelEvents.dataReceived, this.onDataReceived.bind(this), $scope);\n this.panelCtrl.events.on(PanelEvents.dataError, this.onDataError.bind(this), $scope);\n }\n\n updateRawSqlAndRefresh() {\n if (!this.target.rawQuery) {\n this.target.rawSql = this.queryModel.buildQuery();\n }\n\n this.panelCtrl.refresh();\n }\n\n updateProjection() {\n this.selectParts = map(this.target.select, (parts: any) => {\n return map(parts, sqlPart.create).filter((n) => n);\n });\n this.whereParts = map(this.target.where, sqlPart.create).filter((n) => n);\n this.groupParts = map(this.target.group, sqlPart.create).filter((n) => n);\n }\n\n updatePersistedParts() {\n this.target.select = map(this.selectParts, (selectParts) => {\n return map(selectParts, (part: any) => {\n return { type: part.def.type, datatype: part.datatype, params: part.params };\n });\n });\n this.target.where = map(this.whereParts, (part: any) => {\n return { type: part.def.type, datatype: part.datatype, name: part.name, params: part.params };\n });\n this.target.group = map(this.groupParts, (part: any) => {\n return { type: part.def.type, datatype: part.datatype, params: part.params };\n });\n }\n\n buildSelectMenu() {\n this.selectMenu = [];\n const aggregates = {\n text: 'Aggregate Functions',\n value: 'aggregate',\n submenu: [\n { text: 'Average', value: 'avg' },\n { text: 'Count', value: 'count' },\n { text: 'Maximum', value: 'max' },\n { text: 'Minimum', value: 'min' },\n { text: 'Sum', value: 'sum' },\n { text: 'Standard deviation', value: 'stddev' },\n { text: 'Variance', value: 'variance' },\n ],\n };\n\n // first and last aggregate are timescaledb specific\n if (this.datasource.jsonData.timescaledb === true) {\n aggregates.submenu.push({ text: 'First', value: 'first' });\n aggregates.submenu.push({ text: 'Last', value: 'last' });\n }\n\n this.selectMenu.push(aggregates);\n\n // ordered set aggregates require postgres 9.4+\n if (this.datasource.jsonData.postgresVersion >= 904) {\n const aggregates2 = {\n text: 'Ordered-Set Aggregate Functions',\n value: 'percentile',\n submenu: [\n { text: 'Percentile (continuous)', value: 'percentile_cont' },\n { text: 'Percentile (discrete)', value: 'percentile_disc' },\n ],\n };\n this.selectMenu.push(aggregates2);\n }\n\n const windows = {\n text: 'Window Functions',\n value: 'window',\n submenu: [\n { text: 'Delta', value: 'delta' },\n { text: 'Increase', value: 'increase' },\n { text: 'Rate', value: 'rate' },\n { text: 'Sum', value: 'sum' },\n { text: 'Moving Average', value: 'avg', type: 'moving_window' },\n ],\n };\n this.selectMenu.push(windows);\n\n this.selectMenu.push({ text: 'Alias', value: 'alias' });\n this.selectMenu.push({ text: 'Column', value: 'column' });\n }\n\n toggleEditorMode() {\n if (this.target.rawQuery) {\n appEvents.publish(\n new ShowConfirmModalEvent({\n title: 'Warning',\n text2: 'Switching to query builder may overwrite your raw SQL.',\n icon: 'exclamation-triangle',\n yesText: 'Switch',\n onConfirm: () => {\n // This could be called from React, so wrap in $evalAsync.\n // Will then either run as part of the current digest cycle or trigger a new one.\n this.$scope.$evalAsync(() => {\n this.target.rawQuery = !this.target.rawQuery;\n });\n },\n })\n );\n } else {\n // This could be called from React, so wrap in $evalAsync.\n // Will then either run as part of the current digest cycle or trigger a new one.\n this.$scope.$evalAsync(() => {\n this.target.rawQuery = !this.target.rawQuery;\n });\n }\n }\n\n resetPlusButton(button: { html: any; value: any; type: any; fake: any }) {\n const plusButton = this.uiSegmentSrv.newPlusButton();\n button.html = plusButton.html;\n button.value = plusButton.value;\n button.type = plusButton.type;\n button.fake = plusButton.fake;\n }\n\n getTableSegments() {\n return this.datasource\n .metricFindQuery(this.metaBuilder.buildTableQuery())\n .then(this.transformToSegments({}))\n .catch(this.handleQueryError.bind(this));\n }\n\n tableChanged() {\n this.target.table = this.tableSegment.value;\n this.target.where = [];\n this.target.group = [];\n this.updateProjection();\n\n const segment = this.uiSegmentSrv.newSegment('none');\n this.metricColumnSegment.html = segment.html;\n this.metricColumnSegment.value = segment.value;\n this.target.metricColumn = 'none';\n\n const task1 = this.datasource.metricFindQuery(this.metaBuilder.buildColumnQuery('time')).then((result: any) => {\n // check if time column is still valid\n if (result.length > 0 && !find(result, (r: any) => r.text === this.target.timeColumn)) {\n const segment = this.uiSegmentSrv.newSegment(result[0].text);\n this.timeColumnSegment.html = segment.html;\n this.timeColumnSegment.value = segment.value;\n }\n return this.timeColumnChanged(false);\n });\n const task2 = this.datasource.metricFindQuery(this.metaBuilder.buildColumnQuery('value')).then((result: any) => {\n if (result.length > 0) {\n this.target.select = [[{ type: 'column', params: [result[0].text] }]];\n this.updateProjection();\n }\n });\n\n Promise.all([task1, task2]).then(() => {\n this.updateRawSqlAndRefresh();\n });\n }\n\n getTimeColumnSegments() {\n return this.datasource\n .metricFindQuery(this.metaBuilder.buildColumnQuery('time'))\n .then(this.transformToSegments({}))\n .catch(this.handleQueryError.bind(this));\n }\n\n timeColumnChanged(refresh?: boolean) {\n this.target.timeColumn = this.timeColumnSegment.value;\n return this.datasource\n .metricFindQuery(this.metaBuilder.buildDatatypeQuery(this.target.timeColumn))\n .then((result: any) => {\n if (result.length === 1) {\n if (this.target.timeColumnType !== result[0].text) {\n this.target.timeColumnType = result[0].text;\n }\n let partModel;\n if (this.queryModel.hasUnixEpochTimecolumn()) {\n partModel = sqlPart.create({ type: 'macro', name: '$__unixEpochFilter', params: [] });\n } else {\n partModel = sqlPart.create({ type: 'macro', name: '$__timeFilter', params: [] });\n }\n\n if (this.whereParts.length >= 1 && this.whereParts[0].def.type === 'macro') {\n // replace current macro\n this.whereParts[0] = partModel;\n } else {\n this.whereParts.splice(0, 0, partModel);\n }\n }\n\n this.updatePersistedParts();\n if (refresh !== false) {\n this.updateRawSqlAndRefresh();\n }\n });\n }\n\n getMetricColumnSegments() {\n return this.datasource\n .metricFindQuery(this.metaBuilder.buildColumnQuery('metric'))\n .then(this.transformToSegments({ addNone: true }))\n .catch(this.handleQueryError.bind(this));\n }\n\n metricColumnChanged() {\n this.target.metricColumn = this.metricColumnSegment.value;\n this.updateRawSqlAndRefresh();\n }\n\n onDataReceived(dataList: any) {\n this.lastQueryError = undefined;\n this.lastQueryMeta = dataList[0]?.meta;\n }\n\n onDataError(err: any) {\n if (err.data && err.data.results) {\n const queryRes = err.data.results[this.target.refId];\n if (queryRes) {\n this.lastQueryError = queryRes.error;\n }\n }\n }\n\n transformToSegments(config: { addNone?: any; addTemplateVars?: any; templateQuoter?: any }) {\n return (results: any) => {\n const segments = map(results, (segment) => {\n return this.uiSegmentSrv.newSegment({\n value: segment.text,\n expandable: segment.expandable,\n });\n });\n\n if (config.addTemplateVars) {\n for (const variable of this.templateSrv.getVariables()) {\n let value;\n value = '$' + variable.name;\n if (config.templateQuoter && ((variable as unknown) as VariableWithMultiSupport).multi === false) {\n value = config.templateQuoter(value);\n }\n\n segments.unshift(\n this.uiSegmentSrv.newSegment({\n type: 'template',\n value: value,\n expandable: true,\n })\n );\n }\n }\n\n if (config.addNone) {\n segments.unshift(this.uiSegmentSrv.newSegment({ type: 'template', value: 'none', expandable: true }));\n }\n\n return segments;\n };\n }\n\n findAggregateIndex(selectParts: any) {\n return findIndex(selectParts, (p: any) => p.def.type === 'aggregate' || p.def.type === 'percentile');\n }\n\n findWindowIndex(selectParts: any) {\n return findIndex(selectParts, (p: any) => p.def.type === 'window' || p.def.type === 'moving_window');\n }\n\n addSelectPart(selectParts: any[], item: { value: any }, subItem: { type: any; value: any }) {\n let partType = item.value;\n if (subItem && subItem.type) {\n partType = subItem.type;\n }\n let partModel = sqlPart.create({ type: partType });\n if (subItem) {\n partModel.params[0] = subItem.value;\n }\n let addAlias = false;\n\n switch (partType) {\n case 'column':\n const parts = map(selectParts, (part: any) => {\n return sqlPart.create({ type: part.def.type, params: clone(part.params) });\n });\n this.selectParts.push(parts);\n break;\n case 'percentile':\n case 'aggregate':\n // add group by if no group by yet\n if (this.target.group.length === 0) {\n this.addGroup('time', '$__interval');\n }\n const aggIndex = this.findAggregateIndex(selectParts);\n if (aggIndex !== -1) {\n // replace current aggregation\n selectParts[aggIndex] = partModel;\n } else {\n selectParts.splice(1, 0, partModel);\n }\n if (!find(selectParts, (p: any) => p.def.type === 'alias')) {\n addAlias = true;\n }\n break;\n case 'moving_window':\n case 'window':\n const windowIndex = this.findWindowIndex(selectParts);\n if (windowIndex !== -1) {\n // replace current window function\n selectParts[windowIndex] = partModel;\n } else {\n const aggIndex = this.findAggregateIndex(selectParts);\n if (aggIndex !== -1) {\n selectParts.splice(aggIndex + 1, 0, partModel);\n } else {\n selectParts.splice(1, 0, partModel);\n }\n }\n if (!find(selectParts, (p: any) => p.def.type === 'alias')) {\n addAlias = true;\n }\n break;\n case 'alias':\n addAlias = true;\n break;\n }\n\n if (addAlias) {\n // set initial alias name to column name\n partModel = sqlPart.create({ type: 'alias', params: [selectParts[0].params[0].replace(/\"/g, '')] });\n if (selectParts[selectParts.length - 1].def.type === 'alias') {\n selectParts[selectParts.length - 1] = partModel;\n } else {\n selectParts.push(partModel);\n }\n }\n\n this.updatePersistedParts();\n this.updateRawSqlAndRefresh();\n }\n\n removeSelectPart(selectParts: any, part: { def: { type: string } }) {\n if (part.def.type === 'column') {\n // remove all parts of column unless its last column\n if (this.selectParts.length > 1) {\n const modelsIndex = indexOf(this.selectParts, selectParts);\n this.selectParts.splice(modelsIndex, 1);\n }\n } else {\n const partIndex = indexOf(selectParts, part);\n selectParts.splice(partIndex, 1);\n }\n\n this.updatePersistedParts();\n }\n\n handleSelectPartEvent(selectParts: any, part: { def: any }, evt: { name: any }) {\n switch (evt.name) {\n case 'get-param-options': {\n switch (part.def.type) {\n case 'aggregate':\n return this.datasource\n .metricFindQuery(this.metaBuilder.buildAggregateQuery())\n .then(this.transformToSegments({}))\n .catch(this.handleQueryError.bind(this));\n case 'column':\n return this.datasource\n .metricFindQuery(this.metaBuilder.buildColumnQuery('value'))\n .then(this.transformToSegments({}))\n .catch(this.handleQueryError.bind(this));\n }\n }\n case 'part-param-changed': {\n this.updatePersistedParts();\n this.updateRawSqlAndRefresh();\n break;\n }\n case 'action': {\n this.removeSelectPart(selectParts, part);\n this.updateRawSqlAndRefresh();\n break;\n }\n case 'get-part-actions': {\n return Promise.resolve([{ text: 'Remove', value: 'remove-part' }]);\n }\n }\n }\n\n handleGroupPartEvent(part: any, index: any, evt: { name: any }) {\n switch (evt.name) {\n case 'get-param-options': {\n return this.datasource\n .metricFindQuery(this.metaBuilder.buildColumnQuery())\n .then(this.transformToSegments({}))\n .catch(this.handleQueryError.bind(this));\n }\n case 'part-param-changed': {\n this.updatePersistedParts();\n this.updateRawSqlAndRefresh();\n break;\n }\n case 'action': {\n this.removeGroup(part, index);\n this.updateRawSqlAndRefresh();\n break;\n }\n case 'get-part-actions': {\n return Promise.resolve([{ text: 'Remove', value: 'remove-part' }]);\n }\n }\n }\n\n addGroup(partType: string, value: string) {\n let params = [value];\n if (partType === 'time') {\n params = ['$__interval', 'none'];\n }\n const partModel = sqlPart.create({ type: partType, params: params });\n\n if (partType === 'time') {\n // put timeGroup at start\n this.groupParts.splice(0, 0, partModel);\n } else {\n this.groupParts.push(partModel);\n }\n\n // add aggregates when adding group by\n for (const selectParts of this.selectParts) {\n if (!selectParts.some((part) => part.def.type === 'aggregate')) {\n const aggregate = sqlPart.create({ type: 'aggregate', params: ['avg'] });\n selectParts.splice(1, 0, aggregate);\n if (!selectParts.some((part) => part.def.type === 'alias')) {\n const alias = sqlPart.create({ type: 'alias', params: [selectParts[0].part.params[0]] });\n selectParts.push(alias);\n }\n }\n }\n\n this.updatePersistedParts();\n }\n\n removeGroup(part: { def: { type: string } }, index: number) {\n if (part.def.type === 'time') {\n // remove aggregations\n this.selectParts = map(this.selectParts, (s: any) => {\n return filter(s, (part: any) => {\n if (part.def.type === 'aggregate' || part.def.type === 'percentile') {\n return false;\n }\n return true;\n });\n });\n }\n\n this.groupParts.splice(index, 1);\n this.updatePersistedParts();\n }\n\n handleWherePartEvent(whereParts: any, part: any, evt: any, index: any) {\n switch (evt.name) {\n case 'get-param-options': {\n switch (evt.param.name) {\n case 'left':\n return this.datasource\n .metricFindQuery(this.metaBuilder.buildColumnQuery())\n .then(this.transformToSegments({}))\n .catch(this.handleQueryError.bind(this));\n case 'right':\n if (['int4', 'int8', 'float4', 'float8', 'timestamp', 'timestamptz'].indexOf(part.datatype) > -1) {\n // don't do value lookups for numerical fields\n return Promise.resolve([]);\n } else {\n return this.datasource\n .metricFindQuery(this.metaBuilder.buildValueQuery(part.params[0]))\n .then(\n this.transformToSegments({\n addTemplateVars: true,\n templateQuoter: (v: string) => {\n return this.queryModel.quoteLiteral(v);\n },\n })\n )\n .catch(this.handleQueryError.bind(this));\n }\n case 'op':\n return Promise.resolve(this.uiSegmentSrv.newOperators(this.metaBuilder.getOperators(part.datatype)));\n default:\n return Promise.resolve([]);\n }\n }\n case 'part-param-changed': {\n this.updatePersistedParts();\n this.datasource.metricFindQuery(this.metaBuilder.buildDatatypeQuery(part.params[0])).then((d: any) => {\n if (d.length === 1) {\n part.datatype = d[0].text;\n }\n });\n this.updateRawSqlAndRefresh();\n break;\n }\n case 'action': {\n // remove element\n whereParts.splice(index, 1);\n this.updatePersistedParts();\n this.updateRawSqlAndRefresh();\n break;\n }\n case 'get-part-actions': {\n return Promise.resolve([{ text: 'Remove', value: 'remove-part' }]);\n }\n }\n }\n\n getWhereOptions() {\n const options = [];\n if (this.queryModel.hasUnixEpochTimecolumn()) {\n options.push(this.uiSegmentSrv.newSegment({ type: 'macro', value: '$__unixEpochFilter' }));\n } else {\n options.push(this.uiSegmentSrv.newSegment({ type: 'macro', value: '$__timeFilter' }));\n }\n options.push(this.uiSegmentSrv.newSegment({ type: 'expression', value: 'Expression' }));\n return Promise.resolve(options);\n }\n\n addWhereAction(part: any, index: any) {\n switch (this.whereAdd.type) {\n case 'macro': {\n const partModel = sqlPart.create({ type: 'macro', name: this.whereAdd.value, params: [] });\n if (this.whereParts.length >= 1 && this.whereParts[0].def.type === 'macro') {\n // replace current macro\n this.whereParts[0] = partModel;\n } else {\n this.whereParts.splice(0, 0, partModel);\n }\n break;\n }\n default: {\n this.whereParts.push(sqlPart.create({ type: 'expression', params: ['value', '=', 'value'] }));\n }\n }\n\n this.updatePersistedParts();\n this.resetPlusButton(this.whereAdd);\n this.updateRawSqlAndRefresh();\n }\n\n getGroupOptions() {\n return this.datasource\n .metricFindQuery(this.metaBuilder.buildColumnQuery('group'))\n .then((tags: any) => {\n const options = [];\n if (!this.queryModel.hasTimeGroup()) {\n options.push(this.uiSegmentSrv.newSegment({ type: 'time', value: 'time($__interval,none)' }));\n }\n for (const tag of tags) {\n options.push(this.uiSegmentSrv.newSegment({ type: 'column', value: tag.text }));\n }\n return options;\n })\n .catch(this.handleQueryError.bind(this));\n }\n\n addGroupAction() {\n this.addGroup(this.groupAdd.type, this.groupAdd.value);\n this.resetPlusButton(this.groupAdd);\n this.updateRawSqlAndRefresh();\n }\n\n handleQueryError(err: any): any[] {\n this.error = err.message || 'Failed to issue metric query';\n return [];\n }\n}\n","import { find } from 'lodash';\nimport {\n createChangeHandler,\n createResetHandler,\n PasswordFieldEnum,\n} from '../../../features/datasources/utils/passwordHandlers';\nimport DatasourceSrv from 'app/features/plugins/datasource_srv';\n\nexport class PostgresConfigCtrl {\n static templateUrl = 'partials/config.html';\n\n // Set through angular bindings\n declare current: any;\n\n datasourceSrv: any;\n showTimescaleDBHelp: boolean;\n onPasswordReset: ReturnType<typeof createResetHandler>;\n onPasswordChange: ReturnType<typeof createChangeHandler>;\n\n /** @ngInject */\n constructor($scope: any, datasourceSrv: DatasourceSrv) {\n this.current = $scope.ctrl.current;\n this.datasourceSrv = datasourceSrv;\n this.current.jsonData.sslmode = this.current.jsonData.sslmode || 'verify-full';\n this.current.jsonData.tlsConfigurationMethod = this.current.jsonData.tlsConfigurationMethod || 'file-path';\n this.current.jsonData.postgresVersion = this.current.jsonData.postgresVersion || 903;\n this.showTimescaleDBHelp = false;\n this.autoDetectFeatures();\n this.onPasswordReset = createResetHandler(this, PasswordFieldEnum.Password);\n this.onPasswordChange = createChangeHandler(this, PasswordFieldEnum.Password);\n this.tlsModeMapping();\n }\n\n autoDetectFeatures() {\n if (!this.current.id) {\n return;\n }\n\n this.datasourceSrv.loadDatasource(this.current.name).then((ds: any) => {\n return ds.getVersion().then((version: any) => {\n version = Number(version[0].text);\n\n // timescaledb is only available for 9.6+\n if (version >= 906) {\n ds.getTimescaleDBVersion().then((version: any) => {\n if (version.length === 1) {\n this.current.jsonData.timescaledb = true;\n }\n });\n }\n\n const major = Math.trunc(version / 100);\n const minor = version % 100;\n let name = String(major);\n if (version < 1000) {\n name = String(major) + '.' + String(minor);\n }\n if (!find(this.postgresVersions, (p: any) => p.value === version)) {\n this.postgresVersions.push({ name: name, value: version });\n }\n this.current.jsonData.postgresVersion = version;\n });\n });\n }\n\n toggleTimescaleDBHelp() {\n this.showTimescaleDBHelp = !this.showTimescaleDBHelp;\n }\n\n tlsModeMapping() {\n if (this.current.jsonData.sslmode === 'disable') {\n this.current.jsonData.tlsAuth = false;\n this.current.jsonData.tlsAuthWithCACert = false;\n this.current.jsonData.tlsSkipVerify = true;\n } else {\n this.current.jsonData.tlsAuth = true;\n this.current.jsonData.tlsAuthWithCACert = true;\n this.current.jsonData.tlsSkipVerify = false;\n }\n }\n\n // the value portion is derived from postgres server_version_num/100\n postgresVersions = [\n { name: '9.3', value: 903 },\n { name: '9.4', value: 904 },\n { name: '9.5', value: 905 },\n { name: '9.6', value: 906 },\n { name: '10', value: 1000 },\n { name: '11', value: 1100 },\n { name: '12+', value: 1200 },\n ];\n}\n","import { PostgresDatasource } from './datasource';\nimport { PostgresQueryCtrl } from './query_ctrl';\nimport { PostgresConfigCtrl } from './config_ctrl';\nimport { PostgresQuery } from './types';\nimport { DataSourcePlugin } from '@grafana/data';\n\nconst defaultQuery = `SELECT\n extract(epoch from time_column) AS time,\n text_column as text,\n tags_column as tags\nFROM\n metric_table\nWHERE\n $__timeFilter(time_column)\n`;\n\nclass PostgresAnnotationsQueryCtrl {\n static templateUrl = 'partials/annotations.editor.html';\n\n declare annotation: any;\n\n /** @ngInject */\n constructor($scope: any) {\n this.annotation = $scope.ctrl.annotation;\n this.annotation.rawQuery = this.annotation.rawQuery || defaultQuery;\n }\n}\n\nexport const plugin = new DataSourcePlugin<PostgresDatasource, PostgresQuery>(PostgresDatasource)\n .setQueryCtrl(PostgresQueryCtrl)\n .setConfigCtrl(PostgresConfigCtrl)\n .setAnnotationQueryCtrl(PostgresAnnotationsQueryCtrl);\n"],"names":["SqlPartDef","constructor","options","this","type","label","toUpperCase","substring","style","wrapOpen","wrapClose","separator","params","defaultParams","SqlPart","part","def","message","datatype","name","clone","updateParam","strValue","index","optional","splice","PasswordFieldEnum","createResetHandler","ctrl","field","event","preventDefault","current","undefined","secureJsonFields","secureJsonData","createChangeHandler","currentTarget","value","ResponseParser","transformMetricFindResponse","raw","frames","toDataQueryResponse","data","length","frame","values","textField","fields","find","f","valueField","i","push","text","get","flatMap","toArray","map","v","Array","from","Set","timeField","Error","timeEndField","tagsField","list","timeEnd","Math","floor","annotation","time","tags","trim","split","PostgresQueryModel","target","templateSrv","scopedVars","format","timeColumn","metricColumn","group","where","select","rawQuery","interpolateQueryStr","bind","unquoteIdentifier","replace","quoteIdentifier","String","quoteLiteral","escapeLiteral","hasTimeGroup","g","hasMetricColumn","variable","defaultFormatFn","multi","includeAll","join","render","interpolate","rawSql","buildQuery","hasUnixEpochTimecolumn","indexOf","timeColumnType","buildTimeColumn","alias","timeGroup","query","macro","args","buildMetricColumn","buildValueColumns","column","buildValueColumn","aggregate","windows","func","overParts","over","curr","prev","buildWhereClause","conditions","tag","buildGroupClause","groupSection","table","PostgresDatasource","DataSourceWithBackend","instanceSettings","getTemplateSrv","timeSrv","getTimeSrv","super","queryModel","_map","id","jsonData","responseParser","settingsData","interval","timeInterval","interpolateVariablesInQueries","queries","expandedQueries","datasource","getRef","interpolateVariable","filterQuery","hide","applyTemplateVariables","refId","Promise","reject","lastValueFrom","getBackendSrv","fetch","url","method","range","valueOf","toString","to","requestId","pipe","async","transformAnnotationResponse","res","metricFindQuery","optionalOptions","getSearchFilterScopedVar","wildcardChar","interpolatedQuery","timeRange","rsp","catchError","err","of","_metaRequest","getVersion","getTimescaleDBVersion","testDatasource","then","status","catch","toTestingStatus","targetContainsTemplate","variableExists","PostgresMetaQuery","getOperators","quoteIdentAsLiteral","findMetricTable","buildSchemaConstraint","buildTableConstraint","includes","parts","buildTableQuery","buildColumnQuery","buildValueQuery","buildDatatypeQuery","buildAggregateQuery","register","dynamicLookup","quote","create","PostgresQueryCtrl","QueryCtrl","$scope","$injector","uiSegmentSrv","panel","metaBuilder","updateProjection","formats","panelCtrl","result","segment","newSegment","tableSegment","html","timeColumnSegment","updateRawSqlAndRefresh","fake","metricColumnSegment","buildSelectMenu","whereAdd","newPlusButton","groupAdd","events","on","PanelEvents","onDataReceived","onDataError","refresh","selectParts","sqlPart","filter","n","whereParts","groupParts","updatePersistedParts","selectMenu","aggregates","submenu","timescaledb","postgresVersion","aggregates2","toggleEditorMode","appEvents","ShowConfirmModalEvent","title","text2","icon","yesText","onConfirm","$evalAsync","resetPlusButton","button","plusButton","getTableSegments","transformToSegments","handleQueryError","tableChanged","task1","r","timeColumnChanged","task2","all","getTimeColumnSegments","partModel","getMetricColumnSegments","addNone","metricColumnChanged","dataList","lastQueryError","lastQueryMeta","meta","results","queryRes","error","config","segments","expandable","addTemplateVars","getVariables","templateQuoter","unshift","findAggregateIndex","findIndex","p","findWindowIndex","addSelectPart","item","subItem","partType","addAlias","addGroup","aggIndex","windowIndex","removeSelectPart","modelsIndex","partIndex","handleSelectPartEvent","evt","resolve","handleGroupPartEvent","removeGroup","some","s","handleWherePartEvent","param","newOperators","d","getWhereOptions","addWhereAction","getGroupOptions","addGroupAction","PostgresConfigCtrl","datasourceSrv","sslmode","tlsConfigurationMethod","showTimescaleDBHelp","autoDetectFeatures","onPasswordReset","onPasswordChange","tlsModeMapping","loadDatasource","ds","version","Number","major","trunc","minor","postgresVersions","toggleTimescaleDBHelp","tlsAuth","tlsAuthWithCACert","tlsSkipVerify","PostgresAnnotationsQueryCtrl","plugin","DataSourcePlugin","setQueryCtrl","setConfigCtrl","setAnnotationQueryCtrl"],"sourceRoot":""}