Skip to content

Commit fed9ed5

Browse files
committed
fix: add setting for query parameter output_chunk_max_size
1 parent d1a6ade commit fed9ed5

File tree

6 files changed

+61
-3
lines changed

6 files changed

+61
-3
lines changed

src/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsDialog.tsx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,41 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm
220220
/>
221221
</div>
222222
</Flex>
223+
<Flex direction="row" alignItems="flex-start" className={b('dialog-row')}>
224+
<label htmlFor="outputChunkMaxSize" className={b('field-title')}>
225+
{QUERY_SETTINGS_FIELD_SETTINGS.outputChunkMaxSize.title}
226+
</label>
227+
<div className={b('control-wrapper')}>
228+
<Controller
229+
name="outputChunkMaxSize"
230+
control={control}
231+
render={({field}) => (
232+
<TextInput
233+
id="outputChunkMaxSize"
234+
type="number"
235+
{...field}
236+
value={
237+
field.value !== undefined && field.value !== null
238+
? field.value.toString()
239+
: ''
240+
}
241+
className={b('limit-rows')}
242+
placeholder="1000000"
243+
validationState={
244+
errors.outputChunkMaxSize ? 'invalid' : undefined
245+
}
246+
errorMessage={errors.outputChunkMaxSize?.message}
247+
errorPlacement="inside"
248+
endContent={
249+
<span className={b('postfix')}>
250+
{i18n('form.output-chunk-max-size.bytes')}
251+
</span>
252+
}
253+
/>
254+
)}
255+
/>
256+
</div>
257+
</Flex>
223258
<Flex direction="row" alignItems="flex-start" className={b('dialog-row')}>
224259
<label htmlFor="pragmas" className={b('field-title')}>
225260
{QUERY_SETTINGS_FIELD_SETTINGS.pragmas.title}

src/containers/Tenant/Query/QuerySettingsDialog/constants.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ export const QUERY_SETTINGS_FIELD_SETTINGS = {
151151
limitRows: {
152152
title: formI18n('form.limit-rows'),
153153
},
154+
outputChunkMaxSize: {
155+
title: formI18n('form.output-chunk-max-size'),
156+
},
154157
pragmas: {
155158
title: formI18n('form.pragmas'),
156159
},

src/containers/Tenant/Query/QuerySettingsDialog/i18n/en.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
"form.statistics-mode": "Statistics collection mode",
77
"form.tracing-level": "Tracing level",
88
"form.limit-rows": "Limit rows",
9+
"form.output-chunk-max-size": "Output chunk max size",
10+
"form.output-chunk-max-size.bytes": "bytes",
911
"form.pragmas": "Pragmas",
1012
"button-done": "Save",
1113
"tooltip_plan-to-svg-statistics": "Statistics option is set to \"Full\" due to the enabled \"Execution plan\" experiment.\n To disable it, go to the \"Experiments\" section in the user settings.",

src/containers/Tenant/Query/QuerySettingsDialog/i18n/ru.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
"form.statistics-mode": "Режим сбора статистики",
77
"form.tracing-level": "Tracing level",
88
"form.limit-rows": "Лимит строк",
9+
"form.output-chunk-max-size": "Максимальный размер чанка",
10+
"form.output-chunk-max-size.bytes": "байт",
911
"form.pragmas": "Прагмы",
1012
"tooltip_plan-to-svg-statistics": "Опция статистики установлена в значение \"Full\" из-за включенного эксперимента \"Execution plan\".\n Чтобы отключить его, перейдите в раздел \"Experiments\" в настройках пользователя.",
1113
"button-done": "Готово",

src/store/reducers/query/query.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type {QueryAction, QueryRequestParams, QuerySettings} from '../../../type
66
import type {StreamDataChunk} from '../../../types/store/streaming';
77
import {loadFromSessionStorage, saveToSessionStorage} from '../../../utils';
88
import {QUERY_EDITOR_CURRENT_QUERY_KEY, QUERY_EDITOR_DIRTY_KEY} from '../../../utils/constants';
9-
import {isQueryErrorResponse} from '../../../utils/query';
9+
import {DEFAULT_QUERY_SETTINGS, isQueryErrorResponse} from '../../../utils/query';
1010
import {isNumeric} from '../../../utils/utils';
1111
import type {RootState} from '../../defaultStore';
1212
import {api} from '../api';
@@ -132,7 +132,7 @@ interface SendQueryParams extends QueryRequestParams {
132132
// Stream query receives queryId from session chunk.
133133
type StreamQueryParams = Omit<SendQueryParams, 'queryId'>;
134134

135-
const DEFAULT_STREAM_CHUNK_SIZE = 1000;
135+
const DEFAULT_STREAM_CHUNK_SIZE = DEFAULT_QUERY_SETTINGS.outputChunkMaxSize;
136136
const DEFAULT_CONCURRENT_RESULTS = false;
137137

138138
export const queryApi = api.injectEndpoints({
@@ -192,7 +192,9 @@ export const queryApi = api.injectEndpoints({
192192
timeout: isNumeric(querySettings.timeout)
193193
? Number(querySettings.timeout) * 1000
194194
: undefined,
195-
output_chunk_max_size: DEFAULT_STREAM_CHUNK_SIZE,
195+
output_chunk_max_size: isNumeric(querySettings.outputChunkMaxSize)
196+
? Number(querySettings.outputChunkMaxSize)
197+
: DEFAULT_STREAM_CHUNK_SIZE,
196198
concurrent_results: DEFAULT_CONCURRENT_RESULTS || undefined,
197199
base64,
198200
},

src/utils/query.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ export const DEFAULT_QUERY_SETTINGS = {
311311
statisticsMode: STATISTICS_MODES.none,
312312
tracingLevel: TRACING_LEVELS.off,
313313
pragmas: defaultPragma,
314+
outputChunkMaxSize: 1_000_000,
314315
};
315316

316317
export const queryModeSchema = z.nativeEnum(QUERY_MODES);
@@ -330,6 +331,10 @@ export const querySettingsValidationSchema = z.object({
330331
(val) => (val === '' ? undefined : val),
331332
z.coerce.number().gt(0).lte(100_000).or(z.undefined()),
332333
),
334+
outputChunkMaxSize: z.preprocess(
335+
(val) => (val === '' ? undefined : val),
336+
z.coerce.number().int().positive().or(z.undefined()),
337+
),
333338
queryMode: queryModeSchema,
334339
transactionMode: transactionModeSchema,
335340
statisticsMode: statisticsModeSchema,
@@ -347,6 +352,15 @@ export const querySettingsRestoreSchema = z
347352
(val) => (val === '' ? undefined : val),
348353
z.coerce.number().gt(0).lte(100_000).optional().catch(DEFAULT_QUERY_SETTINGS.limitRows),
349354
),
355+
outputChunkMaxSize: z.preprocess(
356+
(val) => (val === '' ? undefined : val),
357+
z.coerce
358+
.number()
359+
.int()
360+
.positive()
361+
.optional()
362+
.catch(DEFAULT_QUERY_SETTINGS.outputChunkMaxSize),
363+
),
350364
queryMode: queryModeSchema.catch(DEFAULT_QUERY_SETTINGS.queryMode),
351365
transactionMode: transactionModeSchema.catch(DEFAULT_QUERY_SETTINGS.transactionMode),
352366
statisticsMode: statisticsModeSchema.catch(DEFAULT_QUERY_SETTINGS.statisticsMode),

0 commit comments

Comments
 (0)