diff --git a/src/containers/Heatmap/Heatmap.tsx b/src/containers/Heatmap/Heatmap.tsx index 4e988d2215..0b77023f9b 100644 --- a/src/containers/Heatmap/Heatmap.tsx +++ b/src/containers/Heatmap/Heatmap.tsx @@ -30,7 +30,7 @@ interface HeatmapProps { export const Heatmap = ({path, database, databaseFullPath}: HeatmapProps) => { const dispatch = useTypedDispatch(); - const itemsContainer = React.createRef(); + const itemsContainer = React.useRef(null); const [autoRefreshInterval] = useAutoRefreshInterval(); diff --git a/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx b/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx index 10a1bebb92..1cc61c0931 100644 --- a/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx +++ b/src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx @@ -32,6 +32,7 @@ import { useEventHandler, useQueryExecutionSettings, useQueryStreamingSetting, + useResourcePools, useSetting, useTypedDispatch, useTypedSelector, @@ -88,7 +89,7 @@ export default function QueryEditor({theme, changeUserInput, queriesHistory}: Qu const isResultLoaded = Boolean(result); - const [querySettings] = useQueryExecutionSettings(); + const [querySettings, setQuerySettings] = useQueryExecutionSettings(); const enableTracingLevel = useTracingLevelOptionAvailable(); const [lastQueryExecutionSettings, setLastQueryExecutionSettings] = useLastQueryExecutionSettings(); @@ -104,6 +105,12 @@ export default function QueryEditor({theme, changeUserInput, queriesHistory}: Qu SETTING_KEYS.BINARY_DATA_IN_PLAIN_TEXT_DISPLAY, ); + const { + resourcePools, + normalizedResourcePool, + isLoading: isResourcePoolsLoading, + } = useResourcePools(database, querySettings.resourcePool); + const encodeTextWithBase64 = !binaryDataInPlainTextDisplay; const isStreamingEnabled = @@ -114,6 +121,28 @@ export default function QueryEditor({theme, changeUserInput, queriesHistory}: Qu const [sendQuery] = queryApi.useUseSendQueryMutation(); const [streamQuery] = queryApi.useUseStreamQueryMutation(); + // Normalize stored resourcePool if it's not available for current database + React.useEffect(() => { + if (isResourcePoolsLoading) { + return; + } + + if (querySettings.resourcePool === normalizedResourcePool) { + return; + } + + setQuerySettings({ + ...querySettings, + resourcePool: normalizedResourcePool, + }); + }, [ + isResourcePoolsLoading, + normalizedResourcePool, + querySettings, + resourcePools.length, + setQuerySettings, + ]); + const tableSettings = React.useMemo(() => { return isStreamingEnabled ? { diff --git a/src/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettings.test.ts b/src/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettings.test.ts index 688cb6246f..b2bcff5173 100644 --- a/src/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettings.test.ts +++ b/src/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettings.test.ts @@ -36,6 +36,7 @@ describe('getChangedQueryExecutionSettings', () => { statisticsMode: STATISTICS_MODES.basic, tracingLevel: TRACING_LEVELS.basic, pragmas: 'PRAGMA TestPragma;', + resourcePool: DEFAULT_QUERY_SETTINGS.resourcePool, }; const result = getChangedQueryExecutionSettings(currentSettings, DEFAULT_QUERY_SETTINGS); expect(result).toEqual([ diff --git a/src/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettingsDescription.test.ts b/src/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettingsDescription.test.ts index e600cfcea9..bd506a8d7a 100644 --- a/src/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettingsDescription.test.ts +++ b/src/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettingsDescription.test.ts @@ -58,6 +58,7 @@ describe('getChangedQueryExecutionSettingsDescription', () => { statisticsMode: STATISTICS_MODES.profile, tracingLevel: TRACING_LEVELS.diagnostic, pragmas: 'PRAGMA TestPragma;', + resourcePool: DEFAULT_QUERY_SETTINGS.resourcePool, }; const result = getChangedQueryExecutionSettingsDescription({ diff --git a/src/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsDialog.tsx b/src/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsDialog.tsx index c8ab3737e1..8299f93808 100644 --- a/src/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsDialog.tsx +++ b/src/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsDialog.tsx @@ -15,11 +15,18 @@ import {cn} from '../../../../utils/cn'; import { useQueryExecutionSettings, useQueryStreamingSetting, + useResourcePools, useSetting, useTypedDispatch, useTypedSelector, } from '../../../../utils/hooks'; -import {QUERY_MODES, querySettingsValidationSchema} from '../../../../utils/query'; +import type {ResourcePoolValue} from '../../../../utils/query'; +import { + QUERY_MODES, + RESOURCE_POOL_NO_OVERRIDE_VALUE, + querySettingsValidationSchema, +} from '../../../../utils/query'; +import {useCurrentSchema} from '../../TenantContext'; import {QuerySettingsSelect} from './QuerySettingsSelect'; import {QuerySettingsTimeout} from './QuerySettingsTimeout'; @@ -86,10 +93,44 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm const [useShowPlanToSvg] = useSetting(SETTING_KEYS.USE_SHOW_PLAN_SVG); const enableTracingLevel = useTracingLevelOptionAvailable(); const [isQueryStreamingEnabled] = useQueryStreamingSetting(); + const {database} = useCurrentSchema(); + const {resourcePools, isLoading: isResourcePoolsLoading} = useResourcePools( + database, + initialValues.resourcePool, + ); + + const resourcePoolOptions = React.useMemo( + () => [ + { + value: RESOURCE_POOL_NO_OVERRIDE_VALUE, + content: i18n('form.resource-pool.no-override'), + }, + ...resourcePools.map((name) => ({ + value: name, + content: name, + })), + ], + [resourcePools], + ); const timeout = watch('timeout'); + const resourcePool = watch('resourcePool'); const queryMode = watch('queryMode'); + React.useEffect(() => { + if (isResourcePoolsLoading) { + return; + } + + if (!resourcePool || resourcePool === RESOURCE_POOL_NO_OVERRIDE_VALUE) { + return; + } + + if (!resourcePools.length || !resourcePools.includes(resourcePool)) { + setValue('resourcePool', RESOURCE_POOL_NO_OVERRIDE_VALUE); + } + }, [isResourcePoolsLoading, resourcePools, resourcePool, setValue]); + return (
@@ -255,6 +296,26 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm )} + + +
+ ( + + id="resourcePool" + setting={field.value ?? RESOURCE_POOL_NO_OVERRIDE_VALUE} + disabled={isResourcePoolsLoading || !resourcePools.length} + onUpdateSetting={(value) => field.onChange(value)} + settingOptions={resourcePoolOptions} + /> + )} + /> +
+