@@ -215,98 +215,110 @@ bool FillCreateTableSettingsDesc(NKikimrSchemeOp::TTableDescription& tableDesc,
215215 return true ;
216216}
217217
218- bool FillAlterTableSettingsDesc (NKikimrSchemeOp::TTableDescription& tableDesc,
219- const Ydb::Table::AlterTableRequest& proto,
220- Ydb::StatusIds::StatusCode& code, TString& error, bool changed)
221- {
222- bool hadPartitionConfig = tableDesc.HasPartitionConfig ();
223- auto &partitionConfig = *tableDesc.MutablePartitionConfig ();
224-
225- if (proto.has_alter_partitioning_settings ()) {
226- auto & alterSettings = proto.alter_partitioning_settings ();
227-
228- switch (alterSettings.partitioning_by_size ()) {
229- case Ydb::FeatureFlag::STATUS_UNSPECIFIED:
230- if (alterSettings.partition_size_mb ()) {
231- auto &policy = *partitionConfig.MutablePartitioningPolicy ();
232- policy.SetSizeToSplit ((1 << 20 ) * alterSettings.partition_size_mb ());
233- changed = true ;
234- }
235- break ;
236- case Ydb::FeatureFlag::ENABLED:
237- {
238- auto &policy = *partitionConfig.MutablePartitioningPolicy ();
239- if (alterSettings.partition_size_mb ()) {
240- policy.SetSizeToSplit ((1 << 20 ) * alterSettings.partition_size_mb ());
241- } else {
242- policy.SetSizeToSplit (defaultSizeToSplit);
243- }
244- if (!alterSettings.min_partitions_count ()) {
245- policy.SetMinPartitionsCount (defaultMinPartitions);
246- }
247- changed = true ;
248- break ;
249- }
250- case Ydb::FeatureFlag::DISABLED:
251- {
252- if (alterSettings.partition_size_mb ()) {
253- code = Ydb::StatusIds::BAD_REQUEST;
254- error = TStringBuilder () << " Auto partitioning partition size is set while "
255- " auto partitioning by size is disabled" ;
256- return false ;
257- }
258- auto &policy = *partitionConfig.MutablePartitioningPolicy ();
259- policy.SetSizeToSplit (0 );
260- changed = true ;
261- break ;
218+ bool FillPartitioningPolicy (
219+ // TO DO: rename from Getter to GetOrCreate
220+ std::function<NKikimrSchemeOp::TPartitioningPolicy*()>&& partitioningPolicyGetter,
221+ const Ydb::Table::PartitioningSettings& alterSettings,
222+ Ydb::StatusIds::StatusCode& code,
223+ TString& error
224+ ) {
225+ switch (alterSettings.partitioning_by_size ()) {
226+ case Ydb::FeatureFlag::STATUS_UNSPECIFIED:
227+ if (alterSettings.partition_size_mb ()) {
228+ partitioningPolicyGetter ()->SetSizeToSplit ((1 << 20 ) * alterSettings.partition_size_mb ());
262229 }
263- default :
264- code = Ydb::StatusIds::BAD_REQUEST;
265- error = TStringBuilder () << " Unknown auto partitioning by size feature flag status: '"
266- << (ui32)alterSettings.partitioning_by_size () << " '" ;
267- return false ;
230+ break ;
231+ case Ydb::FeatureFlag::ENABLED:
232+ {
233+ auto * policy = partitioningPolicyGetter ();
234+ if (alterSettings.partition_size_mb ()) {
235+ policy->SetSizeToSplit ((1 << 20 ) * alterSettings.partition_size_mb ());
236+ } else {
237+ policy->SetSizeToSplit (defaultSizeToSplit);
268238 }
269239
270- switch (alterSettings.partitioning_by_load ()) {
271- case Ydb::FeatureFlag::STATUS_UNSPECIFIED:
272- {
273- changed = true ;
274- break ;
275- }
276- case Ydb::FeatureFlag::ENABLED:
277- {
278- auto &policy = *partitionConfig.MutablePartitioningPolicy ();
279- policy.MutableSplitByLoadSettings ()->SetEnabled (true );
280- if (!alterSettings.min_partitions_count ()) {
281- policy.SetMinPartitionsCount (defaultMinPartitions);
282- }
283- changed = true ;
284- break ;
285- }
286- case Ydb::FeatureFlag::DISABLED:
287- {
288- auto &policy = *partitionConfig.MutablePartitioningPolicy ();
289- policy.MutableSplitByLoadSettings ()->SetEnabled (false );
290- changed = true ;
291- break ;
240+ if (!alterSettings.min_partitions_count ()) {
241+ policy->SetMinPartitionsCount (defaultMinPartitions);
292242 }
293- default :
243+ break ;
244+ }
245+ case Ydb::FeatureFlag::DISABLED:
246+ {
247+ if (alterSettings.partition_size_mb ()) {
294248 code = Ydb::StatusIds::BAD_REQUEST;
295- error = TStringBuilder () << " Unknown auto partitioning by load feature flag status: ' "
296- << (ui32)alterSettings. partitioning_by_load () << " ' " ;
249+ error = TStringBuilder () << " Auto partitioning partition size is set while "
250+ " auto partitioning by size is disabled " ;
297251 return false ;
298252 }
253+ partitioningPolicyGetter ()->SetSizeToSplit (0 );
254+ break ;
255+ }
256+ default :
257+ code = Ydb::StatusIds::BAD_REQUEST;
258+ error = TStringBuilder () << " Unknown auto partitioning by size feature flag status: '"
259+ << (ui32)alterSettings.partitioning_by_size () << " '" ;
260+ return false ;
261+ }
299262
300- if (alterSettings.min_partitions_count ()) {
301- auto &policy = *partitionConfig.MutablePartitioningPolicy ();
302- policy.SetMinPartitionsCount (alterSettings.min_partitions_count ());
303- changed = true ;
263+ switch (alterSettings.partitioning_by_load ()) {
264+ case Ydb::FeatureFlag::STATUS_UNSPECIFIED:
265+ {
266+ // allocates the protobuf
267+ partitioningPolicyGetter ();
268+ break ;
269+ }
270+ case Ydb::FeatureFlag::ENABLED:
271+ {
272+ auto * policy = partitioningPolicyGetter ();
273+ policy->MutableSplitByLoadSettings ()->SetEnabled (true );
274+ if (!alterSettings.min_partitions_count ()) {
275+ policy->SetMinPartitionsCount (defaultMinPartitions);
304276 }
277+ break ;
278+ }
279+ case Ydb::FeatureFlag::DISABLED:
280+ {
281+ partitioningPolicyGetter ()->MutableSplitByLoadSettings ()->SetEnabled (false );
282+ break ;
283+ }
284+ default :
285+ code = Ydb::StatusIds::BAD_REQUEST;
286+ error = TStringBuilder () << " Unknown auto partitioning by load feature flag status: '"
287+ << (ui32)alterSettings.partitioning_by_load () << " '" ;
288+ return false ;
289+ }
305290
306- if (alterSettings.max_partitions_count ()) {
307- auto &policy = *partitionConfig.MutablePartitioningPolicy ();
308- policy.SetMaxPartitionsCount (alterSettings.max_partitions_count ());
309- changed = true ;
291+ if (alterSettings.min_partitions_count ()) {
292+ partitioningPolicyGetter ()->SetMinPartitionsCount (alterSettings.min_partitions_count ());
293+ }
294+
295+ if (alterSettings.max_partitions_count ()) {
296+ partitioningPolicyGetter ()->SetMaxPartitionsCount (alterSettings.max_partitions_count ());
297+ }
298+
299+ return true ;
300+ }
301+
302+ bool FillAlterTableSettingsDesc (NKikimrSchemeOp::TTableDescription& tableDesc,
303+ const Ydb::Table::AlterTableRequest& proto,
304+ Ydb::StatusIds::StatusCode& code, TString& error, bool changed)
305+ {
306+ bool hadPartitionConfig = tableDesc.HasPartitionConfig ();
307+ auto &partitionConfig = *tableDesc.MutablePartitionConfig ();
308+
309+ if (proto.has_alter_partitioning_settings ()) {
310+ if (!FillPartitioningPolicy (
311+ [&partitionConfig, &changed]() {
312+ // changed at least because the partitioning policy is allocated
313+ changed = true ;
314+ return partitionConfig.MutablePartitioningPolicy ();
315+ },
316+ proto.alter_partitioning_settings (),
317+ code,
318+ error
319+ )
320+ ) {
321+ return false ;
310322 }
311323 }
312324
0 commit comments