@@ -110,6 +110,7 @@ impl LogicalPageScheduler for SimpleStructScheduler {
110
110
ranges : & [ Range < u32 > ] ,
111
111
scheduler : & Arc < dyn EncodingsIo > ,
112
112
sink : & mpsc:: UnboundedSender < Box < dyn LogicalPageDecoder > > ,
113
+ top_level_row : u64 ,
113
114
) -> Result < ( ) > {
114
115
for range in ranges. iter ( ) . cloned ( ) {
115
116
let mut rows_to_read = range. end - range. start ;
@@ -156,6 +157,8 @@ impl LogicalPageScheduler for SimpleStructScheduler {
156
157
// The downside of the current algorithm is that many tiny I/O batches means less opportunity for in-batch coalescing.
157
158
// Then again, if our outer batch coalescing is super good then maybe we don't bother
158
159
160
+ let mut current_top_level_row = top_level_row;
161
+
159
162
while rows_to_read > 0 {
160
163
let mut min_rows_added = u32:: MAX ;
161
164
for ( col_idx, field_scheduler) in self . children . iter ( ) . enumerate ( ) {
@@ -183,7 +186,12 @@ impl LogicalPageScheduler for SimpleStructScheduler {
183
186
page_range_start,
184
187
next_page
185
188
) ;
186
- next_page. schedule_ranges ( & [ page_range] , scheduler, sink) ?;
189
+ next_page. schedule_ranges (
190
+ & [ page_range] ,
191
+ scheduler,
192
+ sink,
193
+ current_top_level_row,
194
+ ) ?;
187
195
188
196
status. rows_queued += rows_to_take;
189
197
status. rows_to_take -= rows_to_take;
@@ -199,6 +207,7 @@ impl LogicalPageScheduler for SimpleStructScheduler {
199
207
panic ! ( "Error in scheduling logic, panic to avoid infinite loop" ) ;
200
208
}
201
209
rows_to_read -= min_rows_added;
210
+ current_top_level_row += min_rows_added as u64 ;
202
211
for field_status in & mut field_status {
203
212
field_status. rows_queued -= min_rows_added;
204
213
}
@@ -216,6 +225,7 @@ impl LogicalPageScheduler for SimpleStructScheduler {
216
225
indices : & [ u32 ] ,
217
226
scheduler : & Arc < dyn EncodingsIo > ,
218
227
sink : & mpsc:: UnboundedSender < Box < dyn LogicalPageDecoder > > ,
228
+ top_level_row : u64 ,
219
229
) -> Result < ( ) > {
220
230
trace ! ( "Scheduling struct decode of {} indices" , indices. len( ) ) ;
221
231
@@ -236,7 +246,7 @@ impl LogicalPageScheduler for SimpleStructScheduler {
236
246
let mut rows_to_read = indices. len ( ) as u32 ;
237
247
238
248
// NOTE: See schedule_range for a description of the scheduling algorithm
239
-
249
+ let mut current_top_level_row = top_level_row ;
240
250
while rows_to_read > 0 {
241
251
let mut min_rows_added = u32:: MAX ;
242
252
for ( col_idx, field_scheduler) in self . children . iter ( ) . enumerate ( ) {
@@ -269,7 +279,12 @@ impl LogicalPageScheduler for SimpleStructScheduler {
269
279
// We should be guaranteed to get at least one page
270
280
let next_page = next_page. unwrap ( ) ;
271
281
272
- next_page. schedule_take ( & indices_in_page, scheduler, sink) ?;
282
+ next_page. schedule_take (
283
+ & indices_in_page,
284
+ scheduler,
285
+ sink,
286
+ current_top_level_row,
287
+ ) ?;
273
288
274
289
let rows_scheduled = indices_in_page. len ( ) as u32 ;
275
290
status. rows_queued += rows_scheduled;
@@ -281,6 +296,7 @@ impl LogicalPageScheduler for SimpleStructScheduler {
281
296
panic ! ( "Error in scheduling logic, panic to avoid infinite loop" ) ;
282
297
}
283
298
rows_to_read -= min_rows_added;
299
+ current_top_level_row += min_rows_added as u64 ;
284
300
for field_status in & mut field_status {
285
301
field_status. rows_queued -= min_rows_added;
286
302
}
0 commit comments