{"version":3,"file":"influxdbPlugin.69303f977072ce0f941c.js","mappings":"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","sources":["webpack://grafana/./public/app/plugins/datasource/influxdb/constants.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/types.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/ConfigEditor.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/InfluxCheatSheet.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/InfluxStartPage.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/query_part.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/influx_query_model.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/queryUtils.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/FluxQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/QueryEditorModeSwitcher.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/constants.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/useShadowedState.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/RawInfluxQLEditor.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/query_builder.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/influxQLMetadataQuery.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/styles.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/unwrap.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/FormatAsSection.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/Seg.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/toSelectableValue.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/FromSection.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/InputSection.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/OrderByTimeSection.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/AddButton.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/PartListSection.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/tagUtils.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/TagsSection.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/partListUtils.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VisualInfluxQLEditor/Editor.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/VariableQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/components/AnnotationEditor.tsx","webpack://grafana/./public/app/plugins/datasource/influxdb/influx_series.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/migrations.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/response_parser.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/datasource.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/module.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/QueryEditor.tsx"],"sourcesContent":["export const BROWSER_MODE_DISABLED_MESSAGE =\n 'Direct browser access in the InfluxDB datasource is no longer available. Switch to server access mode.';\n","import { DataQuery, DataSourceJsonData, AdHocVariableFilter } from '@grafana/data';\n\nexport enum InfluxVersion {\n InfluxQL = 'InfluxQL',\n Flux = 'Flux',\n}\n\nexport interface InfluxOptions extends DataSourceJsonData {\n version?: InfluxVersion;\n\n timeInterval?: string;\n httpMode?: string;\n\n // With Flux\n organization?: string;\n defaultBucket?: string;\n maxSeries?: number;\n}\n\nexport interface InfluxSecureJsonData {\n // For Flux\n token?: string;\n\n // In 1x a different password can be sent than then HTTP auth\n password?: string;\n}\n\nexport interface InfluxQueryPart {\n type: string;\n params?: Array<string | number>;\n // FIXME: `interval` does not seem to be used.\n // check all the influxdb parts (query-generation etc.),\n // if it is really so, and if yes, remove it\n interval?: string;\n}\n\nexport interface InfluxQueryTag {\n key: string;\n operator?: string;\n condition?: string;\n value: string;\n}\n\nexport type ResultFormat = 'time_series' | 'table' | 'logs';\n\nexport interface InfluxQuery extends DataQuery {\n policy?: string;\n measurement?: string;\n resultFormat?: ResultFormat;\n orderByTime?: string;\n tags?: InfluxQueryTag[];\n groupBy?: InfluxQueryPart[];\n select?: InfluxQueryPart[][];\n limit?: string | number;\n slimit?: string | number;\n tz?: string;\n // NOTE: `fill` is not used in the query-editor anymore, and is removed\n // if any change happens in the query-editor. the query-generation still\n // supports it for now.\n fill?: string;\n rawQuery?: boolean;\n query?: string;\n alias?: string;\n // for migrated InfluxQL annotations\n queryType?: string;\n fromAnnotations?: boolean;\n tagsColumn?: string;\n textColumn?: string;\n timeEndColumn?: string;\n titleColumn?: string;\n name?: string;\n textEditor?: boolean;\n adhocFilters?: AdHocVariableFilter[];\n}\n","import { uniqueId } from 'lodash';\nimport React, { PureComponent } from 'react';\n\nimport {\n DataSourcePluginOptionsEditorProps,\n SelectableValue,\n onUpdateDatasourceOption,\n updateDatasourcePluginResetOption,\n onUpdateDatasourceJsonDataOption,\n onUpdateDatasourceJsonDataOptionSelect,\n onUpdateDatasourceSecureJsonDataOption,\n updateDatasourcePluginJsonDataOption,\n} from '@grafana/data';\nimport { Alert, DataSourceHttpSettings, InfoBox, InlineField, InlineFormLabel, LegacyForms, Select } from '@grafana/ui';\n\nconst { Input, SecretFormField } = LegacyForms;\nimport { BROWSER_MODE_DISABLED_MESSAGE } from '../constants';\nimport { InfluxOptions, InfluxSecureJsonData, InfluxVersion } from '../types';\n\nconst httpModes: SelectableValue[] = [\n { label: 'GET', value: 'GET' },\n { label: 'POST', value: 'POST' },\n];\n\nconst versions: Array<SelectableValue<InfluxVersion>> = [\n {\n label: 'InfluxQL',\n value: InfluxVersion.InfluxQL,\n description: 'The InfluxDB SQL-like query language.',\n },\n {\n label: 'Flux',\n value: InfluxVersion.Flux,\n description: 'Advanced data scripting and query language. Supported in InfluxDB 2.x and 1.8+',\n },\n];\n\nexport type Props = DataSourcePluginOptionsEditorProps<InfluxOptions>;\ntype State = {\n maxSeries: string | undefined;\n};\n\nexport class ConfigEditor extends PureComponent<Props, State> {\n state = {\n maxSeries: '',\n };\n\n htmlPrefix: string;\n\n constructor(props: Props) {\n super(props);\n this.state.maxSeries = props.options.jsonData.maxSeries?.toString() || '';\n this.htmlPrefix = uniqueId('influxdb-config');\n }\n\n // 1x\n onResetPassword = () => {\n updateDatasourcePluginResetOption(this.props, 'password');\n };\n\n // 2x\n onResetToken = () => {\n updateDatasourcePluginResetOption(this.props, 'token');\n };\n\n onVersionChanged = (selected: SelectableValue<InfluxVersion>) => {\n const { options, onOptionsChange } = this.props;\n\n const copy: any = {\n ...options,\n jsonData: {\n ...options.jsonData,\n version: selected.value,\n },\n };\n if (selected.value === InfluxVersion.Flux) {\n copy.access = 'proxy';\n copy.basicAuth = true;\n copy.jsonData.httpMode = 'POST';\n\n // Remove old 1x configs\n delete copy.user;\n delete copy.database;\n }\n\n onOptionsChange(copy);\n };\n\n renderInflux2x() {\n const { options } = this.props;\n const { secureJsonFields } = options;\n const secureJsonData = (options.secureJsonData || {}) as InfluxSecureJsonData;\n const { htmlPrefix } = this;\n\n return (\n <>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel htmlFor={`${htmlPrefix}-org`} className=\"width-10\">\n Organization\n </InlineFormLabel>\n <div className=\"width-10\">\n <Input\n id={`${htmlPrefix}-org`}\n className=\"width-20\"\n value={options.jsonData.organization || ''}\n onChange={onUpdateDatasourceJsonDataOption(this.props, 'organization')}\n />\n </div>\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <SecretFormField\n isConfigured={Boolean(secureJsonFields && secureJsonFields.token)}\n value={secureJsonData.token || ''}\n label=\"Token\"\n aria-label=\"Token\"\n labelWidth={10}\n inputWidth={20}\n onReset={this.onResetToken}\n onChange={onUpdateDatasourceSecureJsonDataOption(this.props, 'token')}\n />\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel className=\"width-10\">Default Bucket</InlineFormLabel>\n <div className=\"width-10\">\n <Input\n className=\"width-20\"\n placeholder=\"default bucket\"\n value={options.jsonData.defaultBucket || ''}\n onChange={onUpdateDatasourceJsonDataOption(this.props, 'defaultBucket')}\n />\n </div>\n </div>\n </div>\n\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel\n className=\"width-10\"\n tooltip=\"A lower limit for the auto group by time interval. Recommended to be set to write frequency,\n\t\t\t\tfor example 1m if your data is written every minute.\"\n >\n Min time interval\n </InlineFormLabel>\n <div className=\"width-10\">\n <Input\n className=\"width-10\"\n placeholder=\"10s\"\n value={options.jsonData.timeInterval || ''}\n onChange={onUpdateDatasourceJsonDataOption(this.props, 'timeInterval')}\n />\n </div>\n </div>\n </div>\n </>\n );\n }\n\n renderInflux1x() {\n const { options } = this.props;\n const { secureJsonFields } = options;\n const secureJsonData = (options.secureJsonData || {}) as InfluxSecureJsonData;\n const { htmlPrefix } = this;\n\n return (\n <>\n <InfoBox>\n <h5>Database Access</h5>\n <p>\n Setting the database for this datasource does not deny access to other databases. The InfluxDB query syntax\n allows switching the database in the query. For example:\n <code>SHOW MEASUREMENTS ON _internal</code> or\n <code>SELECT * FROM "_internal".."database" LIMIT 10</code>\n <br />\n <br />\n To support data isolation and security, make sure appropriate permissions are configured in InfluxDB.\n </p>\n </InfoBox>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel htmlFor={`${htmlPrefix}-db`} className=\"width-10\">\n Database\n </InlineFormLabel>\n <div className=\"width-20\">\n <Input\n id={`${htmlPrefix}-db`}\n className=\"width-20\"\n value={options.database || ''}\n onChange={onUpdateDatasourceOption(this.props, 'database')}\n />\n </div>\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel htmlFor={`${htmlPrefix}-user`} className=\"width-10\">\n User\n </InlineFormLabel>\n <div className=\"width-10\">\n <Input\n id={`${htmlPrefix}-user`}\n className=\"width-20\"\n value={options.user || ''}\n onChange={onUpdateDatasourceOption(this.props, 'user')}\n />\n </div>\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <SecretFormField\n isConfigured={Boolean(secureJsonFields && secureJsonFields.password)}\n value={secureJsonData.password || ''}\n label=\"Password\"\n aria-label=\"Password\"\n labelWidth={10}\n inputWidth={20}\n onReset={this.onResetPassword}\n onChange={onUpdateDatasourceSecureJsonDataOption(this.props, 'password')}\n />\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel\n htmlFor={`${htmlPrefix}-http-method`}\n className=\"width-10\"\n tooltip=\"You can use either GET or POST HTTP method to query your InfluxDB database. The POST\n method allows you to perform heavy requests (with a lots of WHERE clause) while the GET method\n will restrict you and return an error if the query is too large.\"\n >\n HTTP Method\n </InlineFormLabel>\n <Select\n inputId={`${htmlPrefix}-http-method`}\n className=\"width-10\"\n value={httpModes.find((httpMode) => httpMode.value === options.jsonData.httpMode)}\n options={httpModes}\n defaultValue={options.jsonData.httpMode}\n onChange={onUpdateDatasourceJsonDataOptionSelect(this.props, 'httpMode')}\n />\n </div>\n </div>\n\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel\n className=\"width-10\"\n tooltip=\"A lower limit for the auto group by time interval. Recommended to be set to write frequency,\n\t\t\t\tfor example 1m if your data is written every minute.\"\n >\n Min time interval\n </InlineFormLabel>\n <div className=\"width-10\">\n <Input\n className=\"width-10\"\n placeholder=\"10s\"\n value={options.jsonData.timeInterval || ''}\n onChange={onUpdateDatasourceJsonDataOption(this.props, 'timeInterval')}\n />\n </div>\n </div>\n </div>\n </>\n );\n }\n\n render() {\n const { options, onOptionsChange } = this.props;\n const isDirectAccess = options.access === 'direct';\n\n return (\n <>\n <h3 className=\"page-heading\">Query Language</h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <Select\n aria-label=\"Query language\"\n className=\"width-30\"\n value={options.jsonData.version === InfluxVersion.Flux ? versions[1] : versions[0]}\n options={versions}\n defaultValue={versions[0]}\n onChange={this.onVersionChanged}\n />\n </div>\n </div>\n </div>\n\n {options.jsonData.version === InfluxVersion.Flux && (\n <InfoBox>\n <h5>Support for Flux in Grafana is currently in beta</h5>\n <p>\n Please report any issues to: <br />\n <a href=\"https://github.com/grafana/grafana/issues/new/choose\">\n https://github.com/grafana/grafana/issues\n </a>\n </p>\n </InfoBox>\n )}\n\n {isDirectAccess && (\n <Alert title=\"Error\" severity=\"error\">\n {BROWSER_MODE_DISABLED_MESSAGE}\n </Alert>\n )}\n\n <DataSourceHttpSettings\n showAccessOptions={isDirectAccess}\n dataSourceConfig={options}\n defaultUrl=\"http://localhost:8086\"\n onChange={onOptionsChange}\n />\n\n <div className=\"gf-form-group\">\n <div>\n <h3 className=\"page-heading\">InfluxDB Details</h3>\n </div>\n {options.jsonData.version === InfluxVersion.Flux ? this.renderInflux2x() : this.renderInflux1x()}\n <div className=\"gf-form-inline\">\n <InlineField\n labelWidth={20}\n label=\"Max series\"\n tooltip=\"Limit the number of series/tables that Grafana will process. Lower this number to prevent abuse, and increase it if you have lots of small time series and not all are shown. Defaults to 1000.\"\n >\n <Input\n placeholder=\"1000\"\n type=\"number\"\n className=\"width-10\"\n value={this.state.maxSeries}\n onChange={(event) => {\n // We duplicate this state so that we allow to write freely inside the input. We don't have\n // any influence over saving so this seems to be only way to do this.\n this.setState({ maxSeries: event.currentTarget.value });\n const val = parseInt(event.currentTarget.value, 10);\n updateDatasourcePluginJsonDataOption(this.props, 'maxSeries', Number.isFinite(val) ? val : undefined);\n }}\n />\n </InlineField>\n </div>\n </div>\n </>\n );\n }\n}\n\nexport default ConfigEditor;\n","import React from 'react';\n\nconst CHEAT_SHEET_ITEMS = [\n {\n title: 'Getting started',\n label:\n 'Start by selecting a measurement and field from the dropdown above. You can then use the tag selector to further narrow your search.',\n },\n];\n\nconst InfluxCheatSheet = (props: any) => (\n <div>\n <h2>InfluxDB Cheat Sheet</h2>\n {CHEAT_SHEET_ITEMS.map((item) => (\n <div className=\"cheat-sheet-item\" key={item.title}>\n <div className=\"cheat-sheet-item__title\">{item.title}</div>\n <div className=\"cheat-sheet-item__label\">{item.label}</div>\n </div>\n ))}\n </div>\n);\n\nexport default InfluxCheatSheet;\n","import React, { PureComponent } from 'react';\n\nimport { QueryEditorHelpProps } from '@grafana/data';\n\nimport InfluxCheatSheet from './InfluxCheatSheet';\n\nexport default class InfluxStartPage extends PureComponent<QueryEditorHelpProps> {\n render() {\n return <InfluxCheatSheet onClickExample={this.props.onClickExample} />;\n }\n}\n","import { map, clone } from 'lodash';\n\nimport { QueryPartDef, QueryPart, functionRenderer, suffixRenderer } from 'app/features/alerting/state/query_part';\n\nconst index: any[] = [];\nconst categories: any = {\n Aggregations: [],\n Selectors: [],\n Transformations: [],\n Predictors: [],\n Math: [],\n Aliasing: [],\n Fields: [],\n};\n\nfunction createPart(part: any): any {\n const def = index[part.type];\n if (!def) {\n throw { message: 'Could not find query part ' + part.type };\n }\n\n return new QueryPart(part, def);\n}\n\nfunction register(options: any) {\n index[options.type] = new QueryPartDef(options);\n options.category.push(index[options.type]);\n}\n\nconst groupByTimeFunctions: any[] = [];\n\nfunction aliasRenderer(part: { params: string[] }, innerExpr: string) {\n return innerExpr + ' AS ' + '\"' + part.params[0] + '\"';\n}\n\nfunction fieldRenderer(part: { params: string[] }, innerExpr: any) {\n if (part.params[0] === '*') {\n return '*';\n }\n return '\"' + part.params[0] + '\"';\n}\n\nfunction replaceAggregationAddStrategy(selectParts: any[], partModel: { def: { type: string } }) {\n // look for existing aggregation\n for (let i = 0; i < selectParts.length; i++) {\n const part = selectParts[i];\n if (part.def.category === categories.Aggregations) {\n if (part.def.type === partModel.def.type) {\n return;\n }\n // count distinct is allowed\n if (part.def.type === 'count' && partModel.def.type === 'distinct') {\n break;\n }\n // remove next aggregation if distinct was replaced\n if (part.def.type === 'distinct') {\n const morePartsAvailable = selectParts.length >= i + 2;\n if (partModel.def.type !== 'count' && morePartsAvailable) {\n const nextPart = selectParts[i + 1];\n if (nextPart.def.category === categories.Aggregations) {\n selectParts.splice(i + 1, 1);\n }\n } else if (partModel.def.type === 'count') {\n if (!morePartsAvailable || selectParts[i + 1].def.type !== 'count') {\n selectParts.splice(i + 1, 0, partModel);\n }\n return;\n }\n }\n selectParts[i] = partModel;\n return;\n }\n if (part.def.category === categories.Selectors) {\n selectParts[i] = partModel;\n return;\n }\n }\n\n selectParts.splice(1, 0, partModel);\n}\n\nfunction addTransformationStrategy(selectParts: any[], partModel: any) {\n let i;\n // look for index to add transformation\n for (i = 0; i < selectParts.length; i++) {\n const part = selectParts[i];\n if (part.def.category === categories.Math || part.def.category === categories.Aliasing) {\n break;\n }\n }\n\n selectParts.splice(i, 0, partModel);\n}\n\nfunction addMathStrategy(selectParts: any[], partModel: any) {\n const partCount = selectParts.length;\n if (partCount > 0) {\n // if last is math, replace it\n if (selectParts[partCount - 1].def.type === 'math') {\n selectParts[partCount - 1] = partModel;\n return;\n }\n // if next to last is math, replace it\n if (partCount > 1 && selectParts[partCount - 2].def.type === 'math') {\n selectParts[partCount - 2] = partModel;\n return;\n } else if (selectParts[partCount - 1].def.type === 'alias') {\n // if last is alias add it before\n selectParts.splice(partCount - 1, 0, partModel);\n return;\n }\n }\n selectParts.push(partModel);\n}\n\nfunction addAliasStrategy(selectParts: any[], partModel: any) {\n const partCount = selectParts.length;\n if (partCount > 0) {\n // if last is alias, replace it\n if (selectParts[partCount - 1].def.type === 'alias') {\n selectParts[partCount - 1] = partModel;\n return;\n }\n }\n selectParts.push(partModel);\n}\n\nfunction addFieldStrategy(selectParts: any, partModel: any, query: { selectModels: any[][] }) {\n // copy all parts\n const parts = map(selectParts, (part: any) => {\n return createPart({ type: part.def.type, params: clone(part.params) });\n });\n\n query.selectModels.push(parts);\n}\n\nregister({\n type: 'field',\n addStrategy: addFieldStrategy,\n category: categories.Fields,\n params: [{ type: 'field', dynamicLookup: true }],\n defaultParams: ['value'],\n renderer: fieldRenderer,\n});\n\n// Aggregations\nregister({\n type: 'count',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'distinct',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'integral',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'mean',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'median',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'mode',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'sum',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Aggregations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\n// transformations\n\nregister({\n type: 'derivative',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [\n {\n name: 'duration',\n type: 'interval',\n options: ['1s', '10s', '1m', '5m', '10m', '15m', '1h'],\n },\n ],\n defaultParams: ['10s'],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'spread',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'non_negative_derivative',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [\n {\n name: 'duration',\n type: 'interval',\n options: ['1s', '10s', '1m', '5m', '10m', '15m', '1h'],\n },\n ],\n defaultParams: ['10s'],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'difference',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'non_negative_difference',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'moving_average',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [{ name: 'window', type: 'int', options: [5, 10, 20, 30, 40] }],\n defaultParams: [10],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'cumulative_sum',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'stddev',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'time',\n category: groupByTimeFunctions,\n params: [\n {\n name: 'interval',\n type: 'time',\n options: ['$__interval', '1s', '10s', '1m', '5m', '10m', '15m', '1h'],\n },\n ],\n defaultParams: ['$__interval'],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'fill',\n category: groupByTimeFunctions,\n params: [\n {\n name: 'fill',\n type: 'string',\n options: ['none', 'null', '0', 'previous', 'linear'],\n },\n ],\n defaultParams: ['null'],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'elapsed',\n addStrategy: addTransformationStrategy,\n category: categories.Transformations,\n params: [\n {\n name: 'duration',\n type: 'interval',\n options: ['1s', '10s', '1m', '5m', '10m', '15m', '1h'],\n },\n ],\n defaultParams: ['10s'],\n renderer: functionRenderer,\n});\n\n// predictions\nregister({\n type: 'holt_winters',\n addStrategy: addTransformationStrategy,\n category: categories.Predictors,\n params: [\n { name: 'number', type: 'int', options: [5, 10, 20, 30, 40] },\n { name: 'season', type: 'int', options: [0, 1, 2, 5, 10] },\n ],\n defaultParams: [10, 2],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'holt_winters_with_fit',\n addStrategy: addTransformationStrategy,\n category: categories.Predictors,\n params: [\n { name: 'number', type: 'int', options: [5, 10, 20, 30, 40] },\n { name: 'season', type: 'int', options: [0, 1, 2, 5, 10] },\n ],\n defaultParams: [10, 2],\n renderer: functionRenderer,\n});\n\n// Selectors\nregister({\n type: 'bottom',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [{ name: 'count', type: 'int' }],\n defaultParams: [3],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'first',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'last',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'max',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'min',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [],\n defaultParams: [],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'percentile',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [{ name: 'nth', type: 'int' }],\n defaultParams: [95],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'top',\n addStrategy: replaceAggregationAddStrategy,\n category: categories.Selectors,\n params: [{ name: 'count', type: 'int' }],\n defaultParams: [3],\n renderer: functionRenderer,\n});\n\nregister({\n type: 'tag',\n category: groupByTimeFunctions,\n params: [{ name: 'tag', type: 'string', dynamicLookup: true }],\n defaultParams: ['tag'],\n renderer: fieldRenderer,\n});\n\nregister({\n type: 'math',\n addStrategy: addMathStrategy,\n category: categories.Math,\n params: [{ name: 'expr', type: 'string' }],\n defaultParams: [' / 100'],\n renderer: suffixRenderer,\n});\n\nregister({\n type: 'alias',\n addStrategy: addAliasStrategy,\n category: categories.Aliasing,\n params: [{ name: 'name', type: 'string', quote: 'double' }],\n defaultParams: ['alias'],\n renderMode: 'suffix',\n renderer: aliasRenderer,\n});\n\nexport default {\n create: createPart,\n getCategories: () => {\n return categories;\n },\n replaceAggregationAdd: replaceAggregationAddStrategy,\n};\n","import { map, find, filter, indexOf } from 'lodash';\n\nimport { ScopedVars } from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\nimport kbn from 'app/core/utils/kbn';\n\nimport queryPart from './query_part';\nimport { InfluxQuery, InfluxQueryTag } from './types';\n\nexport default class InfluxQueryModel {\n target: InfluxQuery;\n selectModels: any[] = [];\n queryBuilder: any;\n groupByParts: any;\n templateSrv: any;\n scopedVars: any;\n refId?: string;\n\n /** @ngInject */\n constructor(target: InfluxQuery, templateSrv?: TemplateSrv, scopedVars?: ScopedVars) {\n this.target = target;\n this.templateSrv = templateSrv;\n this.scopedVars = scopedVars;\n\n target.policy = target.policy || 'default';\n target.resultFormat = target.resultFormat || 'time_series';\n target.orderByTime = target.orderByTime || 'ASC';\n target.tags = target.tags || [];\n target.groupBy = target.groupBy || [\n { type: 'time', params: ['$__interval'] },\n { type: 'fill', params: ['null'] },\n ];\n target.select = target.select || [\n [\n { type: 'field', params: ['value'] },\n { type: 'mean', params: [] },\n ],\n ];\n\n this.updateProjection();\n }\n\n updateProjection() {\n this.selectModels = map(this.target.select, (parts: any) => {\n return map(parts, queryPart.create);\n });\n this.groupByParts = map(this.target.groupBy, queryPart.create);\n }\n\n updatePersistedParts() {\n this.target.select = map(this.selectModels, (selectParts) => {\n return map(selectParts, (part: any) => {\n return { type: part.def.type, params: part.params };\n });\n });\n }\n\n hasGroupByTime() {\n return find(this.target.groupBy, (g: any) => g.type === 'time');\n }\n\n hasFill() {\n return find(this.target.groupBy, (g: any) => g.type === 'fill');\n }\n\n addGroupBy(value: string) {\n let stringParts = value.match(/^(\\w+)\\((.*)\\)$/);\n\n if (!stringParts || !this.target.groupBy) {\n return;\n }\n\n const typePart = stringParts[1];\n const arg = stringParts[2];\n const partModel = queryPart.create({ type: typePart, params: [arg] });\n const partCount = this.target.groupBy.length;\n\n if (partCount === 0) {\n this.target.groupBy.push(partModel.part);\n } else if (typePart === 'time') {\n this.target.groupBy.splice(0, 0, partModel.part);\n } else if (typePart === 'tag') {\n if (this.target.groupBy[partCount - 1].type === 'fill') {\n this.target.groupBy.splice(partCount - 1, 0, partModel.part);\n } else {\n this.target.groupBy.push(partModel.part);\n }\n } else {\n this.target.groupBy.push(partModel.part);\n }\n\n this.updateProjection();\n }\n\n removeGroupByPart(part: { def: { type: string } }, index: number) {\n const categories = queryPart.getCategories();\n\n if (part.def.type === 'time') {\n // remove fill\n this.target.groupBy = filter(this.target.groupBy, (g: any) => g.type !== 'fill');\n // remove aggregations\n this.target.select = map(this.target.select, (s: any) => {\n return filter(s, (part: any) => {\n const partModel = queryPart.create(part);\n if (partModel.def.category === categories.Aggregations) {\n return false;\n }\n if (partModel.def.category === categories.Selectors) {\n return false;\n }\n return true;\n });\n });\n }\n\n this.target.groupBy!.splice(index, 1);\n this.updateProjection();\n }\n\n removeSelect(index: number) {\n this.target.select!.splice(index, 1);\n this.updateProjection();\n }\n\n removeSelectPart(selectParts: any[], part: any) {\n // if we remove the field remove the whole statement\n if (part.def.type === 'field') {\n if (this.selectModels.length > 1) {\n const modelsIndex = indexOf(this.selectModels, selectParts);\n this.selectModels.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 addSelectPart(selectParts: any[], type: string) {\n const partModel = queryPart.create({ type: type });\n partModel.def.addStrategy(selectParts, partModel, this);\n this.updatePersistedParts();\n }\n\n private renderTagCondition(tag: InfluxQueryTag, index: number, interpolate?: boolean) {\n // FIXME: merge this function with query_builder/renderTagCondition\n let str = '';\n let operator = tag.operator;\n let value = tag.value;\n if (index > 0) {\n str = (tag.condition || 'AND') + ' ';\n }\n\n if (!operator) {\n if (/^\\/.*\\/$/.test(value)) {\n operator = '=~';\n } else {\n operator = '=';\n }\n }\n\n // quote value unless regex\n if (operator !== '=~' && operator !== '!~') {\n if (interpolate) {\n value = this.templateSrv.replace(value, this.scopedVars);\n }\n if (operator !== '>' && operator !== '<') {\n value = \"'\" + value.replace(/\\\\/g, '\\\\\\\\').replace(/\\'/g, \"\\\\'\") + \"'\";\n }\n } else if (interpolate) {\n value = this.templateSrv.replace(value, this.scopedVars, 'regex');\n }\n\n return str + '\"' + tag.key + '\" ' + operator + ' ' + value;\n }\n\n getMeasurementAndPolicy(interpolate: any) {\n let policy = this.target.policy;\n let measurement = this.target.measurement || 'measurement';\n\n if (!measurement.match('^/.*/$')) {\n measurement = '\"' + measurement + '\"';\n } else if (interpolate) {\n measurement = this.templateSrv.replace(measurement, this.scopedVars, 'regex');\n }\n\n if (policy !== 'default') {\n policy = '\"' + this.target.policy + '\".';\n } else {\n policy = '';\n }\n\n return policy + measurement;\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 value;\n }\n\n if (typeof value === 'string') {\n return kbn.regexEscape(value);\n }\n\n const escapedValues = map(value, kbn.regexEscape);\n return '(' + escapedValues.join('|') + ')';\n }\n\n render(interpolate?: boolean) {\n const target = this.target;\n\n if (target.rawQuery) {\n if (interpolate) {\n return this.templateSrv.replace(target.query, this.scopedVars, this.interpolateQueryStr);\n } else {\n return target.query;\n }\n }\n\n let query = 'SELECT ';\n let i, y;\n for (i = 0; i < this.selectModels.length; i++) {\n const parts = this.selectModels[i];\n let selectText = '';\n for (y = 0; y < parts.length; y++) {\n const part = parts[y];\n selectText = part.render(selectText);\n }\n\n if (i > 0) {\n query += ', ';\n }\n query += selectText;\n }\n\n query += ' FROM ' + this.getMeasurementAndPolicy(interpolate) + ' WHERE ';\n const conditions = map(target.tags, (tag, index) => {\n return this.renderTagCondition(tag, index, interpolate);\n });\n\n if (conditions.length > 0) {\n query += '(' + conditions.join(' ') + ') AND ';\n }\n\n query += '$timeFilter';\n\n let groupBySection = '';\n for (i = 0; i < this.groupByParts.length; i++) {\n const part = this.groupByParts[i];\n if (i > 0) {\n // for some reason fill has no separator\n groupBySection += part.def.type === 'fill' ? ' ' : ', ';\n }\n groupBySection += part.render('');\n }\n\n if (groupBySection.length) {\n query += ' GROUP BY ' + groupBySection;\n }\n\n if (target.fill) {\n query += ' fill(' + target.fill + ')';\n }\n\n if (target.orderByTime === 'DESC') {\n query += ' ORDER BY time DESC';\n }\n\n if (target.limit) {\n query += ' LIMIT ' + target.limit;\n }\n\n if (target.slimit) {\n query += ' SLIMIT ' + target.slimit;\n }\n\n if (target.tz) {\n query += \" tz('\" + target.tz + \"')\";\n }\n\n return query;\n }\n\n renderAdhocFilters(filters: any[]) {\n const conditions = map(filters, (tag, index) => {\n return this.renderTagCondition(tag, index, true);\n });\n return conditions.join(' ');\n }\n}\n","import { cloneDeep } from 'lodash';\n\nimport InfluxQueryModel from './influx_query_model';\nimport { InfluxQuery } from './types';\n\n// FIXME: these functions are a beginning of a refactoring of influx_query_model.ts\n// into a simpler approach with full typescript types.\n// later we should be able to migrate the unit-tests\n// that relate to these functions here, and then perhaps even move the implementation\n// to this place\n\nexport function buildRawQuery(query: InfluxQuery): string {\n const queryCopy = cloneDeep(query); // the query-model mutates the query\n const model = new InfluxQueryModel(queryCopy);\n return model.render(false);\n}\n\nexport function normalizeQuery(query: InfluxQuery): InfluxQuery {\n // we return the original query if there is no need to update it\n if (\n query.policy !== undefined &&\n query.resultFormat !== undefined &&\n query.orderByTime !== undefined &&\n query.tags !== undefined &&\n query.groupBy !== undefined &&\n query.select !== undefined\n ) {\n return query;\n }\n\n // FIXME: we should move the whole normalizeQuery logic here,\n // and then have influxQueryModel call this function,\n // to concentrate the whole logic here\n\n const queryCopy = cloneDeep(query); // the query-model mutates the query\n return new InfluxQueryModel(queryCopy).target;\n}\n\nexport function addNewSelectPart(query: InfluxQuery, type: string, index: number): InfluxQuery {\n const queryCopy = cloneDeep(query); // the query-model mutates the query\n const model = new InfluxQueryModel(queryCopy);\n model.addSelectPart(model.selectModels[index], type);\n return model.target;\n}\n\nexport function removeSelectPart(query: InfluxQuery, partIndex: number, index: number): InfluxQuery {\n const queryCopy = cloneDeep(query); // the query-model mutates the query\n const model = new InfluxQueryModel(queryCopy);\n const selectModel = model.selectModels[index];\n model.removeSelectPart(selectModel, selectModel[partIndex]);\n return model.target;\n}\n\nexport function changeSelectPart(\n query: InfluxQuery,\n listIndex: number,\n partIndex: number,\n newParams: string[]\n): InfluxQuery {\n // we need to make shallow copy of `query.select` down to `query.select[listIndex][partIndex]`\n const newSel = [...(query.select ?? [])];\n newSel[listIndex] = [...newSel[listIndex]];\n newSel[listIndex][partIndex] = {\n ...newSel[listIndex][partIndex],\n params: newParams,\n };\n return { ...query, select: newSel };\n}\n\nexport function addNewGroupByPart(query: InfluxQuery, type: string): InfluxQuery {\n const queryCopy = cloneDeep(query); // the query-model mutates the query\n const model = new InfluxQueryModel(queryCopy);\n model.addGroupBy(type);\n return model.target;\n}\n\nexport function removeGroupByPart(query: InfluxQuery, partIndex: number): InfluxQuery {\n const queryCopy = cloneDeep(query); // the query-model mutates the query\n const model = new InfluxQueryModel(queryCopy);\n model.removeGroupByPart(model.groupByParts[partIndex], partIndex);\n return model.target;\n}\n\nexport function changeGroupByPart(query: InfluxQuery, partIndex: number, newParams: string[]): InfluxQuery {\n // we need to make shallow copy of `query.groupBy` down to `query.groupBy[partIndex]`\n const newGroupBy = [...(query.groupBy ?? [])];\n newGroupBy[partIndex] = {\n ...newGroupBy[partIndex],\n params: newParams,\n };\n return { ...query, groupBy: newGroupBy };\n}\n","import { cx, css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport { SelectableValue, GrafanaTheme2 } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport {\n InlineFormLabel,\n LinkButton,\n Segment,\n CodeEditor,\n MonacoEditor,\n CodeEditorSuggestionItem,\n CodeEditorSuggestionItemKind,\n withTheme2,\n Themeable2,\n} from '@grafana/ui';\n\nimport InfluxDatasource from '../datasource';\nimport { InfluxQuery } from '../types';\n\ninterface Props extends Themeable2 {\n onChange: (query: InfluxQuery) => void;\n onRunQuery: () => void;\n query: InfluxQuery;\n // `datasource` is not used internally, but this component is used at some places\n // directly, where the `datasource` prop has to exist. later, when the whole\n // query-editor gets converted to react we can stop using this component directly\n // and then we can probably remove the datasource attribute.\n datasource: InfluxDatasource;\n}\n\nconst samples: Array<SelectableValue<string>> = [\n { label: 'Show buckets', description: 'List the available buckets (table)', value: 'buckets()' },\n {\n label: 'Simple query',\n description: 'filter by measurement and field',\n value: `from(bucket: \"db/rp\")\n |> range(start: v.timeRangeStart, stop:v.timeRangeStop)\n |> filter(fn: (r) =>\n r._measurement == \"example-measurement\" and\n r._field == \"example-field\"\n )`,\n },\n {\n label: 'Grouped Query',\n description: 'Group by (min/max/sum/median)',\n value: `// v.windowPeriod is a variable referring to the current optimized window period (currently: $interval)\nfrom(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"measurement1\" or r[\"_measurement\"] =~ /^.*?regex.*$/)\n |> filter(fn: (r) => r[\"_field\"] == \"field2\" or r[\"_field\"] =~ /^.*?regex.*$/)\n |> aggregateWindow(every: v.windowPeriod, fn: mean|median|max|count|derivative|sum)\n |> yield(name: \"some-name\")`,\n },\n {\n label: 'Filter by value',\n description: 'Results between a min/max',\n value: `// v.bucket, v.timeRangeStart, and v.timeRange stop are all variables supported by the flux plugin and influxdb\nfrom(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_value\"] >= 10 and r[\"_value\"] <= 20)`,\n },\n {\n label: 'Schema Exploration: (measurements)',\n description: 'Get a list of measurement using flux',\n value: `import \"influxdata/influxdb/v1\"\nv1.measurements(bucket: v.bucket)`,\n },\n {\n label: 'Schema Exploration: (fields)',\n description: 'Return every possible key in a single table',\n value: `from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop:v.timeRangeStop)\n |> keys()\n |> keep(columns: [\"_value\"])\n |> group()\n |> distinct()`,\n },\n {\n label: 'Schema Exploration: (tag keys)',\n description: 'Get a list of tag keys using flux',\n value: `import \"influxdata/influxdb/v1\"\nv1.tagKeys(bucket: v.bucket)`,\n },\n {\n label: 'Schema Exploration: (tag values)',\n description: 'Get a list of tag values using flux',\n value: `import \"influxdata/influxdb/v1\"\nv1.tagValues(\n bucket: v.bucket,\n tag: \"host\",\n predicate: (r) => true,\n start: -1d\n)`,\n },\n];\n\nclass UnthemedFluxQueryEditor extends PureComponent<Props> {\n onFluxQueryChange = (query: string) => {\n this.props.onChange({ ...this.props.query, query });\n this.props.onRunQuery();\n };\n\n onSampleChange = (val: SelectableValue<string>) => {\n this.props.onChange({\n ...this.props.query,\n query: val.value!,\n });\n\n // Angular HACK: Since the target does not actually change!\n this.forceUpdate();\n this.props.onRunQuery();\n };\n\n getSuggestions = (): CodeEditorSuggestionItem[] => {\n const sugs: CodeEditorSuggestionItem[] = [\n {\n label: 'v.timeRangeStart',\n kind: CodeEditorSuggestionItemKind.Property,\n detail: 'The start time',\n },\n {\n label: 'v.timeRangeStop',\n kind: CodeEditorSuggestionItemKind.Property,\n detail: 'The stop time',\n },\n {\n label: 'v.windowPeriod',\n kind: CodeEditorSuggestionItemKind.Property,\n detail: 'based on max data points',\n },\n {\n label: 'v.defaultBucket',\n kind: CodeEditorSuggestionItemKind.Property,\n detail: 'bucket configured in the datsource',\n },\n {\n label: 'v.organization',\n kind: CodeEditorSuggestionItemKind.Property,\n detail: 'org configured for the datsource',\n },\n ];\n\n const templateSrv = getTemplateSrv();\n templateSrv.getVariables().forEach((variable) => {\n const label = '${' + variable.name + '}';\n let val = templateSrv.replace(label);\n if (val === label) {\n val = '';\n }\n sugs.push({\n label,\n kind: CodeEditorSuggestionItemKind.Text,\n detail: `(Template Variable) ${val}`,\n });\n });\n\n return sugs;\n };\n\n // For some reason in angular, when this component gets re-mounted, the width\n // is not set properly. This forces the layout shortly after mount so that it\n // displays OK. Note: this is not an issue when used directly in react\n editorDidMountCallbackHack = (editor: MonacoEditor) => {\n setTimeout(() => editor.layout(), 100);\n };\n\n render() {\n const { query, theme } = this.props;\n const styles = getStyles(theme);\n\n const helpTooltip = (\n <div>\n Type: <i>ctrl+space</i> to show template variable suggestions <br />\n Many queries can be copied from Chronograf\n </div>\n );\n\n return (\n <>\n <CodeEditor\n height={'100%'}\n containerStyles={styles.editorContainerStyles}\n language=\"sql\"\n value={query.query || ''}\n onBlur={this.onFluxQueryChange}\n onSave={this.onFluxQueryChange}\n showMiniMap={false}\n showLineNumbers={true}\n getSuggestions={this.getSuggestions}\n onEditorDidMount={this.editorDidMountCallbackHack}\n />\n <div className={cx('gf-form-inline', styles.editorActions)}>\n <LinkButton\n icon=\"external-link-alt\"\n variant=\"secondary\"\n target=\"blank\"\n href=\"https://docs.influxdata.com/influxdb/latest/query-data/get-started/\"\n >\n Flux language syntax\n </LinkButton>\n <Segment options={samples} value=\"Sample Query\" onChange={this.onSampleChange} />\n <div className=\"gf-form gf-form--grow\">\n <div className=\"gf-form-label gf-form-label--grow\"></div>\n </div>\n <InlineFormLabel width={5} tooltip={helpTooltip}>\n Help\n </InlineFormLabel>\n </div>\n </>\n );\n }\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n editorContainerStyles: css`\n height: 200px;\n max-width: 100%;\n resize: vertical;\n overflow: auto;\n background-color: ${theme.isDark ? theme.colors.background.canvas : theme.colors.background.primary};\n padding-bottom: ${theme.spacing(1)};\n `,\n editorActions: css`\n margin-top: 6px;\n `,\n});\n\nexport const FluxQueryEditor = withTheme2(UnthemedFluxQueryEditor);\n","import React, { useEffect, useState } from 'react';\n\nimport { Button, ConfirmModal } from '@grafana/ui';\n\ntype Props = {\n isRaw: boolean;\n onChange: (newIsRaw: boolean) => void;\n};\n\nexport const QueryEditorModeSwitcher = ({ isRaw, onChange }: Props): JSX.Element => {\n const [isModalOpen, setModalOpen] = useState(false);\n\n useEffect(() => {\n // if the isRaw changes, we hide the modal\n setModalOpen(false);\n }, [isRaw]);\n\n if (isRaw) {\n return (\n <>\n <Button\n aria-label=\"Switch to visual editor\"\n icon=\"pen\"\n variant=\"secondary\"\n type=\"button\"\n onClick={() => {\n // we show the are-you-sure modal\n setModalOpen(true);\n }}\n ></Button>\n <ConfirmModal\n isOpen={isModalOpen}\n title=\"Switch to visual editor mode\"\n body=\"Are you sure to switch to visual editor mode? You will lose the changes done in raw query mode.\"\n confirmText=\"Yes, switch to editor mode\"\n dismissText=\"No, stay in raw query mode\"\n onConfirm={() => {\n onChange(false);\n }}\n onDismiss={() => {\n setModalOpen(false);\n }}\n />\n </>\n );\n } else {\n return (\n <Button\n aria-label=\"Switch to text editor\"\n icon=\"pen\"\n variant=\"secondary\"\n type=\"button\"\n onClick={() => {\n onChange(true);\n }}\n ></Button>\n );\n }\n};\n","import { SelectableValue } from '@grafana/data';\n\nimport { ResultFormat } from '../types';\n\nexport const RESULT_FORMATS: Array<SelectableValue<ResultFormat>> = [\n { label: 'Time series', value: 'time_series' },\n { label: 'Table', value: 'table' },\n { label: 'Logs', value: 'logs' },\n];\n\nexport const DEFAULT_RESULT_FORMAT: ResultFormat = 'time_series';\n","import { useState, useEffect } from 'react';\nimport { usePrevious } from 'react-use';\n\nexport function useShadowedState<T>(outsideVal: T): [T, (newVal: T) => void] {\n const [currentVal, setCurrentVal] = useState(outsideVal);\n const prevOutsideVal = usePrevious(outsideVal);\n\n useEffect(() => {\n const isOutsideValChanged = prevOutsideVal !== outsideVal;\n // if the value changes from the outside, we accept it into the state\n // (we only set it if it is different from the current value)\n if (isOutsideValChanged && currentVal !== outsideVal) {\n setCurrentVal(outsideVal);\n }\n }, [outsideVal, currentVal, prevOutsideVal]);\n\n return [currentVal, setCurrentVal];\n}\n","import React from 'react';\n\nimport { TextArea, InlineFormLabel, Input, Select, HorizontalGroup } from '@grafana/ui';\n\nimport { InfluxQuery } from '../types';\n\nimport { RESULT_FORMATS, DEFAULT_RESULT_FORMAT } from './constants';\nimport { useShadowedState } from './useShadowedState';\nimport { useUniqueId } from './useUniqueId';\n\ntype Props = {\n query: InfluxQuery;\n onChange: (query: InfluxQuery) => void;\n onRunQuery: () => void;\n};\n\n// we handle 3 fields: \"query\", \"alias\", \"resultFormat\"\n// \"resultFormat\" changes are applied immediately\n// \"query\" and \"alias\" changes only happen on onblur\nexport const RawInfluxQLEditor = ({ query, onChange, onRunQuery }: Props): JSX.Element => {\n const [currentQuery, setCurrentQuery] = useShadowedState(query.query);\n const [currentAlias, setCurrentAlias] = useShadowedState(query.alias);\n const aliasElementId = useUniqueId();\n const selectElementId = useUniqueId();\n\n const resultFormat = query.resultFormat ?? DEFAULT_RESULT_FORMAT;\n\n const applyDelayedChangesAndRunQuery = () => {\n onChange({\n ...query,\n query: currentQuery,\n alias: currentAlias,\n resultFormat,\n });\n onRunQuery();\n };\n\n return (\n <div>\n <TextArea\n aria-label=\"query\"\n rows={3}\n spellCheck={false}\n placeholder=\"InfluxDB Query\"\n onBlur={applyDelayedChangesAndRunQuery}\n onChange={(e) => {\n setCurrentQuery(e.currentTarget.value);\n }}\n value={currentQuery ?? ''}\n />\n <HorizontalGroup>\n <InlineFormLabel htmlFor={selectElementId}>Format as</InlineFormLabel>\n <Select\n inputId={selectElementId}\n onChange={(v) => {\n onChange({ ...query, resultFormat: v.value });\n onRunQuery();\n }}\n value={resultFormat}\n options={RESULT_FORMATS}\n />\n <InlineFormLabel htmlFor={aliasElementId}>Alias by</InlineFormLabel>\n <Input\n id={aliasElementId}\n type=\"text\"\n spellCheck={false}\n placeholder=\"Naming pattern\"\n onBlur={applyDelayedChangesAndRunQuery}\n onChange={(e) => {\n setCurrentAlias(e.currentTarget.value);\n }}\n value={currentAlias ?? ''}\n />\n </HorizontalGroup>\n </div>\n );\n};\n","import { reduce } from 'lodash';\n\nimport kbn from 'app/core/utils/kbn';\n\nfunction renderTagCondition(tag: { operator: any; value: string; condition: any; key: string }, index: number) {\n // FIXME: merge this function with influx_query_model/renderTagCondition\n let str = '';\n let operator = tag.operator;\n let value = tag.value;\n if (index > 0) {\n str = (tag.condition || 'AND') + ' ';\n }\n\n if (!operator) {\n if (/^\\/.*\\/$/.test(tag.value)) {\n operator = '=~';\n } else {\n operator = '=';\n }\n }\n\n // quote value unless regex or empty-string\n // Influx versions before 0.13 had inconsistent requirements on if (numeric) tags are quoted or not.\n if (value === '' || (operator !== '=~' && operator !== '!~')) {\n value = \"'\" + value.replace(/\\\\/g, '\\\\\\\\').replace(/\\'/g, \"\\\\'\") + \"'\";\n }\n\n return str + '\"' + tag.key + '\" ' + operator + ' ' + value;\n}\n\nexport class InfluxQueryBuilder {\n constructor(private target: { measurement: any; tags: any; policy?: any }, private database?: string) {}\n\n buildExploreQuery(type: string, withKey?: string, withMeasurementFilter?: string): string {\n let query = '';\n let measurement;\n let policy;\n\n if (type === 'TAG_KEYS') {\n query = 'SHOW TAG KEYS';\n measurement = this.target.measurement;\n policy = this.target.policy;\n } else if (type === 'TAG_VALUES') {\n query = 'SHOW TAG VALUES';\n measurement = this.target.measurement;\n policy = this.target.policy;\n } else if (type === 'MEASUREMENTS') {\n query = 'SHOW MEASUREMENTS';\n if (withMeasurementFilter) {\n // we do a case-insensitive regex-based lookup\n query += ' WITH MEASUREMENT =~ /(?i)' + kbn.regexEscape(withMeasurementFilter) + '/';\n }\n } else if (type === 'FIELDS') {\n measurement = this.target.measurement;\n policy = this.target.policy;\n\n if (!measurement.match('^/.*/')) {\n measurement = '\"' + measurement + '\"';\n\n if (policy && policy !== 'default') {\n policy = '\"' + policy + '\"';\n measurement = policy + '.' + measurement;\n }\n }\n\n return 'SHOW FIELD KEYS FROM ' + measurement;\n } else if (type === 'RETENTION POLICIES') {\n query = 'SHOW RETENTION POLICIES on \"' + this.database + '\"';\n return query;\n }\n\n if (measurement) {\n if (!measurement.match('^/.*/') && !measurement.match(/^merge\\(.*\\)/)) {\n measurement = '\"' + measurement + '\"';\n }\n\n if (policy && policy !== 'default') {\n policy = '\"' + policy + '\"';\n measurement = policy + '.' + measurement;\n }\n\n query += ' FROM ' + measurement;\n }\n\n if (withKey) {\n query += ' WITH KEY = \"' + withKey + '\"';\n }\n\n if (this.target.tags && this.target.tags.length > 0) {\n const whereConditions = reduce(\n this.target.tags,\n (memo, tag) => {\n // do not add a condition for the key we want to explore for\n if (tag.key === withKey) {\n return memo;\n }\n\n // value operators not supported in these types of queries\n if (tag.operator === '>' || tag.operator === '<') {\n return memo;\n }\n\n memo.push(renderTagCondition(tag, memo.length));\n return memo;\n },\n [] as string[]\n );\n\n if (whereConditions.length > 0) {\n query += ' WHERE ' + whereConditions.join(' ');\n }\n }\n\n if (type === 'MEASUREMENTS') {\n query += ' LIMIT 100';\n //Solve issue #2524 by limiting the number of measurements returned\n //LIMIT must be after WITH MEASUREMENT and WHERE clauses\n //This also could be used for TAG KEYS and TAG VALUES, if desired\n }\n\n return query;\n }\n}\n","import InfluxDatasource from './datasource';\nimport { InfluxQueryBuilder } from './query_builder';\nimport { InfluxQueryTag } from './types';\n\nconst runExploreQuery = (\n type: string,\n withKey: string | undefined,\n withMeasurementFilter: string | undefined,\n target: { measurement: string | undefined; tags: InfluxQueryTag[]; policy: string | undefined },\n datasource: InfluxDatasource\n): Promise<Array<{ text: string }>> => {\n const builder = new InfluxQueryBuilder(target, datasource.database);\n const q = builder.buildExploreQuery(type, withKey, withMeasurementFilter);\n return datasource.metricFindQuery(q);\n};\n\nexport async function getAllPolicies(datasource: InfluxDatasource): Promise<string[]> {\n const target = { tags: [], measurement: undefined, policy: undefined };\n const data = await runExploreQuery('RETENTION POLICIES', undefined, undefined, target, datasource);\n return data.map((item) => item.text);\n}\n\nexport async function getAllMeasurementsForTags(\n measurementFilter: string | undefined,\n tags: InfluxQueryTag[],\n datasource: InfluxDatasource\n): Promise<string[]> {\n const target = { tags, measurement: undefined, policy: undefined };\n const data = await runExploreQuery('MEASUREMENTS', undefined, measurementFilter, target, datasource);\n return data.map((item) => item.text);\n}\n\nexport async function getTagKeysForMeasurementAndTags(\n measurement: string | undefined,\n policy: string | undefined,\n tags: InfluxQueryTag[],\n datasource: InfluxDatasource\n): Promise<string[]> {\n const target = { tags, measurement, policy };\n const data = await runExploreQuery('TAG_KEYS', undefined, undefined, target, datasource);\n return data.map((item) => item.text);\n}\n\nexport async function getTagValues(\n tagKey: string,\n measurement: string | undefined,\n policy: string | undefined,\n tags: InfluxQueryTag[],\n datasource: InfluxDatasource\n): Promise<string[]> {\n const target = { tags, measurement, policy };\n const data = await runExploreQuery('TAG_VALUES', tagKey, undefined, target, datasource);\n return data.map((item) => item.text);\n}\n\nexport async function getFieldKeysForMeasurement(\n measurement: string,\n policy: string | undefined,\n datasource: InfluxDatasource\n): Promise<string[]> {\n const target = { tags: [], measurement, policy };\n const data = await runExploreQuery('FIELDS', undefined, undefined, target, datasource);\n return data.map((item) => item.text);\n}\n","import { css } from '@emotion/css';\n\nexport const paddingRightClass = css({\n paddingRight: '4px',\n});\n","export function unwrap<T>(value: T | null | undefined): T {\n if (value == null) {\n throw new Error('value must not be nullish');\n }\n return value;\n}\n","import { cx } from '@emotion/css';\nimport React from 'react';\n\nimport { Select } from '@grafana/ui';\n\nimport { ResultFormat } from '../../types';\nimport { RESULT_FORMATS } from '../constants';\n\nimport { paddingRightClass } from './styles';\nimport { unwrap } from './unwrap';\n\ntype Props = {\n inputId?: string;\n format: ResultFormat;\n onChange: (newFormat: ResultFormat) => void;\n};\n\nconst className = cx('width-8', paddingRightClass);\n\nexport const FormatAsSection = ({ format, inputId, onChange }: Props): JSX.Element => {\n return (\n <Select<ResultFormat>\n inputId={inputId}\n className={className}\n onChange={(v) => {\n onChange(unwrap(v.value));\n }}\n value={format}\n options={RESULT_FORMATS}\n />\n );\n};\n","import { cx, css } from '@emotion/css';\nimport debouncePromise from 'debounce-promise';\nimport React, { useState, useEffect } from 'react';\nimport { useAsyncFn } from 'react-use';\n\nimport { SelectableValue } from '@grafana/data';\nimport { InlineLabel, Select, AsyncSelect, Input } from '@grafana/ui';\n\nimport { useShadowedState } from '../useShadowedState';\n\n// this file is a simpler version of `grafana-ui / SegmentAsync.tsx`\n// with some changes:\n// 1. click-outside does not select the value. i think it's better to be explicit here.\n// 2. we set a min-width on the select-element to handle cases where the `value`\n// is very short, like \"x\", and then you click on it and the select opens,\n// and it tries to be as short as \"x\" and it does not work well.\n\n// NOTE: maybe these changes could be migrated into the SegmentAsync later\n\ntype SelVal = SelectableValue<string>;\n\n// when allowCustomValue is true, there is no way to enforce the selectableValue\n// enum-type, so i just go with `string`\n\ntype LoadOptions = (filter: string) => Promise<SelVal[]>;\n\ntype Props = {\n value: string;\n buttonClassName?: string;\n loadOptions?: LoadOptions;\n // if filterByLoadOptions is false,\n // loadOptions is only executed once,\n // when the select-box opens,\n // and as you write, the list gets filtered\n // by the select-box.\n // if filterByLoadOptions is true,\n // as you write the loadOptions is executed again and again,\n // and it is relied on to filter the results.\n filterByLoadOptions?: boolean;\n onChange: (v: SelVal) => void;\n allowCustomValue?: boolean;\n};\n\nconst selectClass = css({\n minWidth: '160px',\n});\n\ntype SelProps = {\n loadOptions: LoadOptions;\n filterByLoadOptions?: boolean;\n onClose: () => void;\n onChange: (v: SelVal) => void;\n allowCustomValue?: boolean;\n};\n\ntype SelReloadProps = {\n loadOptions: (filter: string) => Promise<SelVal[]>;\n onClose: () => void;\n onChange: (v: SelVal) => void;\n allowCustomValue?: boolean;\n};\n\n// when a custom value is written into a select-box,\n// by default the new value is prefixed with \"Create:\",\n// and that sounds confusing because here we do not create\n// anything. we change this to just be the entered string.\nconst formatCreateLabel = (v: string) => v;\n\nconst SelReload = ({ loadOptions, allowCustomValue, onChange, onClose }: SelReloadProps): JSX.Element => {\n // here we rely on the fact that writing text into the <AsyncSelect/>\n // does not cause a re-render of the current react component.\n // this way there is only a single render-call,\n // so there is only a single `debouncedLoadOptions`.\n // if we want ot make this \"re-render safe,\n // we will have to put the debounced call into an useRef,\n // and probably have an useEffect\n const debouncedLoadOptions = debouncePromise(loadOptions, 1000, { leading: true });\n return (\n <div className={selectClass}>\n <AsyncSelect\n formatCreateLabel={formatCreateLabel}\n defaultOptions\n autoFocus\n isOpen\n onCloseMenu={onClose}\n allowCustomValue={allowCustomValue}\n loadOptions={debouncedLoadOptions}\n onChange={onChange}\n />\n </div>\n );\n};\n\ntype SelSingleLoadProps = {\n loadOptions: (filter: string) => Promise<SelVal[]>;\n onClose: () => void;\n onChange: (v: SelVal) => void;\n allowCustomValue?: boolean;\n};\n\nconst SelSingleLoad = ({ loadOptions, allowCustomValue, onChange, onClose }: SelSingleLoadProps): JSX.Element => {\n const [loadState, doLoad] = useAsyncFn(loadOptions, [loadOptions]);\n\n useEffect(() => {\n doLoad('');\n }, [doLoad, loadOptions]);\n\n return (\n <div className={selectClass}>\n <Select\n isLoading={loadState.loading}\n formatCreateLabel={formatCreateLabel}\n autoFocus\n isOpen={!loadState.loading}\n onCloseMenu={onClose}\n allowCustomValue={allowCustomValue}\n options={loadState.value ?? []}\n onChange={onChange}\n />\n </div>\n );\n};\n\nconst Sel = ({ loadOptions, filterByLoadOptions, allowCustomValue, onChange, onClose }: SelProps): JSX.Element => {\n // unfortunately <Segment/> and <SegmentAsync/> have somewhat different behavior,\n // so the simplest approach was to just create two separate wrapper-components\n return filterByLoadOptions ? (\n <SelReload loadOptions={loadOptions} allowCustomValue={allowCustomValue} onChange={onChange} onClose={onClose} />\n ) : (\n <SelSingleLoad\n loadOptions={loadOptions}\n allowCustomValue={allowCustomValue}\n onChange={onChange}\n onClose={onClose}\n />\n );\n};\n\ntype InpProps = {\n initialValue: string;\n onChange: (newVal: string) => void;\n onClose: () => void;\n};\n\nconst Inp = ({ initialValue, onChange, onClose }: InpProps): JSX.Element => {\n const [currentValue, setCurrentValue] = useShadowedState(initialValue);\n\n return (\n <Input\n autoFocus\n type=\"text\"\n spellCheck={false}\n onBlur={onClose}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onChange(currentValue);\n }\n }}\n onChange={(e) => {\n setCurrentValue(e.currentTarget.value);\n }}\n value={currentValue}\n />\n );\n};\n\nconst defaultButtonClass = css({\n width: 'auto',\n cursor: 'pointer',\n});\n\nexport const Seg = ({\n value,\n buttonClassName,\n loadOptions,\n filterByLoadOptions,\n allowCustomValue,\n onChange,\n}: Props): JSX.Element => {\n const [isOpen, setOpen] = useState(false);\n if (!isOpen) {\n const className = cx(defaultButtonClass, buttonClassName);\n return (\n <InlineLabel\n as=\"button\"\n className={className}\n onClick={() => {\n setOpen(true);\n }}\n >\n {value}\n </InlineLabel>\n );\n } else {\n if (loadOptions !== undefined) {\n return (\n <Sel\n loadOptions={loadOptions}\n filterByLoadOptions={filterByLoadOptions ?? false}\n allowCustomValue={allowCustomValue}\n onChange={(v) => {\n setOpen(false);\n onChange(v);\n }}\n onClose={() => {\n setOpen(false);\n }}\n />\n );\n } else {\n return (\n <Inp\n initialValue={value}\n onClose={() => {\n setOpen(false);\n }}\n onChange={(v) => {\n setOpen(false);\n onChange({ value: v, label: v });\n }}\n />\n );\n }\n }\n};\n","import { SelectableValue } from '@grafana/data';\n\nexport function toSelectableValue<T extends string>(t: T): SelectableValue<T> {\n return { label: t, value: t };\n}\n","import React from 'react';\n\nimport { Seg } from './Seg';\nimport { toSelectableValue } from './toSelectableValue';\n\nconst DEFAULT_POLICY = 'default';\n\n// we use the value \"default\" as a magic-value, it means\n// we use the default retention-policy.\n// unfortunately, IF the user has a retention-policy named \"default\",\n// and it is not the default-retention-policy in influxdb,\n// bad things will happen.\n// https://github.com/grafana/grafana/issues/4347 :-(\n// FIXME: we could maybe at least detect here that problem-is-happening,\n// and show an error message or something.\n// unfortunately, currently the ResponseParser does not return the\n// is-default info for the retention-policies, so that should change first.\n\ntype Props = {\n onChange: (policy: string | undefined, measurement: string | undefined) => void;\n policy: string | undefined;\n measurement: string | undefined;\n getPolicyOptions: () => Promise<string[]>;\n getMeasurementOptions: (filter: string) => Promise<string[]>;\n};\n\nexport const FromSection = ({\n policy,\n measurement,\n onChange,\n getPolicyOptions,\n getMeasurementOptions,\n}: Props): JSX.Element => {\n const handlePolicyLoadOptions = async () => {\n const allPolicies = await getPolicyOptions();\n // if `default` does not exist in the list of policies, we add it\n const allPoliciesWithDefault = allPolicies.some((p) => p === 'default')\n ? allPolicies\n : [DEFAULT_POLICY, ...allPolicies];\n\n return allPoliciesWithDefault.map(toSelectableValue);\n };\n\n const handleMeasurementLoadOptions = async (filter: string) => {\n const allMeasurements = await getMeasurementOptions(filter);\n return allMeasurements.map(toSelectableValue);\n };\n\n return (\n <>\n <Seg\n allowCustomValue\n value={policy ?? 'using default policy'}\n loadOptions={handlePolicyLoadOptions}\n onChange={(v) => {\n onChange(v.value, measurement);\n }}\n />\n <Seg\n allowCustomValue\n value={measurement ?? 'select measurement'}\n loadOptions={handleMeasurementLoadOptions}\n filterByLoadOptions\n onChange={(v) => {\n onChange(policy, v.value);\n }}\n />\n </>\n );\n};\n","import { cx } from '@emotion/css';\nimport React from 'react';\n\nimport { Input } from '@grafana/ui';\n\nimport { useShadowedState } from '../useShadowedState';\n\nimport { paddingRightClass } from './styles';\n\ntype Props = {\n value: string | undefined;\n onChange: (value: string | undefined) => void;\n isWide?: boolean;\n placeholder?: string;\n};\n\nexport const InputSection = ({ value, onChange, isWide, placeholder }: Props): JSX.Element => {\n const [currentValue, setCurrentValue] = useShadowedState(value);\n\n const onBlur = () => {\n // we send empty-string as undefined\n const newValue = currentValue === '' ? undefined : currentValue;\n onChange(newValue);\n };\n\n return (\n <>\n <Input\n placeholder={placeholder}\n className={cx(isWide ?? false ? 'width-14' : 'width-8', paddingRightClass)}\n type=\"text\"\n spellCheck={false}\n onBlur={onBlur}\n onChange={(e) => {\n setCurrentValue(e.currentTarget.value);\n }}\n value={currentValue ?? ''}\n />\n </>\n );\n};\n","import { cx } from '@emotion/css';\nimport React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Select } from '@grafana/ui';\n\nimport { paddingRightClass } from './styles';\nimport { unwrap } from './unwrap';\n\ntype Mode = 'ASC' | 'DESC';\n\nconst OPTIONS: Array<SelectableValue<Mode>> = [\n { label: 'ascending', value: 'ASC' },\n { label: 'descending', value: 'DESC' },\n];\n\nconst className = cx('width-9', paddingRightClass);\n\ntype Props = {\n value: Mode;\n onChange: (value: Mode) => void;\n inputId?: string;\n};\n\nexport const OrderByTimeSection = ({ value, onChange, inputId }: Props): JSX.Element => {\n return (\n <>\n <Select<Mode>\n inputId={inputId}\n className={className}\n onChange={(v) => {\n onChange(unwrap(v.value));\n }}\n value={value}\n options={OPTIONS}\n />\n </>\n );\n};\n","import React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { Seg } from './Seg';\nimport { unwrap } from './unwrap';\n\ntype Props = {\n loadOptions: () => Promise<SelectableValue[]>;\n allowCustomValue?: boolean;\n onAdd: (v: string) => void;\n};\n\nexport const AddButton = ({ loadOptions, allowCustomValue, onAdd }: Props): JSX.Element => {\n return (\n <Seg\n value=\"+\"\n loadOptions={loadOptions}\n allowCustomValue={allowCustomValue}\n onChange={(v) => {\n onAdd(unwrap(v.value));\n }}\n />\n );\n};\n","import { cx, css } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\nimport { SelectableValue, GrafanaTheme2 } from '@grafana/data';\nimport { MenuItem, WithContextMenu, MenuGroup, useTheme2 } from '@grafana/ui';\n\nimport { AddButton } from './AddButton';\nimport { Seg } from './Seg';\nimport { toSelectableValue } from './toSelectableValue';\nimport { unwrap } from './unwrap';\n\nexport type PartParams = Array<{\n value: string;\n options: (() => Promise<string[]>) | null;\n}>;\n\ntype Props = {\n parts: Array<{\n name: string;\n params: PartParams;\n }>;\n getNewPartOptions: () => Promise<SelectableValue[]>;\n onChange: (partIndex: number, paramValues: string[]) => void;\n onRemovePart: (index: number) => void;\n onAddNewPart: (type: string) => void;\n};\n\nconst renderRemovableNameMenuItems = (onClick: () => void) => {\n return (\n <MenuGroup label=\"\">\n <MenuItem label=\"remove\" onClick={onClick} />\n </MenuGroup>\n );\n};\n\nconst noRightMarginPaddingClass = css({\n paddingRight: '0',\n marginRight: '0',\n});\n\nconst RemovableName = ({ name, onRemove }: { name: string; onRemove: () => void }) => {\n return (\n <WithContextMenu renderMenuItems={() => renderRemovableNameMenuItems(onRemove)}>\n {({ openMenu }) => (\n <button className={cx('gf-form-label', noRightMarginPaddingClass)} onClick={openMenu}>\n {name}\n </button>\n )}\n </WithContextMenu>\n );\n};\n\ntype PartProps = {\n name: string;\n params: PartParams;\n onRemove: () => void;\n onChange: (paramValues: string[]) => void;\n};\n\nconst noHorizMarginPaddingClass = css({\n paddingLeft: '0',\n paddingRight: '0',\n marginLeft: '0',\n marginRight: '0',\n});\n\nconst getPartClass = (theme: GrafanaTheme2) => {\n return cx(\n 'gf-form-label',\n css({\n paddingLeft: '0',\n // gf-form-label class makes certain css attributes incorrect\n // for the selectbox-dropdown, so we have to \"reset\" them back\n lineHeight: theme.typography.body.lineHeight,\n fontSize: theme.typography.body.fontSize,\n })\n );\n};\n\nconst Part = ({ name, params, onChange, onRemove }: PartProps): JSX.Element => {\n const theme = useTheme2();\n const partClass = useMemo(() => getPartClass(theme), [theme]);\n\n const onParamChange = (par: string, i: number) => {\n const newParams = params.map((p) => p.value);\n newParams[i] = par;\n onChange(newParams);\n };\n return (\n <div className={partClass}>\n <RemovableName name={name} onRemove={onRemove} />(\n {params.map((p, i) => {\n const { value, options } = p;\n const isLast = i === params.length - 1;\n const loadOptions =\n options !== null ? () => options().then((items) => items.map(toSelectableValue)) : undefined;\n return (\n <React.Fragment key={i}>\n <Seg\n allowCustomValue\n value={value}\n buttonClassName={noHorizMarginPaddingClass}\n loadOptions={loadOptions}\n onChange={(v) => {\n onParamChange(unwrap(v.value), i);\n }}\n />\n {!isLast && ','}\n </React.Fragment>\n );\n })}\n )\n </div>\n );\n};\n\nexport const PartListSection = ({\n parts,\n getNewPartOptions,\n onAddNewPart,\n onRemovePart,\n onChange,\n}: Props): JSX.Element => {\n return (\n <>\n {parts.map((part, index) => (\n <Part\n key={index}\n name={part.name}\n params={part.params}\n onRemove={() => {\n onRemovePart(index);\n }}\n onChange={(pars) => {\n onChange(index, pars);\n }}\n />\n ))}\n <AddButton loadOptions={getNewPartOptions} onAdd={onAddNewPart} />\n </>\n );\n};\n","import { InfluxQueryTag } from '../../types';\n\nfunction isRegex(text: string): boolean {\n return /^\\/.*\\/$/.test(text);\n}\n\n// FIXME: sync these to the query-string-generation-code\n// probably it's in influx_query_model.ts\nexport function getOperator(tag: InfluxQueryTag): string {\n return tag.operator ?? (isRegex(tag.value) ? '=~' : '=');\n}\n\n// FIXME: sync these to the query-string-generation-code\n// probably it's in influx_query_model.ts\nexport function getCondition(tag: InfluxQueryTag, isFirst: boolean): string | undefined {\n return isFirst ? undefined : tag.condition ?? 'AND';\n}\n\nexport function adjustOperatorIfNeeded(currentOperator: string, newTagValue: string): string {\n const isCurrentOperatorRegex = currentOperator === '=~' || currentOperator === '!~';\n const isNewTagValueRegex = isRegex(newTagValue);\n\n if (isNewTagValueRegex) {\n return isCurrentOperatorRegex ? currentOperator : '=~';\n } else {\n return isCurrentOperatorRegex ? '=' : currentOperator;\n }\n}\n","import React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { InfluxQueryTag } from '../../types';\n\nimport { AddButton } from './AddButton';\nimport { Seg } from './Seg';\nimport { adjustOperatorIfNeeded, getCondition, getOperator } from './tagUtils';\nimport { toSelectableValue } from './toSelectableValue';\n\ntype KnownOperator = '=' | '!=' | '<>' | '<' | '>' | '=~' | '!~';\nconst knownOperators: KnownOperator[] = ['=', '!=', '<>', '<', '>', '=~', '!~'];\n\ntype KnownCondition = 'AND' | 'OR';\nconst knownConditions: KnownCondition[] = ['AND', 'OR'];\n\nconst operatorOptions: Array<SelectableValue<KnownOperator>> = knownOperators.map(toSelectableValue);\nconst condititonOptions: Array<SelectableValue<KnownCondition>> = knownConditions.map(toSelectableValue);\n\ntype Props = {\n tags: InfluxQueryTag[];\n onChange: (tags: InfluxQueryTag[]) => void;\n getTagKeyOptions: () => Promise<string[]>;\n getTagValueOptions: (key: string) => Promise<string[]>;\n};\n\ntype TagProps = {\n tag: InfluxQueryTag;\n isFirst: boolean;\n onRemove: () => void;\n onChange: (tag: InfluxQueryTag) => void;\n getTagKeyOptions: () => Promise<string[]>;\n getTagValueOptions: (key: string) => Promise<string[]>;\n};\n\nconst loadConditionOptions = () => Promise.resolve(condititonOptions);\n\nconst loadOperatorOptions = () => Promise.resolve(operatorOptions);\n\nconst Tag = ({ tag, isFirst, onRemove, onChange, getTagKeyOptions, getTagValueOptions }: TagProps): JSX.Element => {\n const operator = getOperator(tag);\n const condition = getCondition(tag, isFirst);\n\n const getTagKeySegmentOptions = () => {\n return getTagKeyOptions()\n .catch((err) => {\n // in this UI element we add a special item to the list of options,\n // that is used to remove the element.\n // this causes a problem: if `getTagKeyOptions` fails with an error,\n // the remove-filter option is never added to the list,\n // and the UI element can not be removed.\n // to avoid it, we catch any potential errors coming from `getTagKeyOptions`,\n // log the error, and pretend that the list of options is an empty list.\n // this way the remove-item option can always be added to the list.\n console.error(err);\n return [];\n })\n .then((tags) => [{ label: '-- remove filter --', value: undefined }, ...tags.map(toSelectableValue)]);\n };\n\n const getTagValueSegmentOptions = () => {\n return getTagValueOptions(tag.key).then((tags) => tags.map(toSelectableValue));\n };\n\n return (\n <div className=\"gf-form\">\n {condition != null && (\n <Seg\n value={condition}\n loadOptions={loadConditionOptions}\n onChange={(v) => {\n onChange({ ...tag, condition: v.value });\n }}\n />\n )}\n <Seg\n allowCustomValue\n value={tag.key}\n loadOptions={getTagKeySegmentOptions}\n onChange={(v) => {\n const { value } = v;\n if (value === undefined) {\n onRemove();\n } else {\n onChange({ ...tag, key: value ?? '' });\n }\n }}\n />\n <Seg\n value={operator}\n loadOptions={loadOperatorOptions}\n onChange={(op) => {\n onChange({ ...tag, operator: op.value });\n }}\n />\n <Seg\n allowCustomValue\n value={tag.value}\n loadOptions={getTagValueSegmentOptions}\n onChange={(v) => {\n const value = v.value ?? '';\n onChange({ ...tag, value, operator: adjustOperatorIfNeeded(operator, value) });\n }}\n />\n </div>\n );\n};\n\nexport const TagsSection = ({ tags, onChange, getTagKeyOptions, getTagValueOptions }: Props): JSX.Element => {\n const onTagChange = (newTag: InfluxQueryTag, index: number) => {\n const newTags = tags.map((tag, i) => {\n return index === i ? newTag : tag;\n });\n onChange(newTags);\n };\n\n const onTagRemove = (index: number) => {\n const newTags = tags.filter((t, i) => i !== index);\n onChange(newTags);\n };\n\n const getTagKeySegmentOptions = () => {\n return getTagKeyOptions().then((tags) => tags.map(toSelectableValue));\n };\n\n const addNewTag = (tagKey: string, isFirst: boolean) => {\n const minimalTag: InfluxQueryTag = {\n key: tagKey,\n value: 'select tag value',\n };\n\n const newTag: InfluxQueryTag = {\n key: minimalTag.key,\n value: minimalTag.value,\n operator: getOperator(minimalTag),\n condition: getCondition(minimalTag, isFirst),\n };\n\n onChange([...tags, newTag]);\n };\n\n return (\n <>\n {tags.map((t, i) => (\n <Tag\n tag={t}\n isFirst={i === 0}\n key={i}\n onChange={(newT) => {\n onTagChange(newT, i);\n }}\n onRemove={() => {\n onTagRemove(i);\n }}\n getTagKeyOptions={getTagKeyOptions}\n getTagValueOptions={getTagValueOptions}\n />\n ))}\n <AddButton\n allowCustomValue\n loadOptions={getTagKeySegmentOptions}\n onAdd={(v) => {\n addNewTag(v, tags.length === 0);\n }}\n />\n </>\n );\n};\n","import { SelectableValue } from '@grafana/data';\nimport { QueryPartDef } from 'app/features/alerting/state/query_part';\n\nimport InfluxQueryModel from '../../influx_query_model';\nimport queryPart from '../../query_part';\nimport { InfluxQuery, InfluxQueryPart } from '../../types';\n\nimport { PartParams } from './PartListSection';\nimport { toSelectableValue } from './toSelectableValue';\nimport { unwrap } from './unwrap';\n\ntype Categories = Record<string, QueryPartDef[]>;\n\nexport function getNewSelectPartOptions(): SelectableValue[] {\n const categories: Categories = queryPart.getCategories();\n const options: SelectableValue[] = [];\n\n const keys = Object.keys(categories);\n\n keys.forEach((key) => {\n const children: SelectableValue[] = categories[key].map((x) => toSelectableValue(x.type));\n\n options.push({\n label: key,\n options: children,\n });\n });\n\n return options;\n}\n\nexport async function getNewGroupByPartOptions(\n query: InfluxQuery,\n getTagKeys: () => Promise<string[]>\n): Promise<Array<SelectableValue<string>>> {\n const tagKeys = await getTagKeys();\n const queryCopy = { ...query }; // the query-model mutates the query\n const model = new InfluxQueryModel(queryCopy);\n const options: Array<SelectableValue<string>> = [];\n if (!model.hasFill()) {\n options.push(toSelectableValue('fill(null)'));\n }\n if (!model.hasGroupByTime()) {\n options.push(toSelectableValue('time($interval)'));\n }\n tagKeys.forEach((key) => {\n options.push(toSelectableValue(`tag(${key})`));\n });\n return options;\n}\n\ntype Part = {\n name: string;\n params: PartParams;\n};\n\nfunction getPartParams(part: InfluxQueryPart, dynamicParamOptions: Map<string, () => Promise<string[]>>): PartParams {\n // NOTE: the way the system is constructed,\n // there always can only be one possible dynamic-lookup\n // field. in case of select it is the field,\n // in case of group-by it is the tag\n const def = queryPart.create(part).def;\n\n // we switch the numbers to strings, it will work that way too,\n // and it makes the code simpler\n const paramValues = (part.params ?? []).map((p) => p.toString());\n\n if (paramValues.length !== def.params.length) {\n throw new Error('Invalid query-segment');\n }\n\n return paramValues.map((val, index) => {\n const defParam = def.params[index];\n if (defParam.dynamicLookup) {\n return {\n value: val,\n options: unwrap(dynamicParamOptions.get(`${def.type}_${index}`)),\n };\n }\n\n if (defParam.options != null) {\n return {\n value: val,\n options: () => Promise.resolve(defParam.options),\n };\n }\n\n return {\n value: val,\n options: null,\n };\n });\n}\n\nexport function makePartList(\n queryParts: InfluxQueryPart[],\n dynamicParamOptions: Map<string, () => Promise<string[]>>\n): Part[] {\n return queryParts.map((qp) => {\n return {\n name: qp.type,\n params: getPartParams(qp, dynamicParamOptions),\n };\n });\n}\n","import { css } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { InlineLabel, SegmentSection, useStyles2 } from '@grafana/ui';\n\nimport InfluxDatasource from '../../datasource';\nimport {\n getAllMeasurementsForTags,\n getAllPolicies,\n getFieldKeysForMeasurement,\n getTagKeysForMeasurementAndTags,\n getTagValues,\n} from '../../influxQLMetadataQuery';\nimport {\n normalizeQuery,\n addNewSelectPart,\n removeSelectPart,\n addNewGroupByPart,\n removeGroupByPart,\n changeSelectPart,\n changeGroupByPart,\n} from '../../queryUtils';\nimport { InfluxQuery, InfluxQueryTag } from '../../types';\nimport { DEFAULT_RESULT_FORMAT } from '../constants';\nimport { useUniqueId } from '../useUniqueId';\n\nimport { FormatAsSection } from './FormatAsSection';\nimport { FromSection } from './FromSection';\nimport { InputSection } from './InputSection';\nimport { OrderByTimeSection } from './OrderByTimeSection';\nimport { PartListSection } from './PartListSection';\nimport { TagsSection } from './TagsSection';\nimport { getNewSelectPartOptions, getNewGroupByPartOptions, makePartList } from './partListUtils';\n\ntype Props = {\n query: InfluxQuery;\n onChange: (query: InfluxQuery) => void;\n onRunQuery: () => void;\n datasource: InfluxDatasource;\n};\n\nfunction getTemplateVariableOptions() {\n return (\n getTemplateSrv()\n .getVariables()\n // we make them regex-params, i'm not 100% sure why.\n // probably because this way multi-value variables work ok too.\n .map((v) => `/^$${v.name}$/`)\n );\n}\n\n// helper function to make it easy to call this from the widget-render-code\nfunction withTemplateVariableOptions(optionsPromise: Promise<string[]>): Promise<string[]> {\n return optionsPromise.then((options) => [...getTemplateVariableOptions(), ...options]);\n}\n\n// it is possible to add fields into the `InfluxQueryTag` structures, and they do work,\n// but in some cases, when we do metadata queries, we have to remove them from the queries.\nfunction filterTags(parts: InfluxQueryTag[], allTagKeys: Set<string>): InfluxQueryTag[] {\n return parts.filter((t) => allTagKeys.has(t.key));\n}\n\nexport const Editor = (props: Props): JSX.Element => {\n const uniqueId = useUniqueId();\n const formatAsId = `influxdb-qe-format-as-${uniqueId}`;\n const orderByTimeId = `influxdb-qe-order-by${uniqueId}`;\n\n const styles = useStyles2(getStyles);\n const query = normalizeQuery(props.query);\n const { datasource } = props;\n const { measurement, policy } = query;\n\n const allTagKeys = useMemo(() => {\n return getTagKeysForMeasurementAndTags(measurement, policy, [], datasource).then((tags) => {\n return new Set(tags);\n });\n }, [measurement, policy, datasource]);\n\n const selectLists = useMemo(() => {\n const dynamicSelectPartOptions = new Map([\n [\n 'field_0',\n () => {\n return measurement !== undefined\n ? getFieldKeysForMeasurement(measurement, policy, datasource)\n : Promise.resolve([]);\n },\n ],\n ]);\n return (query.select ?? []).map((sel) => makePartList(sel, dynamicSelectPartOptions));\n }, [measurement, policy, query.select, datasource]);\n\n // the following function is not complicated enough to memoize, but it's result\n // is used in both memoized and un-memoized parts, so we have no choice\n const getTagKeys = useMemo(() => {\n return () =>\n allTagKeys.then((keys) =>\n getTagKeysForMeasurementAndTags(measurement, policy, filterTags(query.tags ?? [], keys), datasource)\n );\n }, [measurement, policy, query.tags, datasource, allTagKeys]);\n\n const groupByList = useMemo(() => {\n const dynamicGroupByPartOptions = new Map([['tag_0', getTagKeys]]);\n\n return makePartList(query.groupBy ?? [], dynamicGroupByPartOptions);\n }, [getTagKeys, query.groupBy]);\n\n const onAppliedChange = (newQuery: InfluxQuery) => {\n props.onChange(newQuery);\n props.onRunQuery();\n };\n const handleFromSectionChange = (p: string | undefined, m: string | undefined) => {\n onAppliedChange({\n ...query,\n policy: p,\n measurement: m,\n });\n };\n\n const handleTagsSectionChange = (tags: InfluxQueryTag[]) => {\n // we set empty-arrays to undefined\n onAppliedChange({\n ...query,\n tags: tags.length === 0 ? undefined : tags,\n });\n };\n\n return (\n <div>\n <SegmentSection label=\"FROM\" fill={true}>\n <FromSection\n policy={policy}\n measurement={measurement}\n getPolicyOptions={() => getAllPolicies(datasource)}\n getMeasurementOptions={(filter) =>\n withTemplateVariableOptions(\n allTagKeys.then((keys) =>\n getAllMeasurementsForTags(\n filter === '' ? undefined : filter,\n filterTags(query.tags ?? [], keys),\n datasource\n )\n )\n )\n }\n onChange={handleFromSectionChange}\n />\n <InlineLabel width=\"auto\" className={styles.inlineLabel}>\n WHERE\n </InlineLabel>\n <TagsSection\n tags={query.tags ?? []}\n onChange={handleTagsSectionChange}\n getTagKeyOptions={getTagKeys}\n getTagValueOptions={(key: string) =>\n withTemplateVariableOptions(\n allTagKeys.then((keys) =>\n getTagValues(key, measurement, policy, filterTags(query.tags ?? [], keys), datasource)\n )\n )\n }\n />\n </SegmentSection>\n {selectLists.map((sel, index) => (\n <SegmentSection key={index} label={index === 0 ? 'SELECT' : ''} fill={true}>\n <PartListSection\n parts={sel}\n getNewPartOptions={() => Promise.resolve(getNewSelectPartOptions())}\n onChange={(partIndex, newParams) => {\n const newQuery = changeSelectPart(query, index, partIndex, newParams);\n onAppliedChange(newQuery);\n }}\n onAddNewPart={(type) => {\n onAppliedChange(addNewSelectPart(query, type, index));\n }}\n onRemovePart={(partIndex) => {\n onAppliedChange(removeSelectPart(query, partIndex, index));\n }}\n />\n </SegmentSection>\n ))}\n <SegmentSection label=\"GROUP BY\" fill={true}>\n <PartListSection\n parts={groupByList}\n getNewPartOptions={() => getNewGroupByPartOptions(query, getTagKeys)}\n onChange={(partIndex, newParams) => {\n const newQuery = changeGroupByPart(query, partIndex, newParams);\n onAppliedChange(newQuery);\n }}\n onAddNewPart={(type) => {\n onAppliedChange(addNewGroupByPart(query, type));\n }}\n onRemovePart={(partIndex) => {\n onAppliedChange(removeGroupByPart(query, partIndex));\n }}\n />\n </SegmentSection>\n <SegmentSection label=\"TIMEZONE\" fill={true}>\n <InputSection\n placeholder=\"(optional)\"\n value={query.tz}\n onChange={(tz) => {\n onAppliedChange({ ...query, tz });\n }}\n />\n <InlineLabel htmlFor={orderByTimeId} width=\"auto\" className={styles.inlineLabel}>\n ORDER BY TIME\n </InlineLabel>\n <OrderByTimeSection\n inputId={orderByTimeId}\n value={query.orderByTime === 'DESC' ? 'DESC' : 'ASC' /* FIXME: make this shared with influx_query_model */}\n onChange={(v) => {\n onAppliedChange({ ...query, orderByTime: v });\n }}\n />\n </SegmentSection>\n {/* query.fill is ignored in the query-editor, and it is deleted whenever\n query-editor changes. the influx_query_model still handles it, but the new\n approach seem to be to handle \"fill\" inside query.groupBy. so, if you\n have a panel where in the json you have query.fill, it will be applied,\n as long as you do not edit that query. */}\n <SegmentSection label=\"LIMIT\" fill={true}>\n <InputSection\n placeholder=\"(optional)\"\n value={query.limit?.toString()}\n onChange={(limit) => {\n onAppliedChange({ ...query, limit });\n }}\n />\n <InlineLabel width=\"auto\" className={styles.inlineLabel}>\n SLIMIT\n </InlineLabel>\n <InputSection\n placeholder=\"(optional)\"\n value={query.slimit?.toString()}\n onChange={(slimit) => {\n onAppliedChange({ ...query, slimit });\n }}\n />\n </SegmentSection>\n <SegmentSection htmlFor={formatAsId} label=\"FORMAT AS\" fill={true}>\n <FormatAsSection\n inputId={formatAsId}\n format={query.resultFormat ?? DEFAULT_RESULT_FORMAT}\n onChange={(format) => {\n onAppliedChange({ ...query, resultFormat: format });\n }}\n />\n {query.resultFormat !== 'table' && (\n <>\n <InlineLabel width=\"auto\" className={styles.inlineLabel}>\n ALIAS\n </InlineLabel>\n <InputSection\n isWide\n placeholder=\"Naming pattern\"\n value={query.alias}\n onChange={(alias) => {\n onAppliedChange({ ...query, alias });\n }}\n />\n </>\n )}\n </SegmentSection>\n </div>\n );\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n inlineLabel: css`\n color: ${theme.colors.primary.text};\n `,\n };\n}\n","import React, { PureComponent } from 'react';\n\nimport { InlineFormLabel, TextArea } from '@grafana/ui';\n\nimport InfluxDatasource from '../datasource';\n\nimport { FluxQueryEditor } from './FluxQueryEditor';\n\ninterface Props {\n query: string; // before flux, it was always a string\n onChange: (query?: string) => void;\n datasource: InfluxDatasource;\n}\n\nexport default class VariableQueryEditor extends PureComponent<Props> {\n onRefresh = () => {\n // noop\n };\n\n render() {\n let { query, datasource, onChange } = this.props;\n if (datasource.isFlux) {\n return (\n <FluxQueryEditor\n datasource={datasource}\n query={{\n refId: 'A',\n query,\n }}\n onRunQuery={this.onRefresh}\n onChange={(v) => onChange(v.query)}\n />\n );\n }\n\n return (\n <div className=\"gf-form-inline\">\n <InlineFormLabel width={10}>Query</InlineFormLabel>\n <div className=\"gf-form-inline gf-form--grow\">\n <TextArea\n defaultValue={query || ''}\n placeholder=\"metric name or tags query\"\n rows={1}\n className=\"gf-form-input\"\n onBlur={(e) => onChange(e.currentTarget.value)}\n />\n </div>\n </div>\n );\n }\n}\n","import React, { useState } from 'react';\n\nimport { QueryEditorProps } from '@grafana/data';\nimport { InlineFormLabel, Input } from '@grafana/ui';\n\nimport { InfluxQuery, InfluxOptions } from '../types';\n\nimport InfluxDatasource from './../datasource';\n\nexport const AnnotationEditor = (props: QueryEditorProps<InfluxDatasource, InfluxQuery, InfluxOptions>) => {\n const { query, onChange } = props;\n const [eventQuery, setEventQuery] = useState<string>(query.query ?? '');\n\n const [textColumn, setTextColumn] = useState<string>(query.textColumn ?? '');\n const [tagsColumn, setTagsColumn] = useState<string>(query.tagsColumn ?? '');\n const [timeEndColumn, setTimeEndColumn] = useState<string>(query?.timeEndColumn ?? '');\n const [titleColumn] = useState<string>(query?.titleColumn ?? '');\n const updateValue = <K extends keyof InfluxQuery, V extends InfluxQuery[K]>(key: K, val: V) => {\n onChange({\n ...query,\n [key]: val,\n fromAnnotations: true,\n textEditor: true,\n });\n };\n return (\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <InlineFormLabel width={12}>InfluxQL Query</InlineFormLabel>\n <Input\n value={eventQuery}\n onChange={(e) => setEventQuery(e.currentTarget.value ?? '')}\n onBlur={() => updateValue('query', eventQuery)}\n placeholder=\"select text from events where $timeFilter limit 1000\"\n />\n </div>\n <InlineFormLabel\n width={12}\n tooltip={\n <div>\n If your influxdb query returns more than one field you need to specify the column names below. An annotation\n event is composed of a title, tags, and an additional text field. Optionally you can map the timeEnd column\n for region annotation usage.\n </div>\n }\n >\n Field mappings\n </InlineFormLabel>\n <div className=\"gf-form-group\">\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineFormLabel width={12}>Text</InlineFormLabel>\n <Input\n value={textColumn}\n onChange={(e) => setTextColumn(e.currentTarget.value ?? '')}\n onBlur={() => updateValue('textColumn', textColumn)}\n />\n </div>\n <div className=\"gf-form\">\n <InlineFormLabel width={12}>Tags</InlineFormLabel>\n <Input\n value={tagsColumn}\n onChange={(e) => setTagsColumn(e.currentTarget.value ?? '')}\n onBlur={() => updateValue('tagsColumn', tagsColumn)}\n />\n </div>\n <div className=\"gf-form\">\n <InlineFormLabel width={12}>TimeEnd</InlineFormLabel>\n <Input\n value={timeEndColumn}\n onChange={(e) => setTimeEndColumn(e.currentTarget.value ?? '')}\n onBlur={() => updateValue('timeEndColumn', timeEndColumn)}\n />\n </div>\n <div className=\"gf-form ng-hide\">\n <InlineFormLabel width={12}>Title</InlineFormLabel>\n <Input defaultValue={titleColumn} />\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { each, map, includes, flatten, keys } from 'lodash';\n\nimport { FieldType, QueryResultMeta, TimeSeries, TableData } from '@grafana/data';\nimport TableModel from 'app/core/TableModel';\n\nexport default class InfluxSeries {\n refId?: string;\n series: any;\n alias: any;\n annotation: any;\n meta?: QueryResultMeta;\n\n constructor(options: { series: any; alias?: any; annotation?: any; meta?: QueryResultMeta; refId?: string }) {\n this.series = options.series;\n this.alias = options.alias;\n this.annotation = options.annotation;\n this.meta = options.meta;\n this.refId = options.refId;\n }\n\n getTimeSeries(): TimeSeries[] {\n const output: TimeSeries[] = [];\n let i, j;\n\n if (this.series.length === 0) {\n return output;\n }\n\n each(this.series, (series) => {\n const columns = series.columns.length;\n const tags = map(series.tags, (value, key) => {\n return key + ': ' + value;\n });\n\n for (j = 1; j < columns; j++) {\n let seriesName = series.name;\n const columnName = series.columns[j];\n if (columnName !== 'value') {\n seriesName = seriesName + '.' + columnName;\n }\n\n if (this.alias) {\n seriesName = this._getSeriesName(series, j);\n } else if (series.tags) {\n seriesName = seriesName + ' {' + tags.join(', ') + '}';\n }\n\n const datapoints = [];\n if (series.values) {\n for (i = 0; i < series.values.length; i++) {\n datapoints[i] = [series.values[i][j], series.values[i][0]];\n }\n }\n\n output.push({\n title: seriesName,\n target: seriesName,\n datapoints: datapoints,\n tags: series.tags,\n meta: this.meta,\n refId: this.refId,\n });\n }\n });\n\n return output;\n }\n\n _getSeriesName(series: any, index: number) {\n const regex = /\\$(\\w+)|\\[\\[([\\s\\S]+?)\\]\\]/g;\n const segments = series.name.split('.');\n\n return this.alias.replace(regex, (match: any, g1: any, g2: any) => {\n const group = g1 || g2;\n const segIndex = parseInt(group, 10);\n\n if (group === 'm' || group === 'measurement') {\n return series.name;\n }\n if (group === 'col') {\n return series.columns[index];\n }\n if (!isNaN(segIndex)) {\n return segments[segIndex] ?? match;\n }\n if (group.indexOf('tag_') !== 0) {\n return match;\n }\n\n const tag = group.replace('tag_', '');\n if (!series.tags) {\n return match;\n }\n return series.tags[tag];\n });\n }\n\n getAnnotations() {\n const list: any[] = [];\n\n each(this.series, (series) => {\n let titleCol: any = null;\n let timeCol: any = null;\n let timeEndCol: any = null;\n const tagsCol: any = [];\n let textCol: any = null;\n\n each(series.columns, (column, index) => {\n if (column === 'time') {\n timeCol = index;\n return;\n }\n if (column === 'sequence_number') {\n return;\n }\n if (column === this.annotation.titleColumn) {\n titleCol = index;\n return;\n }\n if (includes((this.annotation.tagsColumn || '').replace(' ', '').split(','), column)) {\n tagsCol.push(index);\n return;\n }\n if (column === this.annotation.textColumn) {\n textCol = index;\n return;\n }\n if (column === this.annotation.timeEndColumn) {\n timeEndCol = index;\n return;\n }\n // legacy case\n if (!titleCol && textCol !== index) {\n titleCol = index;\n }\n });\n\n each(series.values, (value) => {\n const data = {\n annotation: this.annotation,\n time: +new Date(value[timeCol]),\n title: value[titleCol],\n timeEnd: value[timeEndCol],\n // Remove empty values, then split in different tags for comma separated values\n tags: flatten(\n tagsCol\n .filter((t: any) => {\n return value[t];\n })\n .map((t: any) => {\n return value[t].split(',');\n })\n ),\n text: value[textCol],\n };\n\n list.push(data);\n });\n });\n\n return list;\n }\n\n getTable(): TableData {\n const table = new TableModel();\n let i, j;\n\n table.refId = this.refId;\n table.meta = this.meta;\n\n if (this.series.length === 0) {\n return table;\n }\n\n // the order is:\n // - first the first item from the value-array (this is often (always?) the timestamp)\n // - then all the tag-values\n // - then the rest of the value-array\n //\n // we have to keep this order both in table.columns and table.rows\n\n each(this.series, (series: any, seriesIndex: number) => {\n if (seriesIndex === 0) {\n const firstCol = series.columns[0];\n // Check the first column's name, if it is `time`, we\n // mark it as having the type time\n const firstTableCol = firstCol === 'time' ? { text: 'Time', type: FieldType.time } : { text: firstCol };\n table.columns.push(firstTableCol);\n each(keys(series.tags), (key) => {\n table.columns.push({ text: key });\n });\n for (j = 1; j < series.columns.length; j++) {\n table.columns.push({ text: series.columns[j] });\n }\n }\n\n if (series.values) {\n for (i = 0; i < series.values.length; i++) {\n const values = series.values[i];\n const reordered = [values[0]];\n if (series.tags) {\n for (const key in series.tags) {\n if (series.tags.hasOwnProperty(key)) {\n reordered.push(series.tags[key]);\n }\n }\n }\n for (j = 1; j < values.length; j++) {\n reordered.push(values[j]);\n }\n table.rows.push(reordered);\n }\n }\n });\n\n return table;\n }\n}\n","type LegacyAnnotation = {\n query?: string;\n queryType?: string;\n fromAnnotations?: boolean;\n tagsColumn?: string;\n textColumn?: string;\n timeEndColumn?: string;\n titleColumn?: string;\n name?: string;\n};\n\n// this becomes the target in the migrated annotations\nconst migrateLegacyAnnotation = (json: LegacyAnnotation) => {\n return {\n query: json.query ?? '',\n queryType: 'tags',\n fromAnnotations: true,\n tagsColumn: json.tagsColumn ?? '',\n textColumn: json.textColumn ?? '',\n timeEndColumn: json.timeEndColumn ?? '',\n titleColumn: json.titleColumn ?? '',\n name: json.name ?? '',\n };\n};\n\n// eslint-ignore-next-line\nexport const prepareAnnotation = (json: any) => {\n json.target = json.target ?? migrateLegacyAnnotation(json);\n\n return json;\n};\n","import { each, flatten, groupBy, isArray } from 'lodash';\n\nimport { AnnotationEvent, DataFrame, DataQuery, FieldType, QueryResultMeta } from '@grafana/data';\nimport { toDataQueryResponse } from '@grafana/runtime';\nimport TableModel from 'app/core/TableModel';\n\nimport { InfluxQuery } from './types';\n\nexport default class ResponseParser {\n parse(query: string, results: { results: any }) {\n if (!results?.results || results.results.length === 0) {\n return [];\n }\n\n const influxResults = results.results[0];\n if (!influxResults.series) {\n return [];\n }\n\n const normalizedQuery = query.toLowerCase();\n const isValueFirst =\n normalizedQuery.indexOf('show field keys') >= 0 || normalizedQuery.indexOf('show retention policies') >= 0;\n\n const res = new Set<string>();\n each(influxResults.series, (serie) => {\n each(serie.values, (value) => {\n if (isArray(value)) {\n // In general, there are 2 possible shapes for the returned value.\n // The first one is a two-element array,\n // where the first element is somewhat a metadata value:\n // the tag name for SHOW TAG VALUES queries,\n // the time field for SELECT queries, etc.\n // The second shape is an one-element array,\n // that is containing an immediate value.\n // For example, SHOW FIELD KEYS queries return such shape.\n // Note, pre-0.11 versions return\n // the second shape for SHOW TAG VALUES queries\n // (while the newer versions—first).\n\n if (isValueFirst) {\n addUnique(res, value[0]);\n } else if (value[1] !== undefined) {\n addUnique(res, value[1]);\n } else {\n addUnique(res, value[0]);\n }\n } else {\n addUnique(res, value);\n }\n });\n });\n\n // NOTE: it is important to keep the order of items in the parsed output\n // the same as it was in the influxdb-response.\n // we use a `Set` to collect the unique-results, and `Set` iteration\n // order is insertion-order, so this should be ok.\n return Array.from(res).map((v) => ({ text: v }));\n }\n\n getTable(dfs: DataFrame[], target: InfluxQuery, meta: QueryResultMeta): TableModel {\n let table = new TableModel();\n\n if (dfs.length > 0) {\n table.meta = {\n ...meta,\n executedQueryString: dfs[0].meta?.executedQueryString,\n };\n\n table.refId = target.refId;\n table = getTableCols(dfs, table, target);\n\n // if group by tag(s) added\n if (dfs[0].fields[1] && dfs[0].fields[1].labels) {\n let dfsByLabels: any = groupBy(dfs, (df: DataFrame) =>\n df.fields[1].labels ? Object.values(df.fields[1].labels!) : null\n );\n const labels = Object.keys(dfsByLabels);\n dfsByLabels = Object.values(dfsByLabels);\n\n for (let i = 0; i < dfsByLabels.length; i++) {\n table = getTableRows(dfsByLabels[i], table, [...labels[i].split(',')]);\n }\n } else {\n table = getTableRows(dfs, table, []);\n }\n }\n\n return table;\n }\n\n async transformAnnotationResponse(annotation: any, data: any, target: InfluxQuery): Promise<AnnotationEvent[]> {\n const rsp = toDataQueryResponse(data, [target] as DataQuery[]);\n\n if (rsp) {\n const table = this.getTable(rsp.data, target, {});\n const list: any[] = [];\n let titleCol: any = null;\n let timeCol: any = null;\n let timeEndCol: any = null;\n const tagsCol: any = [];\n let textCol: any = null;\n\n each(table.columns, (column, index) => {\n if (column.text.toLowerCase() === 'time') {\n timeCol = index;\n return;\n }\n if (column.text === annotation.titleColumn) {\n titleCol = index;\n return;\n }\n if (colContainsTag(column.text, annotation.tagsColumn)) {\n tagsCol.push(index);\n return;\n }\n if (column.text.includes(annotation.textColumn)) {\n textCol = index;\n return;\n }\n if (column.text === annotation.timeEndColumn) {\n timeEndCol = index;\n return;\n }\n // legacy case\n if (!titleCol && textCol !== index) {\n titleCol = index;\n }\n });\n\n each(table.rows, (value) => {\n const data = {\n annotation: annotation,\n time: +new Date(value[timeCol]),\n title: value[titleCol],\n timeEnd: value[timeEndCol],\n // Remove empty values, then split in different tags for comma separated values\n tags: flatten(\n tagsCol\n .filter((t: any) => {\n return value[t];\n })\n .map((t: any) => {\n return value[t].split(',');\n })\n ),\n text: value[textCol],\n };\n\n list.push(data);\n });\n\n return list;\n }\n return [];\n }\n}\n\nfunction colContainsTag(colText: string, tagsColumn: string): boolean {\n const tags = (tagsColumn || '').replace(' ', '').split(',');\n for (const tag of tags) {\n if (colText.includes(tag)) {\n return true;\n }\n }\n return false;\n}\n\nfunction getTableCols(dfs: DataFrame[], table: TableModel, target: InfluxQuery): TableModel {\n const selectedParams = getSelectedParams(target);\n\n dfs[0].fields.forEach((field) => {\n // Time col\n if (field.name === 'time') {\n table.columns.push({ text: 'Time', type: FieldType.time });\n }\n\n // Group by (label) column(s)\n else if (field.name === 'value') {\n if (field.labels) {\n Object.keys(field.labels).forEach((key) => {\n table.columns.push({ text: key });\n });\n }\n }\n });\n\n // Get cols for annotationQuery\n if (dfs[0].refId === 'metricFindQuery') {\n dfs.forEach((field) => {\n if (field.name) {\n table.columns.push({ text: field.name });\n }\n });\n }\n\n // Select (metric) column(s)\n for (let i = 0; i < selectedParams.length; i++) {\n table.columns.push({ text: selectedParams[i] });\n }\n\n return table;\n}\n\nfunction getTableRows(dfs: DataFrame[], table: TableModel, labels: string[]): TableModel {\n const values = dfs[0].fields[0].values.toArray();\n\n for (let i = 0; i < values.length; i++) {\n const time = values[i];\n const metrics = dfs.map((df: DataFrame) => {\n return df.fields[1] ? df.fields[1].values.toArray()[i] : null;\n });\n if (metrics.indexOf(null) < 0) {\n table.rows.push([time, ...labels, ...metrics]);\n }\n }\n return table;\n}\n\nexport function getSelectedParams(target: InfluxQuery): string[] {\n let allParams: string[] = [];\n target.select?.forEach((select) => {\n const selector = select.filter((x) => x.type !== 'field');\n if (selector.length > 0) {\n allParams.push(selector[0].type);\n } else {\n if (select[0] && select[0].params && select[0].params[0]) {\n allParams.push(select[0].params[0].toString());\n }\n }\n });\n\n let uniqueParams: string[] = [];\n allParams.forEach((param) => {\n uniqueParams.push(incrementName(param, param, uniqueParams, 0));\n });\n\n return uniqueParams;\n}\n\nfunction incrementName(name: string, nameIncremenet: string, params: string[], index: number): string {\n if (params.indexOf(nameIncremenet) > -1) {\n index++;\n return incrementName(name, name + '_' + index, params, index);\n }\n return nameIncremenet;\n}\n\nfunction addUnique(s: Set<string>, value: string | number) {\n s.add(value.toString());\n}\n","import { cloneDeep, extend, groupBy, has, isString, map as _map, omit, pick, reduce } from 'lodash';\nimport { lastValueFrom, merge, Observable, of, throwError } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\nimport {\n AnnotationEvent,\n ArrayVector,\n DataFrame,\n DataQueryError,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n dateMath,\n FieldType,\n MetricFindValue,\n QueryResultMeta,\n ScopedVars,\n TIME_SERIES_TIME_FIELD_NAME,\n TIME_SERIES_VALUE_FIELD_NAME,\n TimeSeries,\n toDataFrame,\n} from '@grafana/data';\nimport {\n BackendDataSourceResponse,\n DataSourceWithBackend,\n FetchResponse,\n frameToMetricFindValue,\n getBackendSrv,\n} from '@grafana/runtime';\nimport config from 'app/core/config';\nimport { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_srv';\n\nimport { AnnotationEditor } from './components/AnnotationEditor';\nimport { FluxQueryEditor } from './components/FluxQueryEditor';\nimport { BROWSER_MODE_DISABLED_MESSAGE } from './constants';\nimport InfluxQueryModel from './influx_query_model';\nimport InfluxSeries from './influx_series';\nimport { prepareAnnotation } from './migrations';\nimport { buildRawQuery } from './queryUtils';\nimport { InfluxQueryBuilder } from './query_builder';\nimport ResponseParser from './response_parser';\nimport { InfluxOptions, InfluxQuery, InfluxVersion } from './types';\n\n// we detect the field type based on the value-array\nfunction getFieldType(values: unknown[]): FieldType {\n // the values-array may contain a lot of nulls.\n // we need the first not-null item\n const firstNotNull = values.find((v) => v !== null);\n\n if (firstNotNull === undefined) {\n // we could not find any not-null values\n return FieldType.number;\n }\n\n const valueType = typeof firstNotNull;\n\n switch (valueType) {\n case 'string':\n return FieldType.string;\n case 'boolean':\n return FieldType.boolean;\n case 'number':\n return FieldType.number;\n default:\n // this should never happen, influxql values\n // can only be numbers, strings and booleans.\n throw new Error(`InfluxQL: invalid value type ${valueType}`);\n }\n}\n\n// this conversion function is specialized to work with the timeseries\n// data returned by InfluxDatasource.getTimeSeries()\nfunction timeSeriesToDataFrame(timeSeries: TimeSeries): DataFrame {\n const times: number[] = [];\n const values: unknown[] = [];\n\n // the data we process here is not correctly typed.\n // the typescript types say every data-point is number|null,\n // but in fact it can be string or boolean too.\n\n const points = timeSeries.datapoints;\n for (const point of points) {\n values.push(point[0]);\n times.push(point[1] as number);\n }\n\n const timeField = {\n name: TIME_SERIES_TIME_FIELD_NAME,\n type: FieldType.time,\n config: {},\n values: new ArrayVector<number>(times),\n };\n\n const valueField = {\n name: TIME_SERIES_VALUE_FIELD_NAME,\n type: getFieldType(values),\n config: {\n displayNameFromDS: timeSeries.title,\n },\n values: new ArrayVector<unknown>(values),\n labels: timeSeries.tags,\n };\n\n const fields = [timeField, valueField];\n\n return {\n name: timeSeries.target,\n refId: timeSeries.refId,\n meta: timeSeries.meta,\n fields,\n length: values.length,\n };\n}\n\nexport default class InfluxDatasource extends DataSourceWithBackend<InfluxQuery, InfluxOptions> {\n type: string;\n urls: string[];\n username: string;\n password: string;\n name: string;\n database: any;\n basicAuth: any;\n withCredentials: any;\n access: 'direct' | 'proxy';\n interval: any;\n responseParser: any;\n httpMode: string;\n isFlux: boolean;\n isProxyAccess: boolean;\n\n constructor(\n instanceSettings: DataSourceInstanceSettings<InfluxOptions>,\n private readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n\n this.type = 'influxdb';\n this.urls = (instanceSettings.url ?? '').split(',').map((url) => {\n return url.trim();\n });\n\n this.username = instanceSettings.username ?? '';\n this.password = instanceSettings.password ?? '';\n this.name = instanceSettings.name;\n this.database = instanceSettings.database;\n this.basicAuth = instanceSettings.basicAuth;\n this.withCredentials = instanceSettings.withCredentials;\n this.access = instanceSettings.access;\n const settingsData = instanceSettings.jsonData || ({} as InfluxOptions);\n this.interval = settingsData.timeInterval;\n this.httpMode = settingsData.httpMode || 'GET';\n this.responseParser = new ResponseParser();\n this.isFlux = settingsData.version === InfluxVersion.Flux;\n this.isProxyAccess = instanceSettings.access === 'proxy';\n\n if (this.isFlux) {\n // When flux, use an annotation processor rather than the `annotationQuery` lifecycle\n this.annotations = {\n QueryEditor: FluxQueryEditor,\n };\n } else {\n this.annotations = {\n QueryEditor: AnnotationEditor,\n prepareAnnotation,\n };\n }\n }\n\n query(request: DataQueryRequest<InfluxQuery>): Observable<DataQueryResponse> {\n if (!this.isProxyAccess) {\n const error = new Error(BROWSER_MODE_DISABLED_MESSAGE);\n return throwError(() => error);\n }\n // for not-flux queries we call `this.classicQuery`, and that\n // handles the is-hidden situation.\n // for the flux-case, we do the filtering here\n const filteredRequest = {\n ...request,\n targets: request.targets.filter((t) => t.hide !== true),\n };\n\n if (this.isFlux) {\n return super.query(filteredRequest);\n }\n\n if (this.isMigrationToggleOnAndIsAccessProxy()) {\n return super.query(filteredRequest).pipe(\n map((res) => {\n if (res.error) {\n throw {\n message: 'InfluxDB Error: ' + res.error.message,\n res,\n };\n }\n\n const seriesList: any[] = [];\n\n const groupedFrames = groupBy(res.data, (x) => x.refId);\n if (Object.keys(groupedFrames).length > 0) {\n filteredRequest.targets.forEach((target) => {\n const filteredFrames = groupedFrames[target.refId] ?? [];\n switch (target.resultFormat) {\n case 'logs':\n case 'table':\n seriesList.push(\n this.responseParser.getTable(filteredFrames, target, {\n preferredVisualisationType: target.resultFormat,\n })\n );\n break;\n default: {\n for (let i = 0; i < filteredFrames.length; i++) {\n seriesList.push(filteredFrames[i]);\n }\n break;\n }\n }\n });\n }\n\n return { data: seriesList };\n })\n );\n }\n\n // Fallback to classic query support\n return this.classicQuery(request);\n }\n\n getQueryDisplayText(query: InfluxQuery) {\n if (this.isFlux) {\n return query.query;\n }\n return new InfluxQueryModel(query).render(false);\n }\n\n /**\n * Returns false if the query should be skipped\n */\n filterQuery(query: InfluxQuery): boolean {\n if (this.isFlux) {\n return !!query.query;\n }\n return true;\n }\n\n applyTemplateVariables(query: InfluxQuery, scopedVars: ScopedVars): Record<string, any> {\n // We want to interpolate these variables on backend\n const { __interval, __interval_ms, ...rest } = scopedVars;\n\n if (this.isFlux) {\n return {\n ...query,\n query: this.templateSrv.replace(query.query ?? '', rest), // The raw query text\n };\n }\n\n if (config.featureToggles.influxdbBackendMigration && this.access === 'proxy') {\n query = this.applyVariables(query, scopedVars, rest);\n }\n\n return query;\n }\n\n /**\n * The unchanged pre 7.1 query implementation\n */\n classicQuery(options: any): Observable<DataQueryResponse> {\n // migrate annotations\n if (options.targets.some((target: InfluxQuery) => target.fromAnnotations)) {\n const streams: Array<Observable<DataQueryResponse>> = [];\n\n for (const target of options.targets) {\n if (target.query) {\n streams.push(\n new Observable((subscriber) => {\n this.annotationEvents(options, target)\n .then((events) => subscriber.next({ data: [toDataFrame(events)] }))\n .catch((ex) => subscriber.error(new Error(ex)))\n .finally(() => subscriber.complete());\n })\n );\n }\n }\n\n return merge(...streams);\n }\n\n let timeFilter = this.getTimeFilter(options);\n const scopedVars = options.scopedVars;\n const targets = cloneDeep(options.targets);\n const queryTargets: any[] = [];\n\n let i, y;\n\n let allQueries = _map(targets, (target) => {\n if (target.hide) {\n return '';\n }\n\n queryTargets.push(target);\n\n // backward compatibility\n scopedVars.interval = scopedVars.__interval;\n\n return new InfluxQueryModel(target, this.templateSrv, scopedVars).render(true);\n }).reduce((acc, current) => {\n if (current !== '') {\n acc += ';' + current;\n }\n return acc;\n });\n\n if (allQueries === '') {\n return of({ data: [] });\n }\n\n // add global adhoc filters to timeFilter\n const adhocFilters = this.templateSrv.getAdhocFilters(this.name);\n const adhocFiltersFromDashboard = options.targets.flatMap((target: InfluxQuery) => target.adhocFilters ?? []);\n if (adhocFilters?.length || adhocFiltersFromDashboard?.length) {\n const ahFilters = adhocFilters?.length ? adhocFilters : adhocFiltersFromDashboard;\n const tmpQuery = new InfluxQueryModel({ refId: 'A' }, this.templateSrv, scopedVars);\n timeFilter += ' AND ' + tmpQuery.renderAdhocFilters(ahFilters);\n }\n // replace grafana variables\n scopedVars.timeFilter = { value: timeFilter };\n\n // replace templated variables\n allQueries = this.templateSrv.replace(allQueries, scopedVars);\n\n return this._seriesQuery(allQueries, options).pipe(\n map((data: any) => {\n if (!data || !data.results) {\n return { data: [] };\n }\n\n const seriesList = [];\n for (i = 0; i < data.results.length; i++) {\n const result = data.results[i];\n if (!result || !result.series) {\n continue;\n }\n\n const target = queryTargets[i];\n let alias = target.alias;\n if (alias) {\n alias = this.templateSrv.replace(target.alias, options.scopedVars);\n }\n\n const meta: QueryResultMeta = {\n executedQueryString: data.executedQueryString,\n };\n\n const influxSeries = new InfluxSeries({\n refId: target.refId,\n series: data.results[i].series,\n alias: alias,\n meta,\n });\n\n switch (target.resultFormat) {\n case 'logs':\n meta.preferredVisualisationType = 'logs';\n case 'table': {\n seriesList.push(influxSeries.getTable());\n break;\n }\n default: {\n const timeSeries = influxSeries.getTimeSeries();\n for (y = 0; y < timeSeries.length; y++) {\n seriesList.push(timeSeriesToDataFrame(timeSeries[y]));\n }\n break;\n }\n }\n }\n\n return { data: seriesList };\n })\n );\n }\n\n async annotationEvents(options: DataQueryRequest, annotation: InfluxQuery): Promise<AnnotationEvent[]> {\n if (this.isFlux) {\n return Promise.reject({\n message: 'Flux requires the standard annotation query',\n });\n }\n\n // InfluxQL puts a query string on the annotation\n if (!annotation.query) {\n return Promise.reject({\n message: 'Query missing in annotation definition',\n });\n }\n\n if (config.featureToggles.influxdbBackendMigration && this.access === 'proxy') {\n // We want to send our query to the backend as a raw query\n const target: InfluxQuery = {\n refId: 'metricFindQuery',\n datasource: this.getRef(),\n query: this.templateSrv.replace(annotation.query, undefined, 'regex'),\n rawQuery: true,\n };\n\n return lastValueFrom(\n getBackendSrv()\n .fetch<BackendDataSourceResponse>({\n url: '/api/ds/query',\n method: 'POST',\n headers: this.getRequestHeaders(),\n data: {\n from: options.range.from.valueOf().toString(),\n to: options.range.to.valueOf().toString(),\n queries: [target],\n },\n requestId: annotation.name,\n })\n .pipe(\n map(\n async (res: FetchResponse<BackendDataSourceResponse>) =>\n await this.responseParser.transformAnnotationResponse(annotation, res, target)\n )\n )\n );\n }\n\n const timeFilter = this.getTimeFilter({ rangeRaw: options.range.raw, timezone: options.timezone });\n let query = annotation.query.replace('$timeFilter', timeFilter);\n query = this.templateSrv.replace(query, undefined, 'regex');\n\n return lastValueFrom(this._seriesQuery(query, options)).then((data: any) => {\n if (!data || !data.results || !data.results[0]) {\n throw { message: 'No results in response from InfluxDB' };\n }\n return new InfluxSeries({\n series: data.results[0].series,\n annotation: annotation,\n }).getAnnotations();\n });\n }\n\n targetContainsTemplate(target: any) {\n // for flux-mode we just take target.query,\n // for influxql-mode we use InfluxQueryModel to create the text-representation\n const queryText = this.isFlux ? target.query : buildRawQuery(target);\n\n return this.templateSrv.containsTemplate(queryText);\n }\n\n interpolateVariablesInQueries(queries: InfluxQuery[], scopedVars: ScopedVars): InfluxQuery[] {\n if (!queries || queries.length === 0) {\n return [];\n }\n\n return queries.map((query) => {\n if (this.isFlux) {\n return {\n ...query,\n datasource: this.getRef(),\n query: this.templateSrv.replace(query.query ?? '', scopedVars, 'regex'), // The raw query text\n };\n }\n\n return {\n ...query,\n datasource: this.getRef(),\n ...this.applyVariables(query, scopedVars, scopedVars),\n };\n });\n }\n\n applyVariables(query: InfluxQuery, scopedVars: ScopedVars, rest: ScopedVars) {\n const expandedQuery = { ...query };\n if (query.groupBy) {\n expandedQuery.groupBy = query.groupBy.map((groupBy) => {\n return {\n ...groupBy,\n params: groupBy.params?.map((param) => {\n return this.templateSrv.replace(param.toString(), undefined, 'regex');\n }),\n };\n });\n }\n\n if (query.select) {\n expandedQuery.select = query.select.map((selects) => {\n return selects.map((select: any) => {\n return {\n ...select,\n params: select.params?.map((param: any) => {\n return this.templateSrv.replace(param.toString(), undefined, 'regex');\n }),\n };\n });\n });\n }\n\n if (query.tags) {\n expandedQuery.tags = query.tags.map((tag) => {\n return {\n ...tag,\n value: this.templateSrv.replace(tag.value, scopedVars, 'regex'),\n };\n });\n }\n\n return {\n ...expandedQuery,\n adhocFilters: this.templateSrv.getAdhocFilters(this.name) ?? [],\n query: this.templateSrv.replace(query.query ?? '', rest, 'regex'), // The raw query text\n alias: this.templateSrv.replace(query.alias ?? '', scopedVars),\n limit: this.templateSrv.replace(query.limit?.toString() ?? '', scopedVars, 'regex'),\n measurement: this.templateSrv.replace(query.measurement ?? '', scopedVars, 'regex'),\n policy: this.templateSrv.replace(query.policy ?? '', scopedVars, 'regex'),\n slimit: this.templateSrv.replace(query.slimit?.toString() ?? '', scopedVars, 'regex'),\n tz: this.templateSrv.replace(query.tz ?? '', scopedVars),\n };\n }\n\n async metricFindQuery(query: string, options?: any): Promise<MetricFindValue[]> {\n if (this.isFlux || this.isMigrationToggleOnAndIsAccessProxy()) {\n const target: InfluxQuery = {\n refId: 'metricFindQuery',\n query,\n rawQuery: true,\n };\n return lastValueFrom(\n super.query({\n ...options, // includes 'range'\n targets: [target],\n } as DataQueryRequest)\n ).then((rsp) => {\n if (rsp.data?.length) {\n return frameToMetricFindValue(rsp.data[0]);\n }\n return [];\n });\n }\n\n const interpolated = this.templateSrv.replace(query, undefined, 'regex');\n\n return lastValueFrom(this._seriesQuery(interpolated, options)).then((resp) => {\n return this.responseParser.parse(query, resp);\n });\n }\n\n getTagKeys(options: any = {}) {\n const queryBuilder = new InfluxQueryBuilder({ measurement: options.measurement || '', tags: [] }, this.database);\n const query = queryBuilder.buildExploreQuery('TAG_KEYS');\n return this.metricFindQuery(query, options);\n }\n\n getTagValues(options: any = {}) {\n const queryBuilder = new InfluxQueryBuilder({ measurement: options.measurement || '', tags: [] }, this.database);\n const query = queryBuilder.buildExploreQuery('TAG_VALUES', options.key);\n return this.metricFindQuery(query, options);\n }\n\n _seriesQuery(query: string, options?: any) {\n if (!query) {\n return of({ results: [] });\n }\n\n if (options && options.range) {\n const timeFilter = this.getTimeFilter({ rangeRaw: options.range, timezone: options.timezone });\n query = query.replace('$timeFilter', timeFilter);\n }\n\n return this._influxRequest(this.httpMode, '/query', { q: query, epoch: 'ms' }, options);\n }\n\n serializeParams(params: any) {\n if (!params) {\n return '';\n }\n\n return reduce(\n params,\n (memo, value, key) => {\n if (value === null || value === undefined) {\n return memo;\n }\n memo.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));\n return memo;\n },\n [] as string[]\n ).join('&');\n }\n\n _influxRequest(method: string, url: string, data: any, options?: any) {\n const currentUrl = this.urls.shift()!;\n this.urls.push(currentUrl);\n\n const params: any = {};\n\n if (this.username) {\n params.u = this.username;\n params.p = this.password;\n }\n\n if (options && options.database) {\n params.db = options.database;\n } else if (this.database) {\n params.db = this.database;\n }\n\n const { q } = data;\n\n if (method === 'POST' && has(data, 'q')) {\n // verb is POST and 'q' param is defined\n extend(params, omit(data, ['q']));\n data = this.serializeParams(pick(data, ['q']));\n } else if (method === 'GET' || method === 'POST') {\n // verb is GET, or POST without 'q' param\n extend(params, data);\n data = null;\n }\n\n const req: any = {\n method: method,\n url: currentUrl + url,\n params: params,\n data: data,\n precision: 'ms',\n inspect: { type: 'influxdb' },\n paramSerializer: this.serializeParams,\n };\n\n req.headers = req.headers || {};\n if (this.basicAuth || this.withCredentials) {\n req.withCredentials = true;\n }\n if (this.basicAuth) {\n req.headers.Authorization = this.basicAuth;\n }\n\n if (method === 'POST') {\n req.headers['Content-type'] = 'application/x-www-form-urlencoded';\n }\n\n return getBackendSrv()\n .fetch(req)\n .pipe(\n map((result: any) => {\n const { data } = result;\n if (data) {\n data.executedQueryString = q;\n if (data.results) {\n const errors = result.data.results.filter((elem: any) => elem.error);\n\n if (errors.length > 0) {\n throw {\n message: 'InfluxDB Error: ' + errors[0].error,\n data,\n };\n }\n }\n }\n return data;\n }),\n catchError((err) => {\n if (err.cancelled) {\n return of(err);\n }\n\n return throwError(this.handleErrors(err));\n })\n );\n }\n\n handleErrors(err: any) {\n const error: DataQueryError = {\n message:\n (err && err.status) ||\n (err && err.message) ||\n 'Unknown error during query transaction. Please check JS console logs.',\n };\n\n if ((Number.isInteger(err.status) && err.status !== 0) || err.status >= 300) {\n if (err.data && err.data.error) {\n error.message = 'InfluxDB Error: ' + err.data.error;\n error.data = err.data;\n // @ts-ignore\n error.config = err.config;\n } else {\n error.message = 'Network Error: ' + err.statusText + '(' + err.status + ')';\n error.data = err.data;\n // @ts-ignore\n error.config = err.config;\n }\n }\n\n return error;\n }\n\n getTimeFilter(options: any) {\n const from = this.getInfluxTime(options.rangeRaw.from, false, options.timezone);\n const until = this.getInfluxTime(options.rangeRaw.to, true, options.timezone);\n\n return 'time >= ' + from + ' and time <= ' + until;\n }\n\n getInfluxTime(date: any, roundUp: any, timezone: any) {\n if (isString(date)) {\n if (date === 'now') {\n return 'now()';\n }\n\n const parts = /^now-(\\d+)([dhms])$/.exec(date);\n if (parts) {\n const amount = parseInt(parts[1], 10);\n const unit = parts[2];\n return 'now() - ' + amount + unit;\n }\n date = dateMath.parse(date, roundUp, timezone);\n }\n\n return date.valueOf() + 'ms';\n }\n\n isMigrationToggleOnAndIsAccessProxy() {\n return config.featureToggles.influxdbBackendMigration && this.access === 'proxy';\n }\n}\n","import { DataSourcePlugin } from '@grafana/data';\n\nimport ConfigEditor from './components/ConfigEditor';\nimport InfluxStartPage from './components/InfluxStartPage';\nimport { QueryEditor } from './components/QueryEditor';\nimport VariableQueryEditor from './components/VariableQueryEditor';\nimport InfluxDatasource from './datasource';\n\nexport const plugin = new DataSourcePlugin(InfluxDatasource)\n .setConfigEditor(ConfigEditor)\n .setQueryEditor(QueryEditor)\n .setVariableQueryEditor(VariableQueryEditor)\n .setQueryEditorHelp(InfluxStartPage);\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { QueryEditorProps } from '@grafana/data';\n\nimport InfluxDatasource from '../datasource';\nimport { buildRawQuery } from '../queryUtils';\nimport { InfluxOptions, InfluxQuery } from '../types';\n\nimport { FluxQueryEditor } from './FluxQueryEditor';\nimport { QueryEditorModeSwitcher } from './QueryEditorModeSwitcher';\nimport { RawInfluxQLEditor } from './RawInfluxQLEditor';\nimport { Editor as VisualInfluxQLEditor } from './VisualInfluxQLEditor/Editor';\n\ntype Props = QueryEditorProps<InfluxDatasource, InfluxQuery, InfluxOptions>;\n\nexport const QueryEditor = ({ query, onChange, onRunQuery, datasource, range, data }: Props): JSX.Element => {\n if (datasource.isFlux) {\n return (\n <div className=\"gf-form-query-content\">\n <FluxQueryEditor query={query} onChange={onChange} onRunQuery={onRunQuery} datasource={datasource} />\n </div>\n );\n }\n\n return (\n <div className={css({ display: 'flex' })}>\n <div className={css({ flexGrow: 1 })}>\n {query.rawQuery ? (\n <RawInfluxQLEditor query={query} onChange={onChange} onRunQuery={onRunQuery} />\n ) : (\n <VisualInfluxQLEditor query={query} onChange={onChange} onRunQuery={onRunQuery} datasource={datasource} />\n )}\n </div>\n <QueryEditorModeSwitcher\n isRaw={query.rawQuery ?? false}\n onChange={(value) => {\n onChange({ ...query, query: buildRawQuery(query), rawQuery: value });\n onRunQuery();\n }}\n />\n </div>\n );\n};\n"],"names":["BROWSER_MODE_DISABLED_MESSAGE","InfluxVersion","Input","SecretFormField","LegacyForms","httpModes","label","value","versions","InfluxQL","description","Flux","ConfigEditor","PureComponent","constructor","props","super","maxSeries","updateDatasourcePluginResetOption","this","selected","options","onOptionsChange","copy","jsonData","version","access","basicAuth","httpMode","user","database","state","toString","htmlPrefix","uniqueId","renderInflux2x","secureJsonFields","secureJsonData","className","htmlFor","id","organization","onChange","onUpdateDatasourceJsonDataOption","isConfigured","Boolean","token","labelWidth","inputWidth","onReset","onResetToken","onUpdateDatasourceSecureJsonDataOption","placeholder","defaultBucket","tooltip","timeInterval","renderInflux1x","InfoBox","onUpdateDatasourceOption","password","onResetPassword","Select","inputId","find","defaultValue","onUpdateDatasourceJsonDataOptionSelect","render","isDirectAccess","onVersionChanged","href","Alert","title","severity","DataSourceHttpSettings","showAccessOptions","dataSourceConfig","defaultUrl","InlineField","type","event","setState","currentTarget","val","parseInt","updateDatasourcePluginJsonDataOption","Number","isFinite","undefined","CHEAT_SHEET_ITEMS","map","item","InfluxStartPage","onClickExample","index","categories","Aggregations","Selectors","Transformations","Predictors","Math","Aliasing","Fields","createPart","part","def","message","QueryPart","register","QueryPartDef","category","push","groupByTimeFunctions","fieldRenderer","innerExpr","params","replaceAggregationAddStrategy","selectParts","partModel","i","length","morePartsAvailable","splice","addTransformationStrategy","addStrategy","query","parts","clone","selectModels","dynamicLookup","defaultParams","renderer","functionRenderer","name","partCount","suffixRenderer","quote","renderMode","create","getCategories","replaceAggregationAdd","InfluxQueryModel","target","templateSrv","scopedVars","policy","resultFormat","orderByTime","tags","groupBy","select","updateProjection","queryPart","groupByParts","updatePersistedParts","hasGroupByTime","g","hasFill","addGroupBy","stringParts","match","typePart","arg","removeGroupByPart","filter","s","removeSelect","removeSelectPart","modelsIndex","indexOf","partIndex","addSelectPart","renderTagCondition","tag","interpolate","str","operator","condition","test","replace","key","getMeasurementAndPolicy","measurement","interpolateQueryStr","variable","defaultFormatFn","multi","includeAll","kbn","join","rawQuery","y","selectText","conditions","groupBySection","fill","limit","slimit","tz","renderAdhocFilters","filters","buildRawQuery","queryCopy","cloneDeep","samples","UnthemedFluxQueryEditor","onRunQuery","forceUpdate","sugs","kind","CodeEditorSuggestionItemKind","detail","getTemplateSrv","getVariables","forEach","editor","setTimeout","layout","theme","styles","getStyles","helpTooltip","CodeEditor","height","containerStyles","editorContainerStyles","language","onBlur","onFluxQueryChange","onSave","showMiniMap","showLineNumbers","getSuggestions","onEditorDidMount","editorDidMountCallbackHack","cx","editorActions","icon","variant","Segment","onSampleChange","width","css","isDark","colors","background","canvas","primary","spacing","FluxQueryEditor","withTheme2","QueryEditorModeSwitcher","isRaw","isModalOpen","setModalOpen","useState","useEffect","Button","onClick","ConfirmModal","isOpen","body","confirmText","dismissText","onConfirm","onDismiss","RESULT_FORMATS","DEFAULT_RESULT_FORMAT","useShadowedState","outsideVal","currentVal","setCurrentVal","prevOutsideVal","usePrevious","RawInfluxQLEditor","currentQuery","setCurrentQuery","currentAlias","setCurrentAlias","alias","aliasElementId","useUniqueId","selectElementId","applyDelayedChangesAndRunQuery","TextArea","rows","spellCheck","e","v","I","InfluxQueryBuilder","buildExploreQuery","withKey","withMeasurementFilter","whereConditions","reduce","memo","runExploreQuery","datasource","q","metricFindQuery","async","getTagKeysForMeasurementAndTags","text","paddingRightClass","paddingRight","unwrap","Error","FormatAsSection","format","selectClass","minWidth","formatCreateLabel","SelReload","loadOptions","allowCustomValue","onClose","debouncedLoadOptions","debouncePromise","leading","defaultOptions","autoFocus","onCloseMenu","SelSingleLoad","loadState","doLoad","useAsyncFn","isLoading","loading","Sel","filterByLoadOptions","Inp","initialValue","currentValue","setCurrentValue","onKeyDown","defaultButtonClass","cursor","Seg","buttonClassName","setOpen","InlineLabel","as","toSelectableValue","t","FromSection","getPolicyOptions","getMeasurementOptions","allPolicies","some","p","InputSection","isWide","OPTIONS","OrderByTimeSection","AddButton","onAdd","noRightMarginPaddingClass","marginRight","RemovableName","onRemove","WithContextMenu","renderMenuItems","renderRemovableNameMenuItems","MenuGroup","MenuItem","openMenu","noHorizMarginPaddingClass","paddingLeft","marginLeft","Part","useTheme2","partClass","useMemo","lineHeight","typography","fontSize","getPartClass","isLast","then","items","par","newParams","onParamChange","PartListSection","getNewPartOptions","onAddNewPart","onRemovePart","pars","isRegex","getOperator","getCondition","isFirst","adjustOperatorIfNeeded","currentOperator","newTagValue","isCurrentOperatorRegex","operatorOptions","condititonOptions","loadConditionOptions","Promise","resolve","loadOperatorOptions","Tag","getTagKeyOptions","getTagValueOptions","catch","err","console","error","op","TagsSection","newT","newTag","newTags","onTagChange","onTagRemove","tagKey","minimalTag","addNewTag","getPartParams","dynamicParamOptions","paramValues","defParam","get","makePartList","queryParts","qp","withTemplateVariableOptions","optionsPromise","filterTags","allTagKeys","has","Editor","formatAsId","orderByTimeId","useStyles2","normalizeQuery","Set","selectLists","dynamicSelectPartOptions","Map","getFieldKeysForMeasurement","sel","getTagKeys","keys","groupByList","dynamicGroupByPartOptions","onAppliedChange","newQuery","SegmentSection","getAllPolicies","measurementFilter","getAllMeasurementsForTags","m","inlineLabel","getTagValues","Object","children","x","getNewSelectPartOptions","listIndex","newSel","changeSelectPart","model","addNewSelectPart","selectModel","tagKeys","getNewGroupByPartOptions","newGroupBy","changeGroupByPart","addNewGroupByPart","VariableQueryEditor","isFlux","refId","onRefresh","AnnotationEditor","eventQuery","setEventQuery","textColumn","setTextColumn","tagsColumn","setTagsColumn","timeEndColumn","setTimeEndColumn","titleColumn","updateValue","fromAnnotations","textEditor","InfluxSeries","series","annotation","meta","getTimeSeries","output","j","each","columns","seriesName","columnName","_getSeriesName","datapoints","values","segments","split","g1","g2","group","segIndex","isNaN","getAnnotations","list","titleCol","timeCol","timeEndCol","tagsCol","textCol","column","includes","data","time","Date","timeEnd","flatten","getTable","table","TableModel","seriesIndex","firstCol","firstTableCol","FieldType","reordered","hasOwnProperty","prepareAnnotation","json","queryType","migrateLegacyAnnotation","ResponseParser","parse","results","influxResults","normalizedQuery","toLowerCase","isValueFirst","res","serie","isArray","addUnique","Array","from","dfs","executedQueryString","selectedParams","allParams","selector","uniqueParams","param","incrementName","getSelectedParams","fields","field","labels","getTableCols","dfsByLabels","df","getTableRows","rsp","toDataQueryResponse","colText","colContainsTag","toArray","metrics","nameIncremenet","add","getFieldType","firstNotNull","valueType","timeSeriesToDataFrame","timeSeries","times","points","point","TIME_SERIES_TIME_FIELD_NAME","config","ArrayVector","TIME_SERIES_VALUE_FIELD_NAME","displayNameFromDS","InfluxDatasource","DataSourceWithBackend","instanceSettings","urls","url","trim","username","withCredentials","settingsData","interval","responseParser","isProxyAccess","annotations","QueryEditor","request","throwError","filteredRequest","targets","hide","isMigrationToggleOnAndIsAccessProxy","pipe","seriesList","groupedFrames","filteredFrames","preferredVisualisationType","classicQuery","getQueryDisplayText","filterQuery","applyTemplateVariables","rest","applyVariables","streams","Observable","subscriber","annotationEvents","events","next","toDataFrame","ex","finally","complete","merge","timeFilter","getTimeFilter","queryTargets","allQueries","_map","__interval","acc","current","of","adhocFilters","getAdhocFilters","adhocFiltersFromDashboard","flatMap","ahFilters","_seriesQuery","result","influxSeries","reject","getRef","lastValueFrom","getBackendSrv","fetch","method","headers","getRequestHeaders","range","valueOf","to","queries","requestId","transformAnnotationResponse","rangeRaw","raw","timezone","targetContainsTemplate","queryText","containsTemplate","interpolateVariablesInQueries","expandedQuery","selects","frameToMetricFindValue","interpolated","resp","_influxRequest","epoch","serializeParams","encodeURIComponent","currentUrl","shift","u","db","extend","omit","pick","req","precision","inspect","paramSerializer","Authorization","errors","elem","catchError","cancelled","handleErrors","status","isInteger","statusText","getInfluxTime","date","roundUp","isString","exec","dateMath","plugin","DataSourcePlugin","setConfigEditor","setQueryEditor","display","flexGrow","setVariableQueryEditor","setQueryEditorHelp"],"sourceRoot":""}