import React from 'react'; import {Button, Dialog, Flex, TextArea, TextInput} from '@gravity-ui/uikit'; import {zodResolver} from '@hookform/resolvers/zod'; import {Controller, useForm} from 'react-hook-form'; import type {z} from 'zod'; import { useSnapshotReadWriteAvailable, useTracingLevelOptionAvailable, } from '../../../../store/reducers/capabilities/hooks'; import { selectQueryAction, setQueryAction, } from '../../../../store/reducers/queryActions/queryActions'; import type {QuerySettings} from '../../../../types/store/query'; import {cn} from '../../../../utils/cn'; import {BRAND_BUTTON_CLASS} from '../../../../utils/constants'; import { useQueryExecutionSettings, useQueryStreamingSetting, useResourcePools, useTypedDispatch, useTypedSelector, } from '../../../../utils/hooks'; import type {ResourcePoolValue} from '../../../../utils/query'; import { RESOURCE_POOL_NO_OVERRIDE_VALUE, TRANSACTION_MODES, isStreamingSupportedForMode, querySettingsValidationSchema, } from '../../../../utils/query'; import {useCurrentSchema} from '../../TenantContext'; import {QuerySettingsSelect} from './QuerySettingsSelect'; import {QuerySettingsTimeout} from './QuerySettingsTimeout'; import {QUERY_SETTINGS_FIELD_SETTINGS} from './constants'; import i18n from './i18n'; import './QuerySettingsDialog.scss'; const b = cn('ydb-query-settings-dialog'); export function QuerySettingsDialog() { const dispatch = useTypedDispatch(); const queryAction = useTypedSelector(selectQueryAction); const [querySettings, setQuerySettings] = useQueryExecutionSettings(); const onClose = React.useCallback(() => { dispatch(setQueryAction('idle')); }, [dispatch]); const onSubmit = React.useCallback( (data: QuerySettings) => { setQuerySettings(data); onClose(); }, [onClose, setQuerySettings], ); return ( ); } interface QuerySettingsFormProps { initialValues: QuerySettings; onSubmit: (data: QuerySettings) => void; onClose: () => void; } type QuerySettingsFormInput = z.input; function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsFormProps) { const { control, handleSubmit, setValue, watch, formState: {errors}, } = useForm({ defaultValues: initialValues, resolver: zodResolver(querySettingsValidationSchema), }); const enableTracingLevel = useTracingLevelOptionAvailable(); const enableSnapshotReadWrite = useSnapshotReadWriteAvailable(); 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'); const transactionMode = watch('transactionMode'); 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]); React.useEffect(() => { if (!enableSnapshotReadWrite && transactionMode === TRANSACTION_MODES.snapshotrw) { setValue('transactionMode', TRANSACTION_MODES.implicit); } }, [enableSnapshotReadWrite, transactionMode, setValue]); const transactionModeOptions = React.useMemo(() => { return QUERY_SETTINGS_FIELD_SETTINGS.transactionMode.options.filter((option) => { if (option.value === TRANSACTION_MODES.snapshotrw) { return enableSnapshotReadWrite; } return true; }); }, [enableSnapshotReadWrite]); return (
( { field.onChange(mode); if (mode !== 'query' && timeout === null) { setValue('timeout', ''); } else if (mode === 'query') { setValue('timeout', null); } }} settingOptions={QUERY_SETTINGS_FIELD_SETTINGS.queryMode.options} /> )} />
{enableTracingLevel && (
( )} />
)}
( )} />
( )} />
( {i18n('form.limit.rows')} } /> )} />
{isQueryStreamingEnabled && (
( {i18n('form.output.chunk.max.size.bytes')} } /> )} />
)}
( id="resourcePool" setting={field.value ?? RESOURCE_POOL_NO_OVERRIDE_VALUE} disabled={isResourcePoolsLoading || !resourcePools.length} onUpdateSetting={(value) => field.onChange(value)} settingOptions={resourcePoolOptions} /> )} />
(