)}
/>
diff --git a/src/containers/Tenant/Query/QuerySettingsDialog/constants.ts b/src/containers/Tenant/Query/QuerySettingsDialog/constants.ts
index ab9d89f33..296ed494f 100644
--- a/src/containers/Tenant/Query/QuerySettingsDialog/constants.ts
+++ b/src/containers/Tenant/Query/QuerySettingsDialog/constants.ts
@@ -10,6 +10,8 @@ import {
} from '../../../../utils/query';
import i18n from '../i18n';
+import formI18n from './i18n';
+
export const ISOLATION_LEVEL_SELECT_OPTIONS = [
{
value: ISOLATION_LEVELS.serializable,
@@ -88,6 +90,16 @@ export const STATISTICS_MODE_SELECT_OPTIONS = [
];
export const TRACING_LEVEL_SELECT_OPTIONS = [
+ {
+ value: TRACING_LEVELS.off,
+ content: TRACING_LEVELS_TITLES[TRACING_LEVELS.off],
+ text: i18n('tracing-level-description.off'),
+ },
+ {
+ value: TRACING_LEVELS.toplevel,
+ content: TRACING_LEVELS_TITLES[TRACING_LEVELS.toplevel],
+ text: i18n('tracing-level-description.toplevel'),
+ },
{
value: TRACING_LEVELS.basic,
content: TRACING_LEVELS_TITLES[TRACING_LEVELS.basic],
@@ -104,19 +116,31 @@ export const TRACING_LEVEL_SELECT_OPTIONS = [
content: TRACING_LEVELS_TITLES[TRACING_LEVELS.diagnostic],
text: i18n('tracing-level-description.diagnostic'),
},
- {
- value: TRACING_LEVELS.off,
- content: TRACING_LEVELS_TITLES[TRACING_LEVELS.off],
- text: i18n('tracing-level-description.off'),
- },
- {
- value: TRACING_LEVELS.toplevel,
- content: TRACING_LEVELS_TITLES[TRACING_LEVELS.toplevel],
- text: i18n('tracing-level-description.toplevel'),
- },
{
value: TRACING_LEVELS.trace,
content: TRACING_LEVELS_TITLES[TRACING_LEVELS.trace],
text: i18n('tracing-level-description.trace'),
},
];
+
+export const QUERY_SETTINGS_FIELD_SETTINGS = {
+ isolationLevel: {
+ title: formI18n('form.isolation-level'),
+ options: ISOLATION_LEVEL_SELECT_OPTIONS,
+ },
+ queryMode: {
+ title: formI18n('form.query-mode'),
+ options: QUERY_MODE_SELECT_OPTIONS,
+ },
+ statisticsMode: {
+ title: formI18n('form.statistics-mode'),
+ options: STATISTICS_MODE_SELECT_OPTIONS,
+ },
+ tracingLevel: {
+ title: formI18n('form.tracing-level'),
+ options: TRACING_LEVEL_SELECT_OPTIONS,
+ },
+ timeout: {
+ title: formI18n('form.timeout'),
+ },
+} as const;
diff --git a/src/containers/Tenant/Query/i18n/en.json b/src/containers/Tenant/Query/i18n/en.json
index 33ccc7d99..604c42b50 100644
--- a/src/containers/Tenant/Query/i18n/en.json
+++ b/src/containers/Tenant/Query/i18n/en.json
@@ -46,5 +46,8 @@
"action.send-selected-query": "Send selected query",
"action.previous-query": "Previous query in history",
"action.next-query": "Next query in history",
- "action.save-query": "Save query"
+ "action.save-query": "Save query",
+
+ "gear.tooltip": "Query execution settings have been changed for {{changesText}}",
+ "banner.query-settings.message": "Query results are displayed for {{message}}"
}
diff --git a/src/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx b/src/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx
index bc0c20655..9cb2c12d5 100644
--- a/src/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx
+++ b/src/containers/Tenant/Schema/SchemaTree/SchemaTree.tsx
@@ -8,7 +8,7 @@ import {NavigationTree} from 'ydb-ui-components';
import {USE_DIRECTORY_OPERATIONS} from '../../../../lib';
import {schemaApi} from '../../../../store/reducers/schema/schema';
import type {EPathType, TEvDescribeSchemeResult} from '../../../../types/api/schema';
-import {useQueryModes, useSetting, useTypedDispatch} from '../../../../utils/hooks';
+import {useQueryExecutionSettings, useSetting, useTypedDispatch} from '../../../../utils/hooks';
import {isChildlessPathType, mapPathTypeToNavigationTreeType} from '../../utils/schema';
import {getActions} from '../../utils/schemaActions';
import {getControls} from '../../utils/schemaControls';
@@ -27,7 +27,7 @@ export function SchemaTree(props: SchemaTreeProps) {
const {rootPath, rootName, rootType, currentPath, onActivePathUpdate} = props;
const dispatch = useTypedDispatch();
- const [_, setQueryMode] = useQueryModes();
+ const [_, setQueryExecutionSettings] = useQueryExecutionSettings();
const [createDirectoryOpen, setCreateDirectoryOpen] = React.useState(false);
const [parentPath, setParentPath] = React.useState('');
const [schemaTreeKey, setSchemaTreeKey] = React.useState('');
@@ -112,7 +112,7 @@ export function SchemaTree(props: SchemaTreeProps) {
fetchPath={fetchPath}
getActions={getActions(dispatch, {
setActivePath: onActivePathUpdate,
- setQueryMode,
+ setQueryExecutionSettings,
showCreateDirectoryDialog: useDirectoryActions
? handleOpenCreateDirectoryDialog
: undefined,
diff --git a/src/containers/Tenant/utils/schemaActions.ts b/src/containers/Tenant/utils/schemaActions.ts
index 35ccddb53..aeee7f192 100644
--- a/src/containers/Tenant/utils/schemaActions.ts
+++ b/src/containers/Tenant/utils/schemaActions.ts
@@ -1,10 +1,11 @@
import copy from 'copy-to-clipboard';
import type {NavigationTreeNodeType, NavigationTreeProps} from 'ydb-ui-components';
+import {DEFAULT_QUERY_SETTINGS} from '../../../lib';
import {changeUserInput} from '../../../store/reducers/executeQuery';
import {TENANT_PAGES_IDS, TENANT_QUERY_TABS_ID} from '../../../store/reducers/tenant/constants';
import {setQueryTab, setTenantPage} from '../../../store/reducers/tenant/tenant';
-import type {QueryMode} from '../../../types/store/query';
+import type {QueryMode, QuerySettings} from '../../../types/store/query';
import createToast from '../../../utils/createToast';
import i18n from '../i18n';
@@ -27,7 +28,7 @@ import {
} from './queryTemplates';
interface ActionsAdditionalEffects {
- setQueryMode: (mode: QueryMode) => void;
+ setQueryExecutionSettings: (settings: QuerySettings) => void;
setActivePath: (path: string) => void;
showCreateDirectoryDialog?: (path: string) => void;
}
@@ -37,11 +38,11 @@ const bindActions = (
dispatch: React.Dispatch
,
additionalEffects: ActionsAdditionalEffects,
) => {
- const {setActivePath, setQueryMode, showCreateDirectoryDialog} = additionalEffects;
+ const {setActivePath, setQueryExecutionSettings, showCreateDirectoryDialog} = additionalEffects;
const inputQuery = (tmpl: (path: string) => string, mode?: QueryMode) => () => {
if (mode) {
- setQueryMode(mode);
+ setQueryExecutionSettings({...DEFAULT_QUERY_SETTINGS, queryMode: mode});
}
dispatch(changeUserInput({input: tmpl(path)}));
diff --git a/src/services/api.ts b/src/services/api.ts
index 51e77eb68..b25fda222 100644
--- a/src/services/api.ts
+++ b/src/services/api.ts
@@ -25,6 +25,10 @@ import type {
ExplainResponse,
QueryAPIResponse,
Schemas,
+ Stats,
+ Timeout,
+ TracingLevel,
+ TransactionMode,
} from '../types/api/query';
import type {JsonRenderRequestParams, JsonRenderResponse} from '../types/api/render';
import type {RestartPDiskResponse} from '../types/api/restartPDisk';
@@ -438,9 +442,12 @@ export class YdbEmbeddedAPI extends AxiosWrapper {
query?: string;
database?: string;
action?: Action;
- stats?: string;
schema?: Schema;
syntax?: QuerySyntax;
+ stats?: Stats;
+ tracingLevel?: TracingLevel;
+ transaction_mode?: TransactionMode;
+ timeout?: Timeout;
},
{concurrentId, signal}: AxiosOptions = {},
) {
@@ -469,25 +476,45 @@ export class YdbEmbeddedAPI extends AxiosWrapper {
concurrentId,
timeout: uiTimeout,
requestConfig: {signal},
- },
- );
- }
- getExplainQuery(
- query: string,
- database: string,
- action: Action,
- syntax?: QuerySyntax,
- ) {
+ headers: params.tracingLevel
+ ? {
+ 'X-Trace-Verbosity': params.tracingLevel,
+ }
+ : undefined,
+ },
+ );
+ }
+ getExplainQuery(params: {
+ query: string;
+ database: string;
+ action: Action;
+ syntax?: QuerySyntax;
+ stats?: Stats;
+ tracingLevel?: TracingLevel;
+ // eslint-disable-next-line camelcase
+ transaction_mode?: TransactionMode;
+ timeout?: Timeout;
+ }) {
return this.post | ErrorResponse>(
this.getPath('/viewer/json/query'),
{
- query,
- database,
- action: action || 'explain',
- syntax,
- timeout: 600000,
+ query: params.query,
+ database: params.database,
+ action: params.action || 'explain',
+ syntax: params.syntax,
+ timeout: params.timeout,
+ stats: params.stats,
+ // eslint-disable-next-line camelcase
+ transaction_mode: params.transaction_mode,
},
{},
+ {
+ headers: params.tracingLevel
+ ? {
+ 'X-Trace-Verbosity': params.tracingLevel,
+ }
+ : undefined,
+ },
);
}
getExplainQueryAst(query: string, database: string) {
diff --git a/src/services/settings.ts b/src/services/settings.ts
index 62f803143..b1e487679 100644
--- a/src/services/settings.ts
+++ b/src/services/settings.ts
@@ -4,14 +4,17 @@ import {
AUTOCOMPLETE_ON_ENTER,
AUTO_REFRESH_INTERVAL,
BINARY_DATA_IN_PLAIN_TEXT_DISPLAY,
+ DEFAULT_QUERY_SETTINGS,
ENABLE_AUTOCOMPLETE,
INVERTED_DISKS_KEY,
IS_HOTKEYS_HELP_HIDDEN_KEY,
LANGUAGE_KEY,
+ LAST_QUERY_EXECUTION_SETTINGS_KEY,
LAST_USED_QUERY_ACTION_KEY,
PARTITIONS_HIDDEN_COLUMNS_KEY,
- QUERY_INITIAL_MODE_KEY,
+ QUERY_EXECUTION_SETTINGS_KEY,
QUERY_SETTINGS,
+ QUERY_SETTINGS_BANNER_LAST_CLOSED_KEY,
QUERY_USE_MULTI_SCHEMA_KEY,
SAVED_QUERIES_KEY,
TENANT_INITIAL_PAGE_KEY,
@@ -22,7 +25,7 @@ import {
USE_PAGINATED_TABLES_KEY,
USE_SEPARATE_DISKS_PAGES_KEY,
} from '../utils/constants';
-import {QUERY_ACTIONS, QUERY_MODES} from '../utils/query';
+import {QUERY_ACTIONS} from '../utils/query';
import {parseJson} from '../utils/utils';
export type SettingsObject = Record;
@@ -37,7 +40,6 @@ export const DEFAULT_USER_SETTINGS = {
[BINARY_DATA_IN_PLAIN_TEXT_DISPLAY]: true,
[SAVED_QUERIES_KEY]: [],
[TENANT_INITIAL_PAGE_KEY]: TENANT_PAGES_IDS.query,
- [QUERY_INITIAL_MODE_KEY]: QUERY_MODES.script,
[LAST_USED_QUERY_ACTION_KEY]: QUERY_ACTIONS.execute,
[ASIDE_HEADER_COMPACT_KEY]: true,
[PARTITIONS_HIDDEN_COLUMNS_KEY]: [],
@@ -50,6 +52,9 @@ export const DEFAULT_USER_SETTINGS = {
[AUTO_REFRESH_INTERVAL]: 0,
[USE_DIRECTORY_OPERATIONS]: false,
[QUERY_SETTINGS]: false,
+ [LAST_QUERY_EXECUTION_SETTINGS_KEY]: undefined,
+ [QUERY_SETTINGS_BANNER_LAST_CLOSED_KEY]: undefined,
+ [QUERY_EXECUTION_SETTINGS_KEY]: DEFAULT_QUERY_SETTINGS,
} as const satisfies SettingsObject;
class SettingsManager {
diff --git a/src/store/reducers/executeQuery.ts b/src/store/reducers/executeQuery.ts
index bb19f32ed..99e2083c3 100644
--- a/src/store/reducers/executeQuery.ts
+++ b/src/store/reducers/executeQuery.ts
@@ -1,6 +1,7 @@
import type {Reducer} from '@reduxjs/toolkit';
import {settingsManager} from '../../services/settings';
+import {TracingLevelNumber} from '../../types/api/query';
import type {ExecuteActions, Schemas} from '../../types/api/query';
import type {
ExecuteQueryAction,
@@ -12,6 +13,7 @@ import type {
IQueryResult,
QueryMode,
QueryRequestParams,
+ QuerySettings,
QuerySyntax,
} from '../../types/store/query';
import {QUERIES_HISTORY_KEY} from '../../utils/constants';
@@ -21,6 +23,7 @@ import {
isQueryErrorResponse,
parseQueryAPIExecuteResponse,
} from '../../utils/query';
+import {isNumeric} from '../../utils/utils';
import {createRequestActionTypes} from '../utils';
import {api} from './api';
@@ -139,22 +142,22 @@ const executeQuery: Reducer = (
};
interface SendQueryParams extends QueryRequestParams {
- mode?: QueryMode;
+ querySettings?: QuerySettings;
schema?: Schemas;
}
export const executeQueryApi = api.injectEndpoints({
endpoints: (build) => ({
executeQuery: build.mutation({
- queryFn: async ({query, database, mode, schema = 'modern'}) => {
+ queryFn: async ({query, database, querySettings, schema = 'modern'}) => {
let action: ExecuteActions = 'execute';
let syntax: QuerySyntax = QUERY_SYNTAX.yql;
- if (mode === 'pg') {
+ if (querySettings?.queryMode === 'pg') {
action = 'execute-query';
syntax = QUERY_SYNTAX.pg;
- } else if (mode) {
- action = `execute-${mode}`;
+ } else if (querySettings?.queryMode) {
+ action = `execute-${querySettings?.queryMode}`;
}
try {
@@ -164,7 +167,14 @@ export const executeQueryApi = api.injectEndpoints({
database,
action,
syntax,
- stats: 'full',
+ stats: querySettings?.statisticsMode,
+ tracingLevel: querySettings?.tracingLevel
+ ? TracingLevelNumber[querySettings?.tracingLevel]
+ : undefined,
+ transaction_mode: querySettings?.isolationLevel,
+ timeout: isNumeric(querySettings?.timeout)
+ ? Number(querySettings?.timeout) * 1000
+ : undefined,
});
if (isQueryErrorResponse(response)) {
diff --git a/src/store/reducers/explainQuery/explainQuery.ts b/src/store/reducers/explainQuery/explainQuery.ts
index 0c3dce80c..ebb0e81e9 100644
--- a/src/store/reducers/explainQuery/explainQuery.ts
+++ b/src/store/reducers/explainQuery/explainQuery.ts
@@ -1,36 +1,46 @@
+import {TracingLevelNumber} from '../../../types/api/query';
import type {ExplainActions} from '../../../types/api/query';
-import type {QueryMode, QueryRequestParams, QuerySyntax} from '../../../types/store/query';
+import type {QueryRequestParams, QuerySettings, QuerySyntax} from '../../../types/store/query';
import {QUERY_SYNTAX, isQueryErrorResponse} from '../../../utils/query';
+import {isNumeric} from '../../../utils/utils';
import {api} from '../api';
import type {PreparedExplainResponse} from './types';
import {prepareExplainResponse} from './utils';
interface ExplainQueryParams extends QueryRequestParams {
- mode?: QueryMode;
+ querySettings?: QuerySettings;
}
export const explainQueryApi = api.injectEndpoints({
endpoints: (build) => ({
explainQuery: build.mutation({
- queryFn: async ({query, database, mode}) => {
+ queryFn: async ({query, database, querySettings}) => {
let action: ExplainActions = 'explain';
let syntax: QuerySyntax = QUERY_SYNTAX.yql;
- if (mode === 'pg') {
+ if (querySettings?.queryMode === 'pg') {
action = 'explain-query';
syntax = QUERY_SYNTAX.pg;
- } else if (mode) {
- action = `explain-${mode}`;
+ } else if (querySettings?.queryMode) {
+ action = `explain-${querySettings?.queryMode}`;
}
try {
- const response = await window.api.getExplainQuery(
+ const response = await window.api.getExplainQuery({
query,
database,
action,
syntax,
- );
+ stats: querySettings?.statisticsMode,
+ tracingLevel: querySettings?.tracingLevel
+ ? TracingLevelNumber[querySettings?.tracingLevel]
+ : undefined,
+ transaction_mode: querySettings?.isolationLevel,
+ timeout: isNumeric(querySettings?.timeout)
+ ? Number(querySettings?.timeout) * 1000
+ : undefined,
+ });
if (isQueryErrorResponse(response)) {
return {error: response};
diff --git a/src/types/api/query.ts b/src/types/api/query.ts
index ad07918aa..c0088037b 100644
--- a/src/types/api/query.ts
+++ b/src/types/api/query.ts
@@ -1,3 +1,6 @@
+import {TRACING_LEVELS} from '../../utils/query';
+import type {IsolationLevel, StatisticsMode} from '../store/query';
+
// ==== types from backend protos ====
interface Position {
row?: number;
@@ -179,6 +182,27 @@ export interface ColumnType {
type: string;
}
+export const TracingLevelNumber = {
+ [TRACING_LEVELS.off]: 0,
+ [TRACING_LEVELS.toplevel]: 4,
+ [TRACING_LEVELS.basic]: 9,
+ [TRACING_LEVELS.detailed]: 13,
+ [TRACING_LEVELS.diagnostic]: 14,
+ [TRACING_LEVELS.trace]: 15,
+};
+
+/** undefined = 'none' */
+export type Stats = StatisticsMode;
+
+/** undefined = '60000' */
+export type Timeout = number;
+
+/** undefined = 'serializable-read-write' */
+export type TransactionMode = IsolationLevel;
+
+/** undefined = '15' */
+export type TracingLevel = number;
+
/** undefined = 'classic' */
export type Schemas = 'classic' | 'modern' | 'ydb' | 'multi' | undefined;
diff --git a/src/types/store/query.ts b/src/types/store/query.ts
index 7279b795b..8325f45cd 100644
--- a/src/types/store/query.ts
+++ b/src/types/store/query.ts
@@ -36,6 +36,14 @@ export interface QueryRequestParams {
query: string;
}
+export interface QuerySettings {
+ queryMode: QueryMode;
+ isolationLevel: IsolationLevel;
+ timeout?: string;
+ statisticsMode?: StatisticsMode;
+ tracingLevel?: TracingLevel;
+}
+
export type QueryErrorResponse = IResponseError;
export type QueryError = NetworkError | QueryErrorResponse;
diff --git a/src/utils/constants.ts b/src/utils/constants.ts
index f67a1d16f..22dbfcff4 100644
--- a/src/utils/constants.ts
+++ b/src/utils/constants.ts
@@ -2,6 +2,9 @@ import DataTable from '@gravity-ui/react-data-table';
import type {Settings} from '@gravity-ui/react-data-table';
import {EType} from '../types/api/tablet';
+import type {QuerySettings} from '../types/store/query';
+
+import {ISOLATION_LEVELS, QUERY_MODES, STATISTICS_MODES, TRACING_LEVELS} from './query';
const SECOND = 1000;
@@ -18,6 +21,7 @@ export const TERABYTE = 1_000_000_000_000;
export const MINUTE_IN_SECONDS = 60;
export const HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS;
export const DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS;
+export const WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS;
export const MS_IN_NANOSECONDS = 1000000;
@@ -118,7 +122,18 @@ export const TENANT_OVERVIEW_TABLES_SETTINGS = {
dynamicRender: false,
} as const;
-export const QUERY_INITIAL_MODE_KEY = 'query_initial_mode';
+export const DEFAULT_QUERY_SETTINGS: QuerySettings = {
+ queryMode: QUERY_MODES.script,
+ isolationLevel: ISOLATION_LEVELS.serializable,
+ timeout: '60',
+ statisticsMode: STATISTICS_MODES.none,
+ tracingLevel: TRACING_LEVELS.detailed,
+};
+
+export const QUERY_EXECUTION_SETTINGS_KEY = 'queryExecutionSettings';
+export const LAST_QUERY_EXECUTION_SETTINGS_KEY = 'last_query_execution_settings';
+export const QUERY_SETTINGS_BANNER_LAST_CLOSED_KEY = 'querySettingsBannerLastClosed';
+
export const LAST_USED_QUERY_ACTION_KEY = 'last_used_query_action';
export const PARTITIONS_HIDDEN_COLUMNS_KEY = 'partitionsHiddenColumns';
diff --git a/src/utils/hooks/index.ts b/src/utils/hooks/index.ts
index 1f951947b..0aa4f3ab0 100644
--- a/src/utils/hooks/index.ts
+++ b/src/utils/hooks/index.ts
@@ -1,7 +1,7 @@
export * from './useTypedSelector';
export * from './useTypedDispatch';
export * from './useSetting';
-export * from './useQueryModes';
+export * from './useQueryExecutionSettings';
export * from './useTableSort';
export * from './useSearchQuery';
export * from './useAutoRefreshInterval';
diff --git a/src/utils/hooks/useIsQuerySettingsBannerHidden.ts b/src/utils/hooks/useIsQuerySettingsBannerHidden.ts
new file mode 100644
index 000000000..0e873015c
--- /dev/null
+++ b/src/utils/hooks/useIsQuerySettingsBannerHidden.ts
@@ -0,0 +1,30 @@
+import React from 'react';
+
+import getChangedQueryExecutionSettingsDescription from '../../containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettingsDescription';
+import {DEFAULT_QUERY_SETTINGS, WEEK_IN_SECONDS} from '../constants';
+
+import {useLastQueryExecutionSettings} from './useLastQueryExecutionSettings';
+import {useQuerySettingsBannerLastClosed} from './useQuerySettingsBannerLastClosed';
+
+export const useIsQuerySettingsBannerHidden = () => {
+ const [lastQueryExecutionSettings] = useLastQueryExecutionSettings();
+ const [querySettingsBannerLastClosed] = useQuerySettingsBannerLastClosed();
+
+ const changedQuerySettingsDescription = React.useMemo(() => {
+ return lastQueryExecutionSettings
+ ? getChangedQueryExecutionSettingsDescription({
+ currentSettings: lastQueryExecutionSettings,
+ defaultSettings: DEFAULT_QUERY_SETTINGS,
+ })
+ : undefined;
+ }, [lastQueryExecutionSettings]);
+
+ const isShownLately = React.useMemo(() => {
+ return (
+ querySettingsBannerLastClosed &&
+ new Date().getTime() - querySettingsBannerLastClosed < WEEK_IN_SECONDS
+ );
+ }, [querySettingsBannerLastClosed]);
+
+ return changedQuerySettingsDescription && isShownLately;
+};
diff --git a/src/utils/hooks/useLastQueryExecutionSettings.ts b/src/utils/hooks/useLastQueryExecutionSettings.ts
new file mode 100644
index 000000000..872441feb
--- /dev/null
+++ b/src/utils/hooks/useLastQueryExecutionSettings.ts
@@ -0,0 +1,8 @@
+import type {QuerySettings} from '../../types/store/query';
+import {LAST_QUERY_EXECUTION_SETTINGS_KEY} from '../constants';
+
+import {useSetting} from './useSetting';
+
+export const useLastQueryExecutionSettings = () => {
+ return useSetting(LAST_QUERY_EXECUTION_SETTINGS_KEY);
+};
diff --git a/src/utils/hooks/useQueryExecutionSettings.ts b/src/utils/hooks/useQueryExecutionSettings.ts
new file mode 100644
index 000000000..107b529c5
--- /dev/null
+++ b/src/utils/hooks/useQueryExecutionSettings.ts
@@ -0,0 +1,8 @@
+import type {QuerySettings} from '../../types/store/query';
+import {QUERY_EXECUTION_SETTINGS_KEY} from '../constants';
+
+import {useSetting} from './useSetting';
+
+export const useQueryExecutionSettings = () => {
+ return useSetting(QUERY_EXECUTION_SETTINGS_KEY);
+};
diff --git a/src/utils/hooks/useQueryModes.ts b/src/utils/hooks/useQueryModes.ts
deleted file mode 100644
index 165c1a8d2..000000000
--- a/src/utils/hooks/useQueryModes.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import type {QueryMode} from '../../types/store/query';
-import {QUERY_INITIAL_MODE_KEY} from '../constants';
-
-import {useSetting} from './useSetting';
-
-export const useQueryModes = () => {
- return useSetting(QUERY_INITIAL_MODE_KEY);
-};
diff --git a/src/utils/hooks/useQuerySettingsBannerLastClosed.ts b/src/utils/hooks/useQuerySettingsBannerLastClosed.ts
new file mode 100644
index 000000000..5f0fdff0c
--- /dev/null
+++ b/src/utils/hooks/useQuerySettingsBannerLastClosed.ts
@@ -0,0 +1,7 @@
+import {QUERY_SETTINGS_BANNER_LAST_CLOSED_KEY} from '../constants';
+
+import {useSetting} from './useSetting';
+
+export const useQuerySettingsBannerLastClosed = () => {
+ return useSetting(QUERY_SETTINGS_BANNER_LAST_CLOSED_KEY);
+};