@@ -195,26 +195,53 @@ class IScanCursor {
195195 }
196196};
197197
198- class TSimpleScanCursor : public IScanCursor {
198+ class ISimpleScanCursor : public IScanCursor {
199+ protected:
200+ std::optional<ui32> SourceIdx;
201+ YDB_READONLY_PROTECT (ui32, RecordIndex, 0 );
202+ YDB_READONLY_PROTECT_DEF (std::optional<ui64>, PortionId);
203+
204+ virtual bool IsInitialized () const override {
205+ return !!SourceIdx;
206+ }
207+
208+ virtual bool DoCheckSourceIntervalUsage (const ui32 sourceIdx, const ui32 indexStart, const ui32 recordsCount) const override {
209+ AFL_VERIFY (SourceIdx);
210+ AFL_VERIFY (sourceIdx == *SourceIdx);
211+ if (indexStart >= RecordIndex) {
212+ return true ;
213+ }
214+ AFL_VERIFY (indexStart + recordsCount <= RecordIndex);
215+ return false ;
216+ }
217+
218+ public:
219+ ISimpleScanCursor () = default ;
220+ ISimpleScanCursor (const ui32 sourceIdx, const ui32 recordIndex, const std::optional<ui64>& portionId)
221+ : SourceIdx(sourceIdx)
222+ , RecordIndex(recordIndex)
223+ , PortionId(portionId)
224+ {
225+ }
226+ };
227+
228+ class TSimpleScanCursor : public ISimpleScanCursor {
199229private:
200230 YDB_READONLY_DEF (std::shared_ptr<NArrow::TSimpleRow>, PrimaryKey);
201- std::optional<ui32> SourceIdx;
202- YDB_READONLY (ui32, RecordIndex, 0 );
203231
204232 virtual void DoSerializeToProto (NKikimrKqp::TEvKqpScanCursor& proto) const override {
205233 AFL_VERIFY (SourceIdx);
206234 proto.MutableColumnShardSimple ()->SetSourceIdx (*SourceIdx);
207235 proto.MutableColumnShardSimple ()->SetStartRecordIndex (RecordIndex);
236+ if (PortionId) {
237+ proto.MutableColumnShardSimple ()->SetOptionalPortionId (*PortionId);
238+ }
208239 }
209240
210241 virtual const std::shared_ptr<NArrow::TSimpleRow>& DoGetPKCursor () const override {
211242 return PrimaryKey;
212243 }
213244
214- virtual bool IsInitialized () const override {
215- return !!SourceIdx;
216- }
217-
218245 virtual bool DoCheckEntityIsBorder (const ICursorEntity& entity, bool & usage) const override {
219246 AFL_VERIFY (SourceIdx);
220247 if (*SourceIdx != entity.GetEntityId ()) {
@@ -241,50 +268,39 @@ class TSimpleScanCursor: public IScanCursor {
241268 return TConclusionStatus::Fail (" incorrect record index for cursor initialization" );
242269 }
243270 RecordIndex = proto.GetColumnShardSimple ().GetStartRecordIndex ();
244- return TConclusionStatus::Success ();
245- }
246-
247- virtual bool DoCheckSourceIntervalUsage (const ui32 sourceIdx, const ui32 indexStart, const ui32 recordsCount) const override {
248- AFL_VERIFY (SourceIdx);
249- AFL_VERIFY (sourceIdx == *SourceIdx);
250- if (indexStart >= RecordIndex) {
251- return true ;
271+ if (proto.GetColumnShardSimple ().HasOptionalPortionId ()) {
272+ PortionId = proto.GetColumnShardSimple ().GetOptionalPortionId ();
252273 }
253- AFL_VERIFY (indexStart + recordsCount <= RecordIndex);
254- return false ;
274+ return TConclusionStatus::Success ();
255275 }
256276
257277public:
258278 TSimpleScanCursor () = default ;
259279
260- TSimpleScanCursor (const std::shared_ptr<NArrow::TSimpleRow>& pk, const ui32 sourceIdx, const ui32 recordIndex)
261- : PrimaryKey(pk )
262- , SourceIdx (sourceIdx)
263- , RecordIndex(recordIndex )
280+ TSimpleScanCursor (
281+ const std::shared_ptr<NArrow::TSimpleRow>& pk, const ui32 sourceIdx, const ui32 recordIndex, const std::optional<ui64>& optonalPortionId )
282+ : ISimpleScanCursor (sourceIdx, recordIndex, optonalPortionId )
283+ , PrimaryKey(pk )
264284 {
265285 }
266286};
267287
268- class TNotSortedSimpleScanCursor : public TSimpleScanCursor {
288+ class TNotSortedSimpleScanCursor : public ISimpleScanCursor {
269289private:
270- std::optional<ui32> SourceIdx;
271- YDB_READONLY (ui32, RecordIndex, 0 );
272-
273290 virtual void DoSerializeToProto (NKikimrKqp::TEvKqpScanCursor& proto) const override {
274291 auto & data = *proto.MutableColumnShardNotSortedSimple ();
275292 AFL_VERIFY (SourceIdx);
276293 data.SetSourceIdx (*SourceIdx);
277294 data.SetStartRecordIndex (RecordIndex);
295+ if (PortionId) {
296+ data.SetOptionalPortionId (*PortionId);
297+ }
278298 }
279299
280300 virtual const std::shared_ptr<NArrow::TSimpleRow>& DoGetPKCursor () const override {
281301 return Default<std::shared_ptr<NArrow::TSimpleRow>>();
282302 }
283303
284- virtual bool IsInitialized () const override {
285- return !!SourceIdx;
286- }
287-
288304 virtual bool DoCheckEntityIsBorder (const ICursorEntity& entity, bool & usage) const override {
289305 AFL_VERIFY (SourceIdx);
290306 if (*SourceIdx != entity.GetEntityId ()) {
@@ -312,25 +328,17 @@ class TNotSortedSimpleScanCursor: public TSimpleScanCursor {
312328 return TConclusionStatus::Fail (" incorrect record index for cursor initialization" );
313329 }
314330 RecordIndex = data.GetStartRecordIndex ();
315- return TConclusionStatus::Success ();
316- }
317-
318- virtual bool DoCheckSourceIntervalUsage (const ui32 sourceIdx, const ui32 indexStart, const ui32 recordsCount) const override {
319- AFL_VERIFY (SourceIdx);
320- AFL_VERIFY (sourceIdx == *SourceIdx);
321- if (indexStart >= RecordIndex) {
322- return true ;
331+ if (data.HasOptionalPortionId ()) {
332+ PortionId = data.GetOptionalPortionId ();
323333 }
324- AFL_VERIFY (indexStart + recordsCount <= RecordIndex);
325- return false ;
334+ return TConclusionStatus::Success ();
326335 }
327336
328337public:
329338 TNotSortedSimpleScanCursor () = default ;
330339
331- TNotSortedSimpleScanCursor (const ui32 sourceIdx, const ui32 recordIndex)
332- : SourceIdx(sourceIdx)
333- , RecordIndex(recordIndex)
340+ TNotSortedSimpleScanCursor (const ui32 sourceIdx, const ui32 recordIndex, const std::optional<ui64>& optionalPortionId)
341+ : ISimpleScanCursor(sourceIdx, recordIndex, optionalPortionId)
334342 {
335343 }
336344};
0 commit comments