From c5bff2df50c1ab68504d649ba0e5713324264db9 Mon Sep 17 00:00:00 2001 From: yesoreyeram <153843+yesoreyeram@users.noreply.github.com> Date: Mon, 12 Jan 2026 11:21:56 +0000 Subject: [PATCH] convert dataframe response to metricFindValues with properties --- .../grafana-sql/src/SQLVariableSupport.tsx | 59 ++++++++++++------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/packages/grafana-sql/src/SQLVariableSupport.tsx b/packages/grafana-sql/src/SQLVariableSupport.tsx index c88b910067c..d61cbeaa39f 100644 --- a/packages/grafana-sql/src/SQLVariableSupport.tsx +++ b/packages/grafana-sql/src/SQLVariableSupport.tsx @@ -9,6 +9,7 @@ import { QueryEditorProps, Field, DataFrame, + MetricFindValue, } from '@grafana/data'; import { t } from '@grafana/i18n'; import { EditorMode, EditorRows, EditorRow, EditorField } from '@grafana/plugin-ui'; @@ -35,13 +36,9 @@ export class SQLVariableSupport extends CustomVariableSupport { - return { - ...d, - data: (d.data || []).map((frame: DataFrame) => ({ - ...frame, - fields: convertOriginalFieldsToVariableFields(frame.fields, updatedQuery.meta), - })), - }; + const frames = d.data || []; + const metricFindValues = convertDataFramesToMetricFindValues(frames, updatedQuery.meta); + return { data: metricFindValues }; }) ); } @@ -138,20 +135,40 @@ const migrateVariableQuery = (rawQuery: string | SQLQuery): SQLVariableQuery => }; }; -const convertOriginalFieldsToVariableFields = (original_fields: Field[], meta?: SQLQueryMeta): Field[] => { - if (original_fields.length < 1) { - throw new Error('at least one field expected for variable'); +const convertDataFramesToMetricFindValues = (frames: DataFrame[], meta?: SQLQueryMeta): MetricFindValue[] => { + if (!frames.length) { + throw new Error('no results found'); } - let tf = original_fields.find((f) => f.name === '__text'); - let vf = original_fields.find((f) => f.name === '__value'); - if (meta) { - tf = meta.textField ? original_fields.find((f) => f.name === meta.textField) : undefined; - vf = meta.valueField ? original_fields.find((f) => f.name === meta.valueField) : undefined; + + const frame = frames[0]; + + const fields = frame.fields; + + if (fields.length < 1) { + throw new Error('no fields found in the response'); } - const textField = tf || vf || original_fields[0]; - const valueField = vf || tf || original_fields[0]; - return [ - { ...textField, name: 'text' }, - { ...valueField, name: 'value' }, - ]; + + let textField = fields.find((f) => f.name === '__text'); + let valueField = fields.find((f) => f.name === '__value'); + if (meta?.textField) { + textField = fields.find((f) => f.name === meta.textField); + } + if (meta?.valueField) { + valueField = fields.find((f) => f.name === meta.valueField); + } + const resolvedTextField = textField || valueField || fields[0]; + const resolvedValueField = valueField || textField || fields[0]; + + const results: MetricFindValue[] = []; + const rowCount = frame.length; + for (let i = 0; i < rowCount; i++) { + const text = String(resolvedTextField.values[i] ?? ''); + const value = String(resolvedValueField.values[i] ?? ''); + const properties: Record = {}; + for (const field of fields) { + properties[field.name] = String(field.values[i] ?? ''); + } + results.push({ text, value, properties }); + } + return results; };