@@ -190,7 +190,7 @@ std::vector<SliceAndKey> filter_existing_slices(std::vector<std::optional<SliceA
190
190
using IntersectingSegments = std::tuple<std::vector<SliceAndKey>, std::vector<SliceAndKey>>;
191
191
192
192
[[nodiscard]] folly::Future<IntersectingSegments> async_intersecting_segments (
193
- const std::vector<SliceAndKey>& affected_keys,
193
+ std::shared_ptr<std:: vector<SliceAndKey>> affected_keys,
194
194
const IndexRange& front_range,
195
195
const IndexRange& back_range,
196
196
VersionId version_id,
@@ -205,7 +205,7 @@ using IntersectingSegments = std::tuple<std::vector<SliceAndKey>, std::vector<Sl
205
205
std::vector<folly::Future<std::optional<SliceAndKey>>> maybe_intersect_before_fut;
206
206
std::vector<folly::Future<std::optional<SliceAndKey>>> maybe_intersect_after_fut;
207
207
208
- for (const auto & affected_slice_and_key : affected_keys) {
208
+ for (const auto & affected_slice_and_key : * affected_keys) {
209
209
const auto & affected_range = affected_slice_and_key.key ().index_range ();
210
210
if (intersects (affected_range, front_range) && !overlaps (affected_range, front_range) &&
211
211
is_before (affected_range, front_range)) {
@@ -267,7 +267,7 @@ VersionedItem delete_range_impl(
267
267
std::end (affected_keys),
268
268
std::back_inserter (unaffected_keys));
269
269
270
- auto [intersect_before, intersect_after] = async_intersecting_segments (affected_keys, index_range, index_range, update_info.next_version_id_ , store).get ();
270
+ auto [intersect_before, intersect_after] = async_intersecting_segments (std::make_shared<std::vector<SliceAndKey>>( affected_keys) , index_range, index_range, update_info.next_version_id_ , store).get ();
271
271
272
272
auto orig_filter_range = std::holds_alternative<std::monostate>(query.row_filter ) ? get_query_index_range (index , index_range) : query.row_filter ;
273
273
@@ -314,7 +314,12 @@ struct UpdateRanges {
314
314
IndexRange original_index_range;
315
315
};
316
316
317
- static UpdateRanges compute_update_ranges (const FilterRange& row_filter, const InputTensorFrame& update_frame, std::span<SliceAndKey> update_slice_and_keys) {
317
+
318
+ static UpdateRanges compute_update_ranges (
319
+ const FilterRange& row_filter,
320
+ const InputTensorFrame& update_frame,
321
+ std::span<SliceAndKey> update_slice_and_keys
322
+ ) {
318
323
return util::variant_match (row_filter,
319
324
[&](std::monostate) -> UpdateRanges {
320
325
util::check (std::holds_alternative<TimeseriesIndex>(update_frame.index ), " Update with row count index is not permitted" );
@@ -356,16 +361,18 @@ static void check_can_update(
356
361
}
357
362
358
363
static std::shared_ptr<std::vector<SliceAndKey>> get_keys_affected_by_update (
359
- const index::IndexSegmentReader& index_segment_reader,
360
- const InputTensorFrame& frame,
361
- const UpdateQuery& query,
362
- bool dynamic_schema) {
364
+ const index::IndexSegmentReader& index_segment_reader,
365
+ const InputTensorFrame& frame,
366
+ const UpdateQuery& query,
367
+ bool dynamic_schema
368
+ ) {
363
369
std::vector<FilterQuery<index ::IndexSegmentReader>> queries = build_update_query_filters<index ::IndexSegmentReader>(
364
- query.row_filter ,
365
- frame.index ,
366
- frame.index_range ,
367
- dynamic_schema,
368
- index_segment_reader.bucketize_dynamic ());
370
+ query.row_filter ,
371
+ frame.index ,
372
+ frame.index_range ,
373
+ dynamic_schema,
374
+ index_segment_reader.bucketize_dynamic ()
375
+ );
369
376
return std::make_shared<std::vector<SliceAndKey>>(filter_index (index_segment_reader, combine_filter_functions (queries)));
370
377
}
371
378
@@ -383,11 +390,12 @@ static std::vector<SliceAndKey> get_keys_not_affected_by_update(
383
390
}
384
391
385
392
static std::pair<std::vector<SliceAndKey>, size_t > get_slice_and_keys_for_update (
386
- const UpdateRanges& update_ranges,
387
- std::span<const SliceAndKey> unaffected_keys,
388
- std::span<const SliceAndKey> affected_keys,
389
- IntersectingSegments&& segments_intersecting_with_update_range,
390
- std::vector<SliceAndKey>&& new_slice_and_keys) {
393
+ const UpdateRanges& update_ranges,
394
+ std::span<const SliceAndKey> unaffected_keys,
395
+ std::span<const SliceAndKey> affected_keys,
396
+ const IntersectingSegments& segments_intersecting_with_update_range,
397
+ std::vector<SliceAndKey>&& new_slice_and_keys
398
+ ) {
391
399
const size_t new_keys_size = new_slice_and_keys.size ();
392
400
size_t row_count = 0 ;
393
401
const std::array<std::vector<SliceAndKey>, 5 > groups{
@@ -409,15 +417,15 @@ folly::Future<AtomKey> async_update_impl(
409
417
const UpdateInfo& update_info,
410
418
const UpdateQuery& query,
411
419
const std::shared_ptr<InputTensorFrame>& frame,
412
- const WriteOptions& options,
420
+ WriteOptions& & options,
413
421
bool dynamic_schema,
414
422
bool empty_types) {
415
423
return index ::async_get_index_reader (*(update_info.previous_index_key_ ), store).thenValue ([
416
424
store,
417
425
update_info,
418
426
query,
419
427
frame,
420
- options=options,
428
+ options=std::move ( options) ,
421
429
dynamic_schema,
422
430
empty_types
423
431
](index ::IndexSegmentReader&& index_segment_reader) {
@@ -441,16 +449,15 @@ folly::Future<AtomKey> async_update_impl(
441
449
" The sum of affected keys and unaffected keys must be equal to the total number of keys {} + {} != {}" ,
442
450
affected_keys->size (), unaffected_keys.size (), index_segment_reader.size ());
443
451
const UpdateRanges update_ranges = compute_update_ranges (query.row_filter , *frame, new_slice_and_keys);
444
-
445
452
return async_intersecting_segments (
446
- * affected_keys,
453
+ affected_keys,
447
454
update_ranges.front ,
448
455
update_ranges.back ,
449
456
update_info.next_version_id_ ,
450
457
store).thenValue ([new_slice_and_keys=std::move (new_slice_and_keys),
451
458
update_ranges=update_ranges,
452
459
unaffected_keys=std::move (unaffected_keys),
453
- affected_keys=affected_keys,
460
+ affected_keys=std::move ( affected_keys) ,
454
461
index_segment_reader=std::move (index_segment_reader),
455
462
frame,
456
463
dynamic_schema,
@@ -465,7 +472,7 @@ folly::Future<AtomKey> async_update_impl(
465
472
auto tsd = index ::get_merged_tsd (row_count, dynamic_schema, index_segment_reader.tsd (), frame);
466
473
return index ::write_index (
467
474
index_type_from_descriptor (tsd.as_stream_descriptor ()),
468
- tsd,
475
+ std::move ( tsd) ,
469
476
std::move (flattened_slice_and_keys),
470
477
IndexPartialKey{frame->desc .id (), update_info.next_version_id_ },
471
478
store
@@ -483,7 +490,7 @@ VersionedItem update_impl(
483
490
WriteOptions&& options,
484
491
bool dynamic_schema,
485
492
bool empty_types) {
486
- auto version_key = async_update_impl (store, update_info, query, frame, options, dynamic_schema, empty_types).get ();
493
+ auto version_key = async_update_impl (store, update_info, query, frame, std::move ( options) , dynamic_schema, empty_types).get ();
487
494
auto versioned_item = VersionedItem (to_atom (std::move (version_key)));
488
495
ARCTICDB_DEBUG (log ::version (), " updated stream_id: {} , version_id: {}" , frame->desc .id (), update_info.next_version_id_ );
489
496
return versioned_item;
0 commit comments