Chore: Remove `sqlQuerybuilderFunctionParameters` feature toggle (#100809)

* chore: remove `sqlQuerybuilderFunctionParameters` ff

* Update packages/grafana-sql/src/components/visual-query-builder/SelectRow.tsx

Co-authored-by: ismail simsek <ismailsimsek09@gmail.com>

---------

Co-authored-by: ismail simsek <ismailsimsek09@gmail.com>
pull/100972/head
Zoltán Bedi 4 months ago committed by GitHub
parent a24fd1b722
commit 5a7916133e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md
  2. 2
      docs/sources/shared/datasources/sql-query-builder-macros.md
  3. 2
      e2e/plugin-e2e/mysql/visual-query-builder.spec.ts
  4. 1
      packages/grafana-data/src/types/featureToggles.gen.ts
  5. 10
      packages/grafana-sql/src/components/visual-query-builder/SelectRow.test.tsx
  6. 47
      packages/grafana-sql/src/components/visual-query-builder/SelectRow.tsx
  7. 7
      pkg/services/featuremgmt/registry.go
  8. 1
      pkg/services/featuremgmt/toggles_gen.csv
  9. 4
      pkg/services/featuremgmt/toggles_gen.go
  10. 3
      pkg/services/featuremgmt/toggles_gen.json
  11. 6
      public/app/plugins/datasource/grafana-postgresql-datasource/datasource.ts
  12. 6
      public/app/plugins/datasource/influxdb/fsql/datasource.flightsql.ts
  13. 6
      public/app/plugins/datasource/mssql/datasource.ts
  14. 6
      public/app/plugins/datasource/mysql/MySqlDatasource.ts

@ -197,7 +197,6 @@ Experimental features might be changed or removed without prior notice.
| `alertingListViewV2` | Enables the new alert list view design | | `alertingListViewV2` | Enables the new alert list view design |
| `dashboardRestore` | Enables deleted dashboard restore feature | | `dashboardRestore` | Enables deleted dashboard restore feature |
| `alertingCentralAlertHistory` | Enables the new central alert history. | | `alertingCentralAlertHistory` | Enables the new central alert history. |
| `sqlQuerybuilderFunctionParameters` | Enables SQL query builder function parameters |
| `failWrongDSUID` | Throws an error if a datasource has an invalid UIDs | | `failWrongDSUID` | Throws an error if a datasource has an invalid UIDs |
| `dataplaneAggregator` | Enable grafana dataplane aggregator | | `dataplaneAggregator` | Enable grafana dataplane aggregator |
| `lokiSendDashboardPanelNames` | Send dashboard and panel names to Loki when querying | | `lokiSendDashboardPanelNames` | Send dashboard and panel names to Loki when querying |

@ -10,8 +10,6 @@ labels:
You can enable macros support in the select clause to create time-series queries. You can enable macros support in the select clause to create time-series queries.
{{< docs/experimental product="Macros support in visual query builder" featureFlag="`sqlQuerybuilderFunctionParameters`" >}}
Use the **Data operations** drop-down to select a macro like `$__timeGroup` or `$__timeGroupAlias`. Use the **Data operations** drop-down to select a macro like `$__timeGroup` or `$__timeGroupAlias`.
Select a time column from the **Column** drop-down and a time interval from the **Interval** drop-down to create a time-series query. Select a time column from the **Column** drop-down and a time interval from the **Interval** drop-down to create a time-series query.

@ -6,8 +6,6 @@ import { mockDataSourceRequest } from './utils';
test.beforeEach(mockDataSourceRequest); test.beforeEach(mockDataSourceRequest);
test.use({ featureToggles: { sqlQuerybuilderFunctionParameters: true } });
test('visual query builder should handle macros', async ({ explorePage, page }) => { test('visual query builder should handle macros', async ({ explorePage, page }) => {
await explorePage.getByGrafanaSelector(selectors.components.SQLQueryEditor.headerTableSelector).click(); await explorePage.getByGrafanaSelector(selectors.components.SQLQueryEditor.headerTableSelector).click();
await page.getByText(normalTableName, { exact: true }).click(); await page.getByText(normalTableName, { exact: true }).click();

@ -180,7 +180,6 @@ export interface FeatureToggles {
preserveDashboardStateWhenNavigating?: boolean; preserveDashboardStateWhenNavigating?: boolean;
alertingCentralAlertHistory?: boolean; alertingCentralAlertHistory?: boolean;
pluginProxyPreserveTrailingSlash?: boolean; pluginProxyPreserveTrailingSlash?: boolean;
sqlQuerybuilderFunctionParameters?: boolean;
azureMonitorPrometheusExemplars?: boolean; azureMonitorPrometheusExemplars?: boolean;
pinNavItems?: boolean; pinNavItems?: boolean;
authZGRPCServer?: boolean; authZGRPCServer?: boolean;

@ -10,16 +10,6 @@ import { buildMockDB } from '../SqlComponents.testHelpers';
import { SelectRow } from './SelectRow'; import { SelectRow } from './SelectRow';
// Mock featureToggle sqlQuerybuilderFunctionParameters
jest.mock('@grafana/runtime', () => ({
...jest.requireActual('@grafana/runtime'),
config: {
featureToggles: {
sqlQuerybuilderFunctionParameters: true,
},
},
}));
describe('SelectRow', () => { describe('SelectRow', () => {
const query = Object.freeze<SQLQuery>({ const query = Object.freeze<SQLQuery>({
refId: 'A', refId: 'A',

@ -5,7 +5,6 @@ import { useCallback } from 'react';
import { SelectableValue, toOption } from '@grafana/data'; import { SelectableValue, toOption } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors'; import { selectors } from '@grafana/e2e-selectors';
import { EditorField } from '@grafana/plugin-ui'; import { EditorField } from '@grafana/plugin-ui';
import { config } from '@grafana/runtime';
import { Button, Select, Stack, useStyles2 } from '@grafana/ui'; import { Button, Select, Stack, useStyles2 } from '@grafana/ui';
import { QueryEditorExpressionType, QueryEditorFunctionExpression } from '../../expressions'; import { QueryEditorExpressionType, QueryEditorFunctionExpression } from '../../expressions';
@ -13,7 +12,6 @@ import { DB, QueryFormat, SQLExpression, SQLQuery } from '../../types';
import { createFunctionField } from '../../utils/sql.utils'; import { createFunctionField } from '../../utils/sql.utils';
import { useSqlChange } from '../../utils/useSqlChange'; import { useSqlChange } from '../../utils/useSqlChange';
import { SelectColumn } from './SelectColumn';
import { SelectFunctionParameters } from './SelectFunctionParameters'; import { SelectFunctionParameters } from './SelectFunctionParameters';
interface SelectRowProps { interface SelectRowProps {
@ -35,27 +33,6 @@ export function SelectRow({ query, onQueryChange, db, columns }: SelectRowProps)
timeSeriesAliasOpts.push({ label: 'value', value: 'value' }); timeSeriesAliasOpts.push({ label: 'value', value: 'value' });
} }
const onColumnChange = useCallback(
(item: QueryEditorFunctionExpression, index: number) => (column?: string) => {
let modifiedItem = { ...item };
if (!item.parameters?.length) {
modifiedItem.parameters = [{ type: QueryEditorExpressionType.FunctionParameter, name: column } as const];
} else {
modifiedItem.parameters = item.parameters.map((p) =>
p.type === QueryEditorExpressionType.FunctionParameter ? { ...p, name: column } : p
);
}
const newSql: SQLExpression = {
...query.sql,
columns: query.sql?.columns?.map((c, i) => (i === index ? modifiedItem : c)),
};
onSqlChange(newSql);
},
[onSqlChange, query.sql]
);
const onAggregationChange = useCallback( const onAggregationChange = useCallback(
(item: QueryEditorFunctionExpression, index: number) => (aggregation: SelectableValue<string>) => { (item: QueryEditorFunctionExpression, index: number) => (aggregation: SelectableValue<string>) => {
const newItem = { const newItem = {
@ -134,18 +111,7 @@ export function SelectRow({ query, onQueryChange, db, columns }: SelectRowProps)
{query.sql?.columns?.map((item, index) => ( {query.sql?.columns?.map((item, index) => (
<div key={index}> <div key={index}>
<Stack gap={2} alignItems="end"> <Stack gap={2} alignItems="end">
{!config.featureToggles.sqlQuerybuilderFunctionParameters && ( <EditorField label="Data operations" optional width={25}>
<SelectColumn
columns={columns}
onParameterChange={(v) => onColumnChange(item, index)(v)}
value={getColumnValue(item)}
/>
)}
<EditorField
label={config.featureToggles.sqlQuerybuilderFunctionParameters ? 'Data operations' : 'Aggregation'}
optional
width={25}
>
<Select <Select
value={item.name ? toOption(item.name) : null} value={item.name ? toOption(item.name) : null}
inputId={`select-aggregation-${index}-${uniqueId()}`} inputId={`select-aggregation-${index}-${uniqueId()}`}
@ -157,7 +123,7 @@ export function SelectRow({ query, onQueryChange, db, columns }: SelectRowProps)
onChange={onAggregationChange(item, index)} onChange={onAggregationChange(item, index)}
/> />
</EditorField> </EditorField>
{config.featureToggles.sqlQuerybuilderFunctionParameters && (
<SelectFunctionParameters <SelectFunctionParameters
currentColumnIndex={index} currentColumnIndex={index}
columns={columns} columns={columns}
@ -165,7 +131,6 @@ export function SelectRow({ query, onQueryChange, db, columns }: SelectRowProps)
query={query} query={query}
db={db} db={db}
/> />
)}
<EditorField label="Alias" optional width={15}> <EditorField label="Alias" optional width={15}>
<Select <Select
@ -213,11 +178,3 @@ const getStyles = () => {
}), }),
}; };
}; };
function getColumnValue({ parameters }: QueryEditorFunctionExpression): SelectableValue<string> | null {
const column = parameters?.find((p) => p.type === QueryEditorExpressionType.FunctionParameter);
if (column?.name) {
return toOption(column.name);
}
return null;
}

@ -1233,13 +1233,6 @@ var (
Owner: grafanaPluginsPlatformSquad, Owner: grafanaPluginsPlatformSquad,
Expression: "false", // disabled by default Expression: "false", // disabled by default
}, },
{
Name: "sqlQuerybuilderFunctionParameters",
Description: "Enables SQL query builder function parameters",
Stage: FeatureStageExperimental,
Owner: grafanaOSSBigTent,
FrontendOnly: true,
},
{ {
Name: "azureMonitorPrometheusExemplars", Name: "azureMonitorPrometheusExemplars",
Description: "Allows configuration of Azure Monitor as a data source that can provide Prometheus exemplars", Description: "Allows configuration of Azure Monitor as a data source that can provide Prometheus exemplars",

@ -161,7 +161,6 @@ alertingDisableSendAlertsExternal,experimental,@grafana/alerting-squad,false,fal
preserveDashboardStateWhenNavigating,experimental,@grafana/dashboards-squad,false,false,false preserveDashboardStateWhenNavigating,experimental,@grafana/dashboards-squad,false,false,false
alertingCentralAlertHistory,experimental,@grafana/alerting-squad,false,false,true alertingCentralAlertHistory,experimental,@grafana/alerting-squad,false,false,true
pluginProxyPreserveTrailingSlash,GA,@grafana/plugins-platform-backend,false,false,false pluginProxyPreserveTrailingSlash,GA,@grafana/plugins-platform-backend,false,false,false
sqlQuerybuilderFunctionParameters,experimental,@grafana/oss-big-tent,false,false,true
azureMonitorPrometheusExemplars,preview,@grafana/partner-datasources,false,false,false azureMonitorPrometheusExemplars,preview,@grafana/partner-datasources,false,false,false
pinNavItems,GA,@grafana/grafana-frontend-platform,false,false,false pinNavItems,GA,@grafana/grafana-frontend-platform,false,false,false
authZGRPCServer,experimental,@grafana/identity-access-team,false,false,false authZGRPCServer,experimental,@grafana/identity-access-team,false,false,false

1 Name Stage Owner requiresDevMode RequiresRestart FrontendOnly
161 preserveDashboardStateWhenNavigating experimental @grafana/dashboards-squad false false false
162 alertingCentralAlertHistory experimental @grafana/alerting-squad false false true
163 pluginProxyPreserveTrailingSlash GA @grafana/plugins-platform-backend false false false
sqlQuerybuilderFunctionParameters experimental @grafana/oss-big-tent false false true
164 azureMonitorPrometheusExemplars preview @grafana/partner-datasources false false false
165 pinNavItems GA @grafana/grafana-frontend-platform false false false
166 authZGRPCServer experimental @grafana/identity-access-team false false false

@ -655,10 +655,6 @@ const (
// Preserve plugin proxy trailing slash. // Preserve plugin proxy trailing slash.
FlagPluginProxyPreserveTrailingSlash = "pluginProxyPreserveTrailingSlash" FlagPluginProxyPreserveTrailingSlash = "pluginProxyPreserveTrailingSlash"
// FlagSqlQuerybuilderFunctionParameters
// Enables SQL query builder function parameters
FlagSqlQuerybuilderFunctionParameters = "sqlQuerybuilderFunctionParameters"
// FlagAzureMonitorPrometheusExemplars // FlagAzureMonitorPrometheusExemplars
// Allows configuration of Azure Monitor as a data source that can provide Prometheus exemplars // Allows configuration of Azure Monitor as a data source that can provide Prometheus exemplars
FlagAzureMonitorPrometheusExemplars = "azureMonitorPrometheusExemplars" FlagAzureMonitorPrometheusExemplars = "azureMonitorPrometheusExemplars"

@ -3730,7 +3730,8 @@
"metadata": { "metadata": {
"name": "sqlQuerybuilderFunctionParameters", "name": "sqlQuerybuilderFunctionParameters",
"resourceVersion": "1718487716739", "resourceVersion": "1718487716739",
"creationTimestamp": "2024-11-04T16:13:35Z" "creationTimestamp": "2024-11-04T16:13:35Z",
"deletionTimestamp": "2025-01-31T10:58:09Z"
}, },
"spec": { "spec": {
"description": "Enables SQL query builder function parameters", "description": "Enables SQL query builder function parameters",

@ -2,7 +2,7 @@ import { v4 as uuidv4 } from 'uuid';
import { DataSourceInstanceSettings, ScopedVars } from '@grafana/data'; import { DataSourceInstanceSettings, ScopedVars } from '@grafana/data';
import { LanguageDefinition } from '@grafana/plugin-ui'; import { LanguageDefinition } from '@grafana/plugin-ui';
import { TemplateSrv, config } from '@grafana/runtime'; import { TemplateSrv } from '@grafana/runtime';
import { import {
COMMON_FNS, COMMON_FNS,
DB, DB,
@ -94,7 +94,6 @@ export class PostgresDatasource extends SqlDatasource {
} }
getFunctions = (): ReturnType<DB['functions']> => { getFunctions = (): ReturnType<DB['functions']> => {
if (config.featureToggles.sqlQuerybuilderFunctionParameters) {
const columnParam: FuncParameter = { const columnParam: FuncParameter = {
name: 'Column', name: 'Column',
required: true, required: true,
@ -102,9 +101,6 @@ export class PostgresDatasource extends SqlDatasource {
}; };
return [...MACRO_FUNCTIONS(columnParam), ...COMMON_FNS.map((fn) => ({ ...fn, parameters: [columnParam] }))]; return [...MACRO_FUNCTIONS(columnParam), ...COMMON_FNS.map((fn) => ({ ...fn, parameters: [columnParam] }))];
} else {
return COMMON_FNS;
}
}; };
getDB(): DB { getDB(): DB {

@ -2,7 +2,7 @@ import { v4 as uuidv4 } from 'uuid';
import { DataSourceInstanceSettings, TimeRange } from '@grafana/data'; import { DataSourceInstanceSettings, TimeRange } from '@grafana/data';
import { CompletionItemKind, LanguageDefinition, TableIdentifier } from '@grafana/plugin-ui'; import { CompletionItemKind, LanguageDefinition, TableIdentifier } from '@grafana/plugin-ui';
import { TemplateSrv, config, getTemplateSrv } from '@grafana/runtime'; import { TemplateSrv, getTemplateSrv } from '@grafana/runtime';
import { COMMON_FNS, DB, FuncParameter, SQLQuery, SqlDatasource, formatSQL } from '@grafana/sql'; import { COMMON_FNS, DB, FuncParameter, SQLQuery, SqlDatasource, formatSQL } from '@grafana/sql';
import { mapFieldsToTypes } from './fields'; import { mapFieldsToTypes } from './fields';
@ -106,7 +106,6 @@ export class FlightSQLDatasource extends SqlDatasource {
getFunctions = (): ReturnType<DB['functions']> => { getFunctions = (): ReturnType<DB['functions']> => {
const fns = [...COMMON_FNS, { name: 'VARIANCE' }, { name: 'STDDEV' }]; const fns = [...COMMON_FNS, { name: 'VARIANCE' }, { name: 'STDDEV' }];
if (config.featureToggles.sqlQuerybuilderFunctionParameters) {
const columnParam: FuncParameter = { const columnParam: FuncParameter = {
name: 'Column', name: 'Column',
required: true, required: true,
@ -133,9 +132,6 @@ export class FlightSQLDatasource extends SqlDatasource {
parameters: [columnParam, intervalParam], parameters: [columnParam, intervalParam],
}, },
]; ];
} else {
return fns;
}
}; };
getDB(): DB { getDB(): DB {

@ -2,7 +2,7 @@ import { v4 as uuidv4 } from 'uuid';
import { DataSourceInstanceSettings, ScopedVars } from '@grafana/data'; import { DataSourceInstanceSettings, ScopedVars } from '@grafana/data';
import { LanguageDefinition } from '@grafana/plugin-ui'; import { LanguageDefinition } from '@grafana/plugin-ui';
import { TemplateSrv, config } from '@grafana/runtime'; import { TemplateSrv } from '@grafana/runtime';
import { import {
COMMON_FNS, COMMON_FNS,
DB, DB,
@ -75,7 +75,6 @@ export class MssqlDatasource extends SqlDatasource {
} }
getFunctions = (): ReturnType<DB['functions']> => { getFunctions = (): ReturnType<DB['functions']> => {
if (config.featureToggles.sqlQuerybuilderFunctionParameters) {
const columnParam: FuncParameter = { const columnParam: FuncParameter = {
name: 'Column', name: 'Column',
required: true, required: true,
@ -83,9 +82,6 @@ export class MssqlDatasource extends SqlDatasource {
}; };
return [...MACRO_FUNCTIONS(columnParam), ...COMMON_FNS.map((fn) => ({ ...fn, parameters: [columnParam] }))]; return [...MACRO_FUNCTIONS(columnParam), ...COMMON_FNS.map((fn) => ({ ...fn, parameters: [columnParam] }))];
} else {
return COMMON_FNS;
}
}; };
getDB(): DB { getDB(): DB {

@ -2,7 +2,6 @@ import { v4 as uuidv4 } from 'uuid';
import { DataSourceInstanceSettings, TimeRange } from '@grafana/data'; import { DataSourceInstanceSettings, TimeRange } from '@grafana/data';
import { CompletionItemKind, LanguageDefinition, TableIdentifier } from '@grafana/plugin-ui'; import { CompletionItemKind, LanguageDefinition, TableIdentifier } from '@grafana/plugin-ui';
import { config } from '@grafana/runtime';
import { COMMON_FNS, DB, FuncParameter, MACRO_FUNCTIONS, SQLQuery, SqlDatasource, formatSQL } from '@grafana/sql'; import { COMMON_FNS, DB, FuncParameter, MACRO_FUNCTIONS, SQLQuery, SqlDatasource, formatSQL } from '@grafana/sql';
import { mapFieldsToTypes } from './fields'; import { mapFieldsToTypes } from './fields';
@ -89,7 +88,7 @@ export class MySqlDatasource extends SqlDatasource {
getFunctions = (): ReturnType<DB['functions']> => { getFunctions = (): ReturnType<DB['functions']> => {
const fns = [...COMMON_FNS, { name: 'VARIANCE' }, { name: 'STDDEV' }]; const fns = [...COMMON_FNS, { name: 'VARIANCE' }, { name: 'STDDEV' }];
if (config.featureToggles.sqlQuerybuilderFunctionParameters) {
const columnParam: FuncParameter = { const columnParam: FuncParameter = {
name: 'Column', name: 'Column',
required: true, required: true,
@ -97,9 +96,6 @@ export class MySqlDatasource extends SqlDatasource {
}; };
return [...MACRO_FUNCTIONS(columnParam), ...fns.map((fn) => ({ ...fn, parameters: [columnParam] }))]; return [...MACRO_FUNCTIONS(columnParam), ...fns.map((fn) => ({ ...fn, parameters: [columnParam] }))];
} else {
return fns;
}
}; };
getDB(): DB { getDB(): DB {

Loading…
Cancel
Save