SQL Expressions: Filter Dashboard datasource queries from schema fetching (#116129)
* fix(sql expression): sql schema frontend datasources filtering * add one more test
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
import { DataQuery } from '@grafana/schema';
|
||||
import { SHARED_DASHBOARD_QUERY } from 'app/plugins/datasource/dashboard/constants';
|
||||
|
||||
import { isDashboardDatasource } from './useSQLSchemas';
|
||||
|
||||
describe('isDashboardDatasource', () => {
|
||||
it('identifies Dashboard datasource queries in a mixed set', () => {
|
||||
const queries: DataQuery[] = [
|
||||
{ refId: 'A', datasource: { uid: 'prometheus-uid', type: 'prometheus' } },
|
||||
{ refId: 'B', datasource: { uid: SHARED_DASHBOARD_QUERY, type: 'datasource' } },
|
||||
{ refId: 'C', datasource: { uid: 'mysql-uid', type: 'mysql' } },
|
||||
];
|
||||
|
||||
const backendQueries = queries.filter((q) => !isDashboardDatasource(q));
|
||||
|
||||
expect(backendQueries.map((q) => q.refId)).toEqual(['A', 'C']);
|
||||
});
|
||||
|
||||
it('returns true when query has dashboard datasource uid', () => {
|
||||
const query: DataQuery = {
|
||||
refId: 'A',
|
||||
datasource: { uid: SHARED_DASHBOARD_QUERY, type: 'datasource' },
|
||||
};
|
||||
expect(isDashboardDatasource(query)).toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -4,6 +4,11 @@ import { getAPINamespace } from '@grafana/api-clients';
|
||||
import { getDefaultTimeRange, TimeRange } from '@grafana/data';
|
||||
import { config, getBackendSrv } from '@grafana/runtime';
|
||||
import { DataQuery } from '@grafana/schema';
|
||||
import { SHARED_DASHBOARD_QUERY } from 'app/plugins/datasource/dashboard/constants';
|
||||
|
||||
export function isDashboardDatasource(query: DataQuery): boolean {
|
||||
return query.datasource?.uid === SHARED_DASHBOARD_QUERY;
|
||||
}
|
||||
|
||||
export interface SQLSchemaField {
|
||||
name: string;
|
||||
@@ -61,7 +66,10 @@ export function useSQLSchemas({ queries, enabled, timeRange }: UseSQLSchemasOpti
|
||||
setError(null);
|
||||
|
||||
try {
|
||||
if (currentQueries.length === 0) {
|
||||
// Filter out Dashboard datasource queries - they are frontend-only and can't be processed by backend
|
||||
const backendQueries = currentQueries.filter((q) => !isDashboardDatasource(q));
|
||||
|
||||
if (backendQueries.length === 0) {
|
||||
setSchemas({ kind: 'SQLSchemaResponse', apiVersion: 'query.grafana.app/v0alpha1', sqlSchemas: {} });
|
||||
setLoading(false);
|
||||
return;
|
||||
@@ -73,7 +81,7 @@ export function useSQLSchemas({ queries, enabled, timeRange }: UseSQLSchemasOpti
|
||||
const response = await getBackendSrv().post<SQLSchemasResponse>(
|
||||
`/apis/query.grafana.app/v0alpha1/namespaces/${namespace}/sqlschemas/name`,
|
||||
{
|
||||
queries: currentQueries,
|
||||
queries: backendQueries,
|
||||
from: currentTimeRange.from.toISOString(),
|
||||
to: currentTimeRange.to.toISOString(),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user