{"version":3,"sources":["webpack:///./public/app/plugins/datasource/influxdb/influx_series.ts","webpack:///./public/app/plugins/datasource/influxdb/query_part.ts","webpack:///./public/app/plugins/datasource/influxdb/influx_query_model.ts","webpack:///./public/app/plugins/datasource/influxdb/response_parser.ts","webpack:///./public/app/plugins/datasource/influxdb/query_builder.ts","webpack:///./public/app/plugins/datasource/influxdb/datasource.ts","webpack:///./public/app/plugins/datasource/influxdb/query_ctrl.ts","webpack:///./public/app/features/explore/AdHocFilter.tsx","webpack:///./public/app/features/explore/AdHocFilterField.tsx","webpack:///./public/app/plugins/datasource/influxdb/components/InfluxLogsQueryField.tsx","webpack:///./public/app/plugins/datasource/influxdb/components/InfluxCheatSheet.tsx","webpack:///./public/app/plugins/datasource/influxdb/components/InfluxStartPage.tsx","webpack:///./public/app/plugins/datasource/influxdb/components/ConfigEditor.tsx","webpack:///./public/app/plugins/datasource/influxdb/module.ts"],"names":["InfluxSeries","options","this","series","alias","annotation","i","j","output","length","_","each","columns","tags","map","value","key","seriesName","name","columnName","_getSeriesName","join","datapoints","values","push","target","index","segments","split","replace","match","g1","g2","group","segIndex","parseInt","isNaN","indexOf","tag","list","titleCol","timeCol","tagsCol","textCol","column","titleColumn","includes","tagsColumn","textColumn","data","time","Date","title","flatten","filter","t","text","table","TableModel","seriesIndex","type","FieldType","keys","reordered","hasOwnProperty","rows","categories","Aggregations","Selectors","Transformations","Predictors","Math","Aliasing","Fields","createPart","part","def","message","QueryPart","register","QueryPartDef","category","groupByTimeFunctions","fieldRenderer","innerExpr","params","replaceAggregationAddStrategy","selectParts","partModel","morePartsAvailable","splice","addTransformationStrategy","addStrategy","query","parts","clone","selectModels","dynamicLookup","defaultParams","renderer","functionRenderer","partCount","suffixRenderer","quote","renderMode","create","getCategories","replaceAggregationAdd","InfluxQueryModel","templateSrv","scopedVars","policy","resultFormat","orderByTime","groupBy","select","updateProjection","queryPart","groupByParts","find","g","stringParts","typePart","arg","s","modelsIndex","partIndex","updatePersistedParts","interpolate","str","operator","condition","test","measurement","variable","defaultFormatFn","multi","includeAll","kbn","regexEscape","rawQuery","interpolateQueryStr","y","selectText","render","getMeasurementAndPolicy","conditions","renderTagCondition","groupBySection","fill","limit","slimit","tz","filters","ResponseParser","results","influxResults","normalizedQuery","toLowerCase","isValueFirst","res","serie","isArray","addUnique","undefined","toString","arr","InfluxQueryBuilder","database","withKey","withMeasurementFilter","whereConditions","reduce","memo","InfluxDatasource","instanceSettings","urls","url","trim","username","password","basicAuth","withCredentials","settingsData","jsonData","interval","timeInterval","httpMode","responseParser","queryModel","timeFilter","getTimeFilter","targets","cloneDeep","queryTargets","allQueries","hide","__interval","acc","current","Promise","resolve","adhocFilters","getAdhocFilters","renderAdhocFilters","_seriesQuery","then","seriesList","result","influxSeries","getTable","timeSeries","getTimeSeries","reject","rangeRaw","timezone","getAnnotations","param","variableExists","queries","expandedQueries","expandedQuery","datasource","expandedTags","interpolated","resp","parse","queryBuilder","buildExploreQuery","metricFindQuery","range","_influxRequest","q","epoch","encodeURIComponent","error","get","status","catch","err","method","currentUrl","shift","u","p","db","has","extend","omit","serializeParams","pick","req","precision","inspect","paramSerializer","headers","Authorization","getBackendSrv","datasourceRequest","Number","isInteger","config","statusText","from","getInfluxTime","until","to","fromIsAbsolute","date","roundUp","isString","exec","dateMath","valueOf","DataSourceApi","InfluxQueryCtrl","$scope","$injector","uiSegmentSrv","panel","groupBySegment","newPlusButton","resultFormats","policySegment","newSegment","measurementSegment","newSelectMeasurement","tagSegments","newCondition","newKey","newOperator","newKeyValue","fixTagSegments","buildSelectMenu","removeTagFilterSegment","fake","selectMenu","cat","menu","submenu","item","hasFill","hasGroupByTime","handleQueryError","bind","addGroupBy","plusButton","html","panelCtrl","refresh","subitem","addSelectPart","evt","fieldsQuery","transformToSegments","removeSelectPart","tagsQuery","removeGroupByPart","count","lastSegment","max","policiesQuery","console","log","measurementFilter","addTemplateVars","segment","expandable","variables","unshift","nextValue","newOperators","angular","copy","newFake","cssClass","rebuildTargetTagConditions","tagIndex","tagOperator","segment2","getTagValueOperator","tagValue","QueryCtrl","templateUrl","ChangeType","AdHocFilter","props","useContext","ThemeContext","styles","keyValueContainer","css","onChange","changeType","onKeyChanged","onValueChanged","onOperatorChanged","Key","Operator","Value","stringToOption","label","initialKey","keysPlaceHolder","initialOperator","initialValue","valuesPlaceHolder","keysAsOptions","selectedKey","option","valuesAsOptions","selectedValue","operatorsAsOptions","selectedOperator","className","cx","isSearchable","placeholder","DEFAULT_REMOVE_FILTER_VALUE","addFilterButton","onAddFilter","onClick","AdHocFilterField","state","pairs","loadTagKeys","extendedOptions","getTagKeys","tagKeys","tagKey","loadTagValues","getTagValues","tagValues","onPairsChanged","updatePairs","setState","onRemoveFilter","concat","allPairs","pair","pairIndex","prevProps","isEqual","newPairs","newPair","adHocKey","React","PureComponent","pairsAreValid","every","allDefined","allEmpty","InfluxLogsQueryField","TemplateSrv","measurements","field","onMeasurementsChange","onRunQuery","measureMentsQuery","influxMeasurements","measurementObj","influxFields","fields","children","cascadeText","getChooserText","hasMeasurement","disabled","CHEAT_SHEET_ITEMS","InfluxStartPage","InfluxCheatSheet","onClickExample","httpModes","ConfigEditor","onResetPassword","updateDatasourcePluginResetOption","onOptionsChange","secureJsonFields","secureJsonData","showAccessOptions","dataSourceConfig","defaultUrl","onUpdateDatasourceOption","user","isConfigured","labelWidth","inputWidth","onReset","onUpdateDatasourceSecureJsonDataOption","tooltip","defaultValue","onUpdateDatasourceJsonDataOptionSelect","onUpdateDatasourceJsonDataOption","InfluxAnnotationsQueryCtrl","plugin","DataSourcePlugin","setConfigEditor","setQueryCtrl","setAnnotationQueryCtrl","setExploreLogsQueryField","setExploreStartPage"],"mappings":"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","file":"influxdbPlugin.a2a620545dc45e05493f.js","sourcesContent":["import _ from 'lodash';\nimport TableModel from 'app/core/table_model';\nimport { FieldType } from '@grafana/data';\n\nexport default class InfluxSeries {\n series: any;\n alias: any;\n annotation: any;\n\n constructor(options: { series: any; alias?: any; annotation?: any }) {\n this.series = options.series;\n this.alias = options.alias;\n this.annotation = options.annotation;\n }\n\n getTimeSeries() {\n const output: any[] = [];\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({ target: seriesName, datapoints: datapoints });\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];\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 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 // 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 // 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() {\n const table = new TableModel();\n let i, j;\n\n if (this.series.length === 0) {\n return table;\n }\n\n _.each(this.series, (series: any, seriesIndex: number) => {\n if (seriesIndex === 0) {\n j = 0;\n // Check that the first column is indeed 'time'\n if (series.columns[0] === 'time') {\n // Push this now before the tags and with the right type\n table.columns.push({ text: 'Time', type: FieldType.time });\n j++;\n }\n _.each(_.keys(series.tags), key => {\n table.columns.push({ text: key });\n });\n for (; 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","import _ from 'lodash';\nimport { QueryPartDef, QueryPart, functionRenderer, suffixRenderer } from 'app/core/components/query_part/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 _ from 'lodash';\nimport queryPart from './query_part';\nimport kbn from 'app/core/utils/kbn';\nimport { InfluxQuery, InfluxQueryTag } from './types';\nimport { ScopedVars } from '@grafana/data';\nimport { TemplateSrv } from 'app/features/templating/template_srv';\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 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 _ from 'lodash';\n\nexport default class ResponseParser {\n parse(query: string, results: { results: any }) {\n if (!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 = {};\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 // @ts-ignore problems with typings for this _.map only accepts [] but this needs to be object\n return _.map(res, value => {\n // @ts-ignore\n return { text: value.toString() };\n });\n }\n}\n\nfunction addUnique(arr: { [x: string]: any }, value: string | number) {\n arr[value] = value;\n}\n","import _ from 'lodash';\nimport kbn from 'app/core/utils/kbn';\n\nfunction renderTagCondition(tag: { operator: any; value: string; condition: any; key: string }, index: number) {\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 number\n if (operator !== '=~' && operator !== '!~' && isNaN(+value)) {\n value = \"'\" + value + \"'\";\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) {\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 query += ' WITH MEASUREMENT =~ /' + 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 memo.push(renderTagCondition(tag, memo.length));\n return memo;\n },\n []\n );\n\n if (whereConditions.length > 0) {\n query += ' WHERE ' + whereConditions.join(' ');\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 return query;\n }\n}\n","import _ from 'lodash';\n\nimport { dateMath, DataSourceApi, DataSourceInstanceSettings, ScopedVars } from '@grafana/data';\nimport InfluxSeries from './influx_series';\nimport InfluxQueryModel from './influx_query_model';\nimport ResponseParser from './response_parser';\nimport { InfluxQueryBuilder } from './query_builder';\nimport { InfluxQuery, InfluxOptions } from './types';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { TemplateSrv } from 'app/features/templating/template_srv';\n\nexport default class InfluxDatasource extends DataSourceApi {\n type: string;\n urls: any;\n username: string;\n password: string;\n name: string;\n database: any;\n basicAuth: any;\n withCredentials: any;\n interval: any;\n responseParser: any;\n httpMode: string;\n\n /** @ngInject */\n constructor(instanceSettings: DataSourceInstanceSettings, private templateSrv: TemplateSrv) {\n super(instanceSettings);\n this.type = 'influxdb';\n this.urls = _.map(instanceSettings.url.split(','), 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 const settingsData = instanceSettings.jsonData || ({} as InfluxOptions);\n this.interval = settingsData.timeInterval;\n this.httpMode = settingsData.httpMode || 'GET';\n this.responseParser = new ResponseParser();\n }\n\n query(options: any) {\n let timeFilter = this.getTimeFilter(options);\n const scopedVars = options.scopedVars;\n const targets = _.cloneDeep(options.targets);\n const queryTargets: any[] = [];\n let queryModel: InfluxQueryModel;\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 queryModel = new InfluxQueryModel(target, this.templateSrv, scopedVars);\n return queryModel.render(true);\n }).reduce((acc, current) => {\n if (current !== '') {\n acc += ';' + current;\n }\n return acc;\n });\n\n if (allQueries === '') {\n return Promise.resolve({ data: [] });\n }\n\n // add global adhoc filters to timeFilter\n const adhocFilters = this.templateSrv.getAdhocFilters(this.name);\n if (adhocFilters.length > 0) {\n timeFilter += ' AND ' + queryModel.renderAdhocFilters(adhocFilters);\n }\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).then((data: any): any => {\n if (!data || !data.results) {\n return [];\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 influxSeries = new InfluxSeries({\n series: data.results[i].series,\n alias: alias,\n });\n\n switch (target.resultFormat) {\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(timeSeries[y]);\n }\n break;\n }\n }\n }\n\n return { data: seriesList };\n });\n }\n\n annotationQuery(options: any) {\n if (!options.annotation.query) {\n return Promise.reject({\n message: 'Query missing in annotation definition',\n });\n }\n\n const timeFilter = this.getTimeFilter({ rangeRaw: options.rangeRaw, timezone: options.timezone });\n let query = options.annotation.query.replace('$timeFilter', timeFilter);\n query = this.templateSrv.replace(query, null, 'regex');\n\n return 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: options.annotation,\n }).getAnnotations();\n });\n }\n\n targetContainsTemplate(target: any) {\n for (const group of target.groupBy) {\n for (const param of group.params) {\n if (this.templateSrv.variableExists(param)) {\n return true;\n }\n }\n }\n\n for (const i in target.tags) {\n if (this.templateSrv.variableExists(target.tags[i].value)) {\n return true;\n }\n }\n\n return false;\n }\n\n interpolateVariablesInQueries(queries: InfluxQuery[], scopedVars: ScopedVars): InfluxQuery[] {\n if (!queries || queries.length === 0) {\n return [];\n }\n\n let expandedQueries = queries;\n if (queries && queries.length > 0) {\n expandedQueries = queries.map(query => {\n const expandedQuery = {\n ...query,\n datasource: this.name,\n measurement: this.templateSrv.replace(query.measurement, scopedVars, 'regex'),\n };\n\n if (query.rawQuery) {\n expandedQuery.query = this.templateSrv.replace(query.query, scopedVars, 'regex');\n }\n\n if (query.tags) {\n const expandedTags = query.tags.map(tag => {\n const expandedTag = {\n ...tag,\n value: this.templateSrv.replace(tag.value, null, 'regex'),\n };\n return expandedTag;\n });\n expandedQuery.tags = expandedTags;\n }\n return expandedQuery;\n });\n }\n return expandedQueries;\n }\n\n metricFindQuery(query: string, options?: any) {\n const interpolated = this.templateSrv.replace(query, null, 'regex');\n\n return 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 Promise.resolve({ 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 []\n ).join('&');\n }\n\n testDatasource() {\n const queryBuilder = new InfluxQueryBuilder({ measurement: '', tags: [] }, this.database);\n const query = queryBuilder.buildExploreQuery('RETENTION POLICIES');\n\n return this._seriesQuery(query)\n .then((res: any) => {\n const error = _.get(res, 'results[0].error');\n if (error) {\n return { status: 'error', message: error };\n }\n return { status: 'success', message: 'Data source is working' };\n })\n .catch((err: any) => {\n return { status: 'error', message: err.message };\n });\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 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 .datasourceRequest(req)\n .then(\n (result: any) => {\n return result.data;\n },\n (err: any) => {\n if ((Number.isInteger(err.status) && err.status !== 0) || err.status >= 300) {\n if (err.data && err.data.error) {\n throw {\n message: 'InfluxDB Error: ' + err.data.error,\n data: err.data,\n config: err.config,\n };\n } else {\n throw {\n message: 'Network Error: ' + err.statusText + '(' + err.status + ')',\n data: err.data,\n config: err.config,\n };\n }\n } else {\n throw err;\n }\n }\n );\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 const fromIsAbsolute = from[from.length - 1] === 'ms';\n\n if (until === 'now()' && !fromIsAbsolute) {\n return 'time >= ' + from;\n }\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","import angular, { auto } from 'angular';\nimport _ from 'lodash';\nimport { InfluxQueryBuilder } from './query_builder';\nimport InfluxQueryModel from './influx_query_model';\nimport queryPart from './query_part';\nimport { QueryCtrl } from 'app/plugins/sdk';\nimport { TemplateSrv } from 'app/features/templating/template_srv';\n\nexport class InfluxQueryCtrl extends QueryCtrl {\n static templateUrl = 'partials/query.editor.html';\n\n queryModel: InfluxQueryModel;\n queryBuilder: any;\n groupBySegment: any;\n resultFormats: any[];\n orderByTime: any[];\n policySegment: any;\n tagSegments: any[];\n selectMenu: any;\n measurementSegment: any;\n removeTagFilterSegment: any;\n\n /** @ngInject */\n constructor(\n $scope: any,\n $injector: auto.IInjectorService,\n private templateSrv: TemplateSrv,\n private uiSegmentSrv: any\n ) {\n super($scope, $injector);\n this.target = this.target;\n this.queryModel = new InfluxQueryModel(this.target, templateSrv, this.panel.scopedVars);\n this.queryBuilder = new InfluxQueryBuilder(this.target, this.datasource.database);\n this.groupBySegment = this.uiSegmentSrv.newPlusButton();\n this.resultFormats = [\n { text: 'Time series', value: 'time_series' },\n { text: 'Table', value: 'table' },\n ];\n this.policySegment = uiSegmentSrv.newSegment(this.target.policy);\n\n if (!this.target.measurement) {\n this.measurementSegment = uiSegmentSrv.newSelectMeasurement();\n } else {\n this.measurementSegment = uiSegmentSrv.newSegment(this.target.measurement);\n }\n\n this.tagSegments = [];\n for (const tag of this.target.tags) {\n if (!tag.operator) {\n if (/^\\/.*\\/$/.test(tag.value)) {\n tag.operator = '=~';\n } else {\n tag.operator = '=';\n }\n }\n\n if (tag.condition) {\n this.tagSegments.push(uiSegmentSrv.newCondition(tag.condition));\n }\n\n this.tagSegments.push(uiSegmentSrv.newKey(tag.key));\n this.tagSegments.push(uiSegmentSrv.newOperator(tag.operator));\n this.tagSegments.push(uiSegmentSrv.newKeyValue(tag.value));\n }\n\n this.fixTagSegments();\n this.buildSelectMenu();\n this.removeTagFilterSegment = uiSegmentSrv.newSegment({\n fake: true,\n value: '-- remove tag filter --',\n });\n }\n\n removeOrderByTime() {\n this.target.orderByTime = 'ASC';\n }\n\n buildSelectMenu() {\n const categories = queryPart.getCategories();\n this.selectMenu = _.reduce(\n categories,\n (memo, cat, key) => {\n const menu = {\n text: key,\n submenu: cat.map((item: any) => {\n return { text: item.type, value: item.type };\n }),\n };\n memo.push(menu);\n return memo;\n },\n []\n );\n }\n\n getGroupByOptions() {\n const query = this.queryBuilder.buildExploreQuery('TAG_KEYS');\n\n return this.datasource\n .metricFindQuery(query)\n .then((tags: any) => {\n const options = [];\n if (!this.queryModel.hasFill()) {\n options.push(this.uiSegmentSrv.newSegment({ value: 'fill(null)' }));\n }\n if (!this.target.limit) {\n options.push(this.uiSegmentSrv.newSegment({ value: 'LIMIT' }));\n }\n if (!this.target.slimit) {\n options.push(this.uiSegmentSrv.newSegment({ value: 'SLIMIT' }));\n }\n if (!this.target.tz) {\n options.push(this.uiSegmentSrv.newSegment({ value: 'tz' }));\n }\n if (this.target.orderByTime === 'ASC') {\n options.push(this.uiSegmentSrv.newSegment({ value: 'ORDER BY time DESC' }));\n }\n if (!this.queryModel.hasGroupByTime()) {\n options.push(this.uiSegmentSrv.newSegment({ value: 'time($interval)' }));\n }\n for (const tag of tags) {\n options.push(this.uiSegmentSrv.newSegment({ value: 'tag(' + tag.text + ')' }));\n }\n return options;\n })\n .catch(this.handleQueryError.bind(this));\n }\n\n groupByAction() {\n switch (this.groupBySegment.value) {\n case 'LIMIT': {\n this.target.limit = 10;\n break;\n }\n case 'SLIMIT': {\n this.target.slimit = 10;\n break;\n }\n case 'tz': {\n this.target.tz = 'UTC';\n break;\n }\n case 'ORDER BY time DESC': {\n this.target.orderByTime = 'DESC';\n break;\n }\n default: {\n this.queryModel.addGroupBy(this.groupBySegment.value);\n }\n }\n\n const plusButton = this.uiSegmentSrv.newPlusButton();\n this.groupBySegment.value = plusButton.value;\n this.groupBySegment.html = plusButton.html;\n this.panelCtrl.refresh();\n }\n\n addSelectPart(selectParts: any, cat: any, subitem: { value: any }) {\n this.queryModel.addSelectPart(selectParts, subitem.value);\n this.panelCtrl.refresh();\n }\n\n handleSelectPartEvent(selectParts: any, part: any, evt: { name: any }) {\n switch (evt.name) {\n case 'get-param-options': {\n const fieldsQuery = this.queryBuilder.buildExploreQuery('FIELDS');\n return this.datasource\n .metricFindQuery(fieldsQuery)\n .then(this.transformToSegments(true))\n .catch(this.handleQueryError.bind(this));\n }\n case 'part-param-changed': {\n this.panelCtrl.refresh();\n break;\n }\n case 'action': {\n this.queryModel.removeSelectPart(selectParts, part);\n this.panelCtrl.refresh();\n break;\n }\n case 'get-part-actions': {\n return Promise.resolve([{ text: 'Remove', value: 'remove-part' }]);\n }\n }\n }\n\n handleGroupByPartEvent(part: any, index: any, evt: { name: any }) {\n switch (evt.name) {\n case 'get-param-options': {\n const tagsQuery = this.queryBuilder.buildExploreQuery('TAG_KEYS');\n return this.datasource\n .metricFindQuery(tagsQuery)\n .then(this.transformToSegments(true))\n .catch(this.handleQueryError.bind(this));\n }\n case 'part-param-changed': {\n this.panelCtrl.refresh();\n break;\n }\n case 'action': {\n this.queryModel.removeGroupByPart(part, index);\n this.panelCtrl.refresh();\n break;\n }\n case 'get-part-actions': {\n return Promise.resolve([{ text: 'Remove', value: 'remove-part' }]);\n }\n }\n }\n\n fixTagSegments() {\n const count = this.tagSegments.length;\n const lastSegment = this.tagSegments[Math.max(count - 1, 0)];\n\n if (!lastSegment || lastSegment.type !== 'plus-button') {\n this.tagSegments.push(this.uiSegmentSrv.newPlusButton());\n }\n }\n\n measurementChanged() {\n this.target.measurement = this.measurementSegment.value;\n this.panelCtrl.refresh();\n }\n\n getPolicySegments() {\n const policiesQuery = this.queryBuilder.buildExploreQuery('RETENTION POLICIES');\n return this.datasource\n .metricFindQuery(policiesQuery)\n .then(this.transformToSegments(false))\n .catch(this.handleQueryError.bind(this));\n }\n\n policyChanged() {\n this.target.policy = this.policySegment.value;\n this.panelCtrl.refresh();\n }\n\n toggleEditorMode() {\n try {\n this.target.query = this.queryModel.render(false);\n } catch (err) {\n console.log('query render error');\n }\n this.target.rawQuery = !this.target.rawQuery;\n }\n\n getMeasurements(measurementFilter: any) {\n const query = this.queryBuilder.buildExploreQuery('MEASUREMENTS', undefined, measurementFilter);\n return this.datasource\n .metricFindQuery(query)\n .then(this.transformToSegments(true))\n .catch(this.handleQueryError.bind(this));\n }\n\n handleQueryError(err: any): any[] {\n this.error = err.message || 'Failed to issue metric query';\n return [];\n }\n\n transformToSegments(addTemplateVars: any) {\n return (results: any) => {\n const segments = _.map(results, segment => {\n return this.uiSegmentSrv.newSegment({\n value: segment.text,\n expandable: segment.expandable,\n });\n });\n\n if (addTemplateVars) {\n for (const variable of this.templateSrv.variables) {\n segments.unshift(\n this.uiSegmentSrv.newSegment({\n type: 'value',\n value: '/^$' + variable.name + '$/',\n expandable: true,\n })\n );\n }\n }\n\n return segments;\n };\n }\n\n getTagsOrValues(segment: { type: string }, index: number) {\n if (segment.type === 'condition') {\n return Promise.resolve([this.uiSegmentSrv.newSegment('AND'), this.uiSegmentSrv.newSegment('OR')]);\n }\n if (segment.type === 'operator') {\n const nextValue = this.tagSegments[index + 1].value;\n if (/^\\/.*\\/$/.test(nextValue)) {\n return Promise.resolve(this.uiSegmentSrv.newOperators(['=~', '!~']));\n } else {\n return Promise.resolve(this.uiSegmentSrv.newOperators(['=', '!=', '<>', '<', '>']));\n }\n }\n\n let query, addTemplateVars;\n if (segment.type === 'key' || segment.type === 'plus-button') {\n query = this.queryBuilder.buildExploreQuery('TAG_KEYS');\n addTemplateVars = false;\n } else if (segment.type === 'value') {\n query = this.queryBuilder.buildExploreQuery('TAG_VALUES', this.tagSegments[index - 2].value);\n addTemplateVars = true;\n }\n\n return this.datasource\n .metricFindQuery(query)\n .then(this.transformToSegments(addTemplateVars))\n .then((results: any) => {\n if (segment.type === 'key') {\n results.splice(0, 0, angular.copy(this.removeTagFilterSegment));\n }\n return results;\n })\n .catch(this.handleQueryError.bind(this));\n }\n\n getFieldSegments() {\n const fieldsQuery = this.queryBuilder.buildExploreQuery('FIELDS');\n return this.datasource\n .metricFindQuery(fieldsQuery)\n .then(this.transformToSegments(false))\n .catch(this.handleQueryError);\n }\n\n tagSegmentUpdated(segment: { value: any; type: string; cssClass: string }, index: number) {\n this.tagSegments[index] = segment;\n\n // handle remove tag condition\n if (segment.value === this.removeTagFilterSegment.value) {\n this.tagSegments.splice(index, 3);\n if (this.tagSegments.length === 0) {\n this.tagSegments.push(this.uiSegmentSrv.newPlusButton());\n } else if (this.tagSegments.length > 2) {\n this.tagSegments.splice(Math.max(index - 1, 0), 1);\n if (this.tagSegments[this.tagSegments.length - 1].type !== 'plus-button') {\n this.tagSegments.push(this.uiSegmentSrv.newPlusButton());\n }\n }\n } else {\n if (segment.type === 'plus-button') {\n if (index > 2) {\n this.tagSegments.splice(index, 0, this.uiSegmentSrv.newCondition('AND'));\n }\n this.tagSegments.push(this.uiSegmentSrv.newOperator('='));\n this.tagSegments.push(this.uiSegmentSrv.newFake('select tag value', 'value', 'query-segment-value'));\n segment.type = 'key';\n segment.cssClass = 'query-segment-key';\n }\n\n if (index + 1 === this.tagSegments.length) {\n this.tagSegments.push(this.uiSegmentSrv.newPlusButton());\n }\n }\n\n this.rebuildTargetTagConditions();\n }\n\n rebuildTargetTagConditions() {\n const tags: any[] = [];\n let tagIndex = 0;\n let tagOperator = '';\n\n _.each(this.tagSegments, (segment2, index) => {\n if (segment2.type === 'key') {\n if (tags.length === 0) {\n tags.push({});\n }\n tags[tagIndex].key = segment2.value;\n } else if (segment2.type === 'value') {\n tagOperator = this.getTagValueOperator(segment2.value, tags[tagIndex].operator);\n if (tagOperator) {\n this.tagSegments[index - 1] = this.uiSegmentSrv.newOperator(tagOperator);\n tags[tagIndex].operator = tagOperator;\n }\n tags[tagIndex].value = segment2.value;\n } else if (segment2.type === 'condition') {\n tags.push({ condition: segment2.value });\n tagIndex += 1;\n } else if (segment2.type === 'operator') {\n tags[tagIndex].operator = segment2.value;\n }\n });\n\n this.target.tags = tags;\n this.panelCtrl.refresh();\n }\n\n getTagValueOperator(tagValue: string, tagOperator: string): string {\n if (tagOperator !== '=~' && tagOperator !== '!~' && /^\\/.*\\/$/.test(tagValue)) {\n return '=~';\n } else if ((tagOperator === '=~' || tagOperator === '!~') && /^(?!\\/.*\\/$)/.test(tagValue)) {\n return '=';\n }\n return null;\n }\n\n getCollapsedText() {\n return this.queryModel.render(false);\n }\n}\n","import React, { useContext } from 'react';\nimport { Select, ThemeContext } from '@grafana/ui';\nimport { css, cx } from 'emotion';\nimport { GrafanaTheme, SelectableValue } from '@grafana/data';\n\nconst getStyles = (theme: GrafanaTheme) => ({\n keyValueContainer: css`\n label: key-value-container;\n display: flex;\n flex-flow: row nowrap;\n `,\n});\n\nenum ChangeType {\n Key = 'key',\n Value = 'value',\n Operator = 'operator',\n}\n\nexport interface Props {\n keys: string[];\n keysPlaceHolder?: string;\n initialKey?: string;\n initialOperator?: string;\n initialValue?: string;\n values?: string[];\n valuesPlaceHolder?: string;\n onKeyChanged: (key: string) => void;\n onValueChanged: (value: string) => void;\n onOperatorChanged: (operator: string) => void;\n}\n\nexport const AdHocFilter: React.FunctionComponent = props => {\n const theme = useContext(ThemeContext);\n const styles = getStyles(theme);\n\n const onChange = (changeType: ChangeType) => (item: SelectableValue) => {\n const { onKeyChanged, onValueChanged, onOperatorChanged } = props;\n\n if (!item.value) {\n return;\n }\n\n switch (changeType) {\n case ChangeType.Key:\n onKeyChanged(item.value);\n break;\n case ChangeType.Operator:\n onOperatorChanged(item.value);\n break;\n case ChangeType.Value:\n onValueChanged(item.value);\n break;\n }\n };\n\n const stringToOption = (value: string) => ({ label: value, value: value });\n\n const { keys, initialKey, keysPlaceHolder, initialOperator, values, initialValue, valuesPlaceHolder } = props;\n const operators = ['=', '!='];\n const keysAsOptions = keys ? keys.map(stringToOption) : [];\n const selectedKey = initialKey ? keysAsOptions.filter(option => option.value === initialKey) : undefined;\n const valuesAsOptions = values ? values.map(stringToOption) : [];\n const selectedValue = initialValue ? valuesAsOptions.filter(option => option.value === initialValue) : undefined;\n const operatorsAsOptions = operators.map(stringToOption);\n const selectedOperator = initialOperator\n ? operatorsAsOptions.filter(option => option.value === initialOperator)\n : undefined;\n\n return (\n
\n \n