@@ -152,7 +152,7 @@ class TSortableScanData {
152
152
153
153
void AppendPositionTo (const std::vector<std::unique_ptr<arrow::ArrayBuilder>>& builders, const ui64 position, ui64* recordSize) const ;
154
154
155
- bool InitPosition (const ui64 position);
155
+ [[nodiscard]] bool InitPosition (const ui64 position);
156
156
157
157
std::shared_ptr<arrow::Table> Slice (const ui64 offset, const ui64 count) const {
158
158
std::vector<std::shared_ptr<arrow::ChunkedArray>> slicedArrays;
@@ -244,9 +244,8 @@ class TSortableBatchPosition {
244
244
, RecordsCount(recordsCount)
245
245
, ReverseSort(reverseSort)
246
246
, Sorting(sorting)
247
- , Data(data)
248
- {
249
-
247
+ , Data(data) {
248
+ AFL_VERIFY (IsAvailablePosition (Position));
250
249
}
251
250
252
251
TSortableBatchPosition (const TRWSortableBatchPosition& source) = delete ;
@@ -315,7 +314,12 @@ class TSortableBatchPosition {
315
314
}
316
315
};
317
316
318
- static std::optional<TFoundPosition> FindPosition (const std::shared_ptr<arrow::RecordBatch>& batch, const TSortableBatchPosition& forFound, const bool needGreater, const std::optional<ui32> includedStartPosition);
317
+ [[nodiscard]] bool IsAvailablePosition (const i64 position) const {
318
+ return 0 <= position && position < RecordsCount;
319
+ }
320
+
321
+ static std::optional<TFoundPosition> FindPosition (const std::shared_ptr<arrow::RecordBatch>& batch, const TSortableBatchPosition& forFound,
322
+ const bool needGreater, const std::optional<ui32> includedStartPosition);
319
323
static std::optional<TSortableBatchPosition::TFoundPosition> FindPosition (TRWSortableBatchPosition& position, const ui64 posStart, const ui64 posFinish, const TSortableBatchPosition& forFound, const bool greater);
320
324
321
325
const TSortableScanData& GetData () const {
@@ -487,7 +491,7 @@ class TIntervalPositions {
487
491
void AddPosition (TSortableBatchPosition&& position, const bool includePositionToLeftInterval) {
488
492
TIntervalPosition intervalPosition (std::move (position), includePositionToLeftInterval);
489
493
AddPosition (std::move (intervalPosition));
490
- }
494
+ }
491
495
492
496
void AddPosition (const TSortableBatchPosition& position, const bool includePositionToLeftInterval) {
493
497
TIntervalPosition intervalPosition (position, includePositionToLeftInterval);
@@ -501,23 +505,53 @@ class TRWSortableBatchPosition: public TSortableBatchPosition, public TMoveOnly
501
505
public:
502
506
using TBase::TBase;
503
507
504
- bool NextPosition (const i64 delta) {
508
+ [[nodiscard]] bool NextPosition (const i64 delta) {
505
509
return InitPosition (Position + delta);
506
510
}
507
511
508
- bool InitPosition (const i64 position) {
509
- if (position < RecordsCount && position >= 0 ) {
510
- Sorting->InitPosition (position);
511
- if (Data) {
512
- Data->InitPosition (position);
512
+ [[nodiscard]] bool InitPosition (const i64 position) {
513
+ if (!IsAvailablePosition (position)) {
514
+ return false ;
515
+ }
516
+ AFL_VERIFY (Sorting->InitPosition (position))(" pos" , position)(" count" , RecordsCount);
517
+ if (Data) {
518
+ AFL_VERIFY (Data->InitPosition (position))(" pos" , position)(" count" , RecordsCount);
519
+ }
520
+ Position = position;
521
+ return true ;
522
+ }
523
+
524
+ class TAsymmetricPositionGuard : TNonCopyable {
525
+ private:
526
+ TRWSortableBatchPosition& Owner;
527
+ public:
528
+ TAsymmetricPositionGuard (TRWSortableBatchPosition& owner)
529
+ : Owner(owner)
530
+ {
531
+ }
532
+
533
+ [[nodiscard]] bool InitSortingPosition (const i64 position) {
534
+ if (!Owner.IsAvailablePosition (position)) {
535
+ return false ;
513
536
}
514
- Position = position;
537
+ AFL_VERIFY (Owner.Sorting ->InitPosition (position));
538
+ Owner.Position = position;
515
539
return true ;
516
- } else {
517
- return false ;
518
540
}
519
541
542
+ ~TAsymmetricPositionGuard () {
543
+ if (Owner.IsAvailablePosition (Owner.Position )) {
544
+ if (Owner.Data ) {
545
+ AFL_VERIFY (Owner.Data ->InitPosition (Owner.Position ));
546
+ }
547
+ }
548
+ }
549
+ };
550
+
551
+ TAsymmetricPositionGuard CreateAsymmetricAccessGuard () {
552
+ return TAsymmetricPositionGuard (*this );
520
553
}
554
+
521
555
TSortableBatchPosition::TFoundPosition SkipToLower (const TSortableBatchPosition& forFound);
522
556
523
557
// (-inf, it1), [it1, it2), [it2, it3), ..., [itLast, +inf)
0 commit comments