From 5d62ec901d7888dfcf01ae3cd7d5d2b65a15610f Mon Sep 17 00:00:00 2001
From: Shubham Nainwal <118589955+Shubham19032004@users.noreply.github.com>
Date: Wed, 11 Jun 2025 18:34:48 +0530
Subject: [PATCH] VQB: Add selected columns to GROUP BY dropdown (#106349)
(#106391)
* feat: add selected columns support to GROUP BY dropdown
* feat(vqb): allow selecting columns in GROUP BY dropdown #106349
---
.../visual-query-builder/SQLGroupByRow.tsx | 5 ++--
.../visual-query-builder/SQLOrderByRow.tsx | 23 ++-------------
.../src/utils/getColumnsWithIndices.ts | 29 +++++++++++++++++++
3 files changed, 34 insertions(+), 23 deletions(-)
create mode 100644 packages/grafana-sql/src/utils/getColumnsWithIndices.ts
diff --git a/packages/grafana-sql/src/components/visual-query-builder/SQLGroupByRow.tsx b/packages/grafana-sql/src/components/visual-query-builder/SQLGroupByRow.tsx
index 722a0bad3f9..ef16d8b50d0 100644
--- a/packages/grafana-sql/src/components/visual-query-builder/SQLGroupByRow.tsx
+++ b/packages/grafana-sql/src/components/visual-query-builder/SQLGroupByRow.tsx
@@ -2,6 +2,7 @@ import { SelectableValue } from '@grafana/data';
import { QueryWithDefaults } from '../../defaults';
import { DB, SQLQuery } from '../../types';
+import { getColumnsWithIndices } from '../../utils/getColumnsWithIndices';
import { useSqlChange } from '../../utils/useSqlChange';
import { GroupByRow } from './GroupByRow';
@@ -15,6 +16,6 @@ interface SQLGroupByRowProps {
export function SQLGroupByRow({ fields, query, onQueryChange, db }: SQLGroupByRowProps) {
const { onSqlChange } = useSqlChange({ query, onQueryChange, db });
-
- return ;
+ let columnsWithIndices: SelectableValue[] = getColumnsWithIndices(query, fields);
+ return ;
}
diff --git a/packages/grafana-sql/src/components/visual-query-builder/SQLOrderByRow.tsx b/packages/grafana-sql/src/components/visual-query-builder/SQLOrderByRow.tsx
index 8ef0d6f5356..b20ec915c54 100644
--- a/packages/grafana-sql/src/components/visual-query-builder/SQLOrderByRow.tsx
+++ b/packages/grafana-sql/src/components/visual-query-builder/SQLOrderByRow.tsx
@@ -2,6 +2,7 @@ import { SelectableValue } from '@grafana/data';
import { QueryWithDefaults } from '../../defaults';
import { DB, SQLQuery } from '../../types';
+import { getColumnsWithIndices } from '../../utils/getColumnsWithIndices';
import { useSqlChange } from '../../utils/useSqlChange';
import { OrderByRow } from './OrderByRow';
@@ -15,26 +16,6 @@ type SQLOrderByRowProps = {
export function SQLOrderByRow({ fields, query, onQueryChange, db }: SQLOrderByRowProps) {
const { onSqlChange } = useSqlChange({ query, onQueryChange, db });
- let columnsWithIndices: SelectableValue[] = [];
-
- if (fields) {
- const options = query.sql?.columns?.map((c, i) => {
- const value = c.name ? `${c.name}(${c.parameters?.map((p) => p.name)})` : c.parameters?.map((p) => p.name);
- return {
- value,
- label: `${i + 1} - ${value}`,
- };
- });
- columnsWithIndices = [
- {
- value: '',
- label: 'Selected columns',
- options,
- expanded: true,
- },
- ...fields,
- ];
- }
-
+ let columnsWithIndices: SelectableValue[] = getColumnsWithIndices(query, fields);
return ;
}
diff --git a/packages/grafana-sql/src/utils/getColumnsWithIndices.ts b/packages/grafana-sql/src/utils/getColumnsWithIndices.ts
new file mode 100644
index 00000000000..6c7dccbff9e
--- /dev/null
+++ b/packages/grafana-sql/src/utils/getColumnsWithIndices.ts
@@ -0,0 +1,29 @@
+import { SelectableValue } from '@grafana/data';
+
+import { SQLQuery } from '../types';
+
+export function getColumnsWithIndices(query: SQLQuery, fields: SelectableValue[]): SelectableValue[] {
+ if (!fields || !query.sql?.columns) {
+ return fields;
+ }
+
+ const options = query.sql.columns.map((c, i) => {
+ const value = c.name
+ ? `${c.name}(${c.parameters?.map((p) => p.name).join(', ')})`
+ : c.parameters?.map((p) => p.name).join(', ');
+ return {
+ value,
+ label: `${i + 1} - ${value}`,
+ };
+ });
+
+ return [
+ {
+ value: '',
+ label: 'Selected columns',
+ options,
+ expanded: true,
+ },
+ ...fields,
+ ];
+}