{"version":3,"file":"postgresPlugin.0dfd49f78dc93c695e30.js","mappings":"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","sources":["webpack://grafana/./public/app/plugins/datasource/postgres/config_ctrl.ts","webpack://grafana/./public/app/plugins/datasource/postgres/postgres_query_model.ts","webpack://grafana/./public/app/plugins/datasource/postgres/response_parser.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/module.ts"],"sourcesContent":["import { find } from 'lodash';\n\nimport { DatasourceSrv } from 'app/features/plugins/datasource_srv';\n\nimport {\n  createChangeHandler,\n  createResetHandler,\n  PasswordFieldEnum,\n} from '../../../features/datasources/utils/passwordHandlers';\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 { find, map } from 'lodash';\n\nimport { ScopedVars } from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\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 { uniqBy } from 'lodash';\n\nimport { 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 uniqBy(values, 'text');\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 { map as _map } from 'lodash';\nimport { lastValueFrom, of } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\n\nimport { AnnotationEvent, DataSourceInstanceSettings, MetricFindValue, ScopedVars, TimeRange } from '@grafana/data';\nimport { BackendDataSourceResponse, DataSourceWithBackend, FetchResponse, getBackendSrv } from '@grafana/runtime';\nimport { toTestingStatus } from '@grafana/runtime/src/utils/queryResponse';\nimport { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_srv';\nimport PostgresQueryModel from 'app/plugins/datasource/postgres/postgres_query_model';\n\nimport { getSearchFilterScopedVar } from '../../../features/variables/utils';\n\nimport ResponseParser from './response_parser';\nimport { PostgresOptions, PostgresQuery, PostgresQueryForInterpolation } from './types';\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  ) {\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 = optionalOptions?.range as 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 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        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.containsTemplate(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    // quote_ident protects hyphenated schemes\n    const query = `\nquote_ident(table_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','numeric')\";\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: [],\n      baseOptions: ['avg', 'count', 'min', 'max', 'sum', 'stddev', 'variance'],\n      timescaleOptions: ['first', 'last'],\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 { auto } from 'angular';\nimport { clone, filter, find, findIndex, indexOf, map } from 'lodash';\n\nimport { PanelEvents, QueryResultMeta } from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\nimport { SqlPart } from 'app/angular/components/sql_part/sql_part';\nimport appEvents from 'app/core/app_events';\nimport { VariableWithMultiSupport } from 'app/features/variables/types';\nimport { QueryCtrl } from 'app/plugins/sdk';\nimport { ShowConfirmModalEvent } from 'app/types/events';\n\nimport { PostgresMetaQuery } from './meta_query';\nimport PostgresQueryModel from './postgres_query_model';\nimport sqlPart from './sql_part';\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  timescaleAggCheck() {\n    const aggIndex = this.findAggregateIndex(this.selectParts[0]);\n\n    // add or remove TimescaleDB aggregate functions as needed\n    if (aggIndex !== -1) {\n      const baseOpts = this.selectParts[0][aggIndex].def.params[0].baseOptions;\n      const timescaleOpts = baseOpts.concat(this.selectParts[0][aggIndex].def.params[0].timescaleOptions);\n\n      if (this.datasource.jsonData.timescaledb === true) {\n        this.selectParts[0][aggIndex].def.params[0].options = timescaleOpts;\n      } else {\n        this.selectParts[0][aggIndex].def.params[0].options = baseOpts;\n      }\n    }\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.timescaleAggCheck();\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.timescaleAggCheck();\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 { DataSourcePlugin } from '@grafana/data';\n\nimport { PostgresConfigCtrl } from './config_ctrl';\nimport { PostgresDatasource } from './datasource';\nimport { PostgresQueryCtrl } from './query_ctrl';\nimport { PostgresQuery } from './types';\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":["PostgresConfigCtrl","constructor","$scope","datasourceSrv","name","value","this","current","ctrl","jsonData","sslmode","tlsConfigurationMethod","postgresVersion","showTimescaleDBHelp","autoDetectFeatures","onPasswordReset","createResetHandler","PasswordFieldEnum","onPasswordChange","createChangeHandler","tlsModeMapping","id","loadDatasource","then","ds","getVersion","version","Number","text","getTimescaleDBVersion","length","timescaledb","major","Math","trunc","minor","String","find","postgresVersions","p","push","toggleTimescaleDBHelp","tlsAuth","tlsAuthWithCACert","tlsSkipVerify","PostgresQueryModel","target","templateSrv","scopedVars","format","timeColumn","metricColumn","group","where","type","params","select","rawQuery","interpolateQueryStr","bind","unquoteIdentifier","substring","replace","quoteIdentifier","quoteLiteral","escapeLiteral","hasTimeGroup","g","hasMetricColumn","variable","defaultFormatFn","multi","includeAll","map","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","index","buildGroupClause","groupSection","i","part","table","ResponseParser","transformMetricFindResponse","raw","frames","toDataQueryResponse","data","frame","values","textField","fields","f","valueField","get","flatMap","toArray","v","uniqBy","options","timeField","Error","timeEndField","tagsField","list","timeEnd","floor","undefined","annotation","time","tags","trim","split","PostgresDatasource","DataSourceWithBackend","instanceSettings","getTemplateSrv","super","queryModel","_map","responseParser","settingsData","interval","timeInterval","interpolateVariablesInQueries","queries","expandedQueries","datasource","getRef","interpolateVariable","filterQuery","hide","applyTemplateVariables","refId","Promise","reject","message","lastValueFrom","getBackendSrv","fetch","url","method","from","range","valueOf","toString","to","requestId","pipe","async","transformAnnotationResponse","res","metricFindQuery","optionalOptions","getSearchFilterScopedVar","wildcardChar","interpolatedQuery","rsp","catchError","err","of","_metaRequest","testDatasource","status","catch","toTestingStatus","targetContainsTemplate","containsTemplate","PostgresMetaQuery","getOperators","datatype","quoteIdentAsLiteral","findMetricTable","buildSchemaConstraint","buildTableConstraint","includes","parts","buildTableQuery","buildColumnQuery","buildValueQuery","buildDatatypeQuery","buildAggregateQuery","register","SqlPartDef","style","dynamicLookup","defaultParams","label","baseOptions","timescaleOptions","quote","create","def","SqlPart","PostgresQueryCtrl","QueryCtrl","$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","timescaleAggCheck","aggIndex","findAggregateIndex","selectParts","baseOpts","timescaleOpts","concat","sqlPart","filter","n","whereParts","groupParts","updatePersistedParts","selectMenu","aggregates","submenu","aggregates2","toggleEditorMode","appEvents","ShowConfirmModalEvent","title","text2","icon","yesText","onConfirm","$evalAsync","resetPlusButton","button","plusButton","getTableSegments","transformToSegments","handleQueryError","tableChanged","task1","r","timeColumnChanged","task2","all","getTimeColumnSegments","partModel","splice","getMetricColumnSegments","addNone","metricColumnChanged","dataList","lastQueryError","lastQueryMeta","meta","results","queryRes","error","config","segments","expandable","addTemplateVars","getVariables","templateQuoter","unshift","findIndex","findWindowIndex","addSelectPart","item","subItem","partType","addAlias","clone","addGroup","windowIndex","removeSelectPart","modelsIndex","partIndex","handleSelectPartEvent","evt","resolve","handleGroupPartEvent","removeGroup","some","s","handleWherePartEvent","param","newOperators","d","getWhereOptions","addWhereAction","getGroupOptions","addGroupAction","PostgresAnnotationsQueryCtrl","plugin","DataSourcePlugin","setQueryCtrl","setConfigCtrl","setAnnotationQueryCtrl"],"sourceRoot":""}