@@ -208,7 +208,7 @@ namespace NTable {
208208 ui64 items = 0 ;
209209 ui64 bytes = 0 ;
210210
211- TRowId prechargedFirstRowId, prechargedLastRowId ;
211+ std::optional<std::pair< TRowId, TRowId>> prechargedRowsRange ;
212212 bool needExactBounds = Groups || HistoryIndex;
213213
214214 for (auto current = first;
@@ -235,6 +235,15 @@ namespace NTable {
235235 prechargeCurrentFirstRowId = Max<TRowId>(); // no precharge
236236 }
237237 }
238+ if (itemsLimit && prechargeCurrentFirstRowId <= prechargeCurrentLastRowId) {
239+ ui64 left = itemsLimit - items; // we count only foolproof taken rows, so here we may precharge some extra rows
240+ if (prechargeCurrentLastRowId - prechargeCurrentFirstRowId > left) {
241+ prechargeCurrentLastRowId = prechargeCurrentFirstRowId + left;
242+ }
243+ }
244+ if (prechargeCurrentFirstRowId <= prechargeCurrentLastRowId) {
245+ items += prechargeCurrentLastRowId - prechargeCurrentFirstRowId + 1 ;
246+ }
238247 if (key2Page && key2Page <= current) {
239248 if (key2Page == current) {
240249 if (needExactBounds && page) {
@@ -251,29 +260,22 @@ namespace NTable {
251260 prechargeCurrentFirstRowId = Max<TRowId>(); // no precharge
252261 }
253262 }
254- if (itemsLimit && prechargeCurrentFirstRowId <= prechargeCurrentLastRowId) {
255- ui64 left = itemsLimit - items; // we count only foolproof taken rows, so here we may precharge some extra rows
256- if (prechargeCurrentLastRowId - prechargeCurrentFirstRowId > left) {
257- prechargeCurrentLastRowId = prechargeCurrentFirstRowId + left;
258- }
259- }
260-
261263 if (prechargeCurrentFirstRowId <= prechargeCurrentLastRowId) {
262- if (!items) {
263- prechargedFirstRowId = prechargeCurrentFirstRowId;
264+ if (prechargedRowsRange) {
265+ prechargedRowsRange->second = prechargeCurrentLastRowId;
266+ } else {
267+ prechargedRowsRange.emplace (prechargeCurrentFirstRowId, prechargeCurrentLastRowId);
264268 }
265- prechargedLastRowId = prechargeCurrentLastRowId;
266269 if (Groups) {
267270 for (auto & g : Groups) {
268271 ready &= DoPrechargeGroup (g, prechargeCurrentFirstRowId, prechargeCurrentLastRowId, bytes);
269272 }
270273 }
271- items += prechargeCurrentLastRowId - prechargeCurrentFirstRowId + 1 ;
272274 }
273275 }
274276
275- if (items && HistoryIndex) {
276- ready &= DoPrechargeHistory (prechargedFirstRowId, prechargedLastRowId );
277+ if (prechargedRowsRange && HistoryIndex) {
278+ ready &= DoPrechargeHistory (prechargedRowsRange-> first , prechargedRowsRange-> second );
277279 }
278280 }
279281
@@ -304,7 +306,7 @@ namespace NTable {
304306 ui64 items = 0 ;
305307 ui64 bytes = 0 ;
306308
307- TRowId prechargedFirstRowId, prechargedLastRowId ;
309+ std::optional<std::pair< TRowId, TRowId>> prechargedRowsRange ;
308310 bool needExactBounds = Groups || HistoryIndex;
309311
310312 for (auto current = first;
@@ -335,6 +337,15 @@ namespace NTable {
335337 prechargeCurrentLastRowId = Max<TRowId>(); // no precharge
336338 }
337339 }
340+ if (itemsLimit && prechargeCurrentFirstRowId >= prechargeCurrentLastRowId) {
341+ ui64 left = itemsLimit - items; // we count only foolproof taken rows, so here we may precharge some extra rows
342+ if (prechargeCurrentFirstRowId - prechargeCurrentLastRowId > left) {
343+ prechargeCurrentLastRowId = prechargeCurrentFirstRowId - left;
344+ }
345+ }
346+ if (prechargeCurrentFirstRowId >= prechargeCurrentLastRowId) {
347+ items += prechargeCurrentFirstRowId - prechargeCurrentLastRowId + 1 ;
348+ }
338349 if (key2Page && key2Page >= current) {
339350 if (key2Page == current) {
340351 if (needExactBounds && page) {
@@ -349,34 +360,26 @@ namespace NTable {
349360 prechargeCurrentLastRowId = Max<TRowId>(); // no precharge
350361 }
351362 }
352-
353- if (itemsLimit && prechargeCurrentFirstRowId >= prechargeCurrentLastRowId) {
354- ui64 left = itemsLimit - items; // we count only foolproof taken rows, so here we may precharge some extra rows
355- if (prechargeCurrentFirstRowId - prechargeCurrentLastRowId > left) {
356- prechargeCurrentLastRowId = prechargeCurrentFirstRowId - left;
357- }
358- }
359-
360363 if (prechargeCurrentFirstRowId >= prechargeCurrentLastRowId) {
361- if (!items) {
362- prechargedFirstRowId = prechargeCurrentFirstRowId;
364+ if (prechargedRowsRange) {
365+ prechargedRowsRange->second = prechargeCurrentLastRowId;
366+ } else {
367+ prechargedRowsRange.emplace (prechargeCurrentFirstRowId, prechargeCurrentLastRowId);
363368 }
364- prechargedLastRowId = prechargeCurrentLastRowId;
365369 if (Groups) {
366370 for (auto & g : Groups) {
367371 ready &= DoPrechargeGroupReverse (g, prechargeCurrentFirstRowId, prechargeCurrentLastRowId, bytes);
368372 }
369373 }
370- items += prechargeCurrentFirstRowId - prechargeCurrentLastRowId + 1 ;
371374 }
372375
373376 if (current.Off () == 0 ) {
374377 break ;
375378 }
376379 }
377380
378- if (items && HistoryIndex) {
379- ready &= DoPrechargeHistory (prechargedFirstRowId, prechargedLastRowId );
381+ if (prechargedRowsRange && HistoryIndex) {
382+ ready &= DoPrechargeHistory (prechargedRowsRange-> first , prechargedRowsRange-> second );
380383 }
381384 }
382385
0 commit comments