1use std::collections::{BTreeMap, BTreeSet};
16use std::ops::Range;
17
18use index::inverted_index::search::index_apply::ApplyOutput;
19use itertools::Itertools;
20use parquet::arrow::arrow_reader::{RowSelection, RowSelector};
21
22#[derive(Debug, Clone, Default)]
24pub struct RowGroupSelection {
25 selection_in_rg: BTreeMap<usize, RowSelectionWithCount>,
27 row_count: usize,
29 selector_len: usize,
31}
32
33#[derive(Debug, Clone)]
35struct RowSelectionWithCount {
36 selection: RowSelection,
38 row_count: usize,
40 selector_len: usize,
42}
43
44impl RowGroupSelection {
45 pub fn new(row_group_size: usize, total_row_count: usize) -> Self {
51 let mut selection_in_rg = BTreeMap::new();
52
53 let row_group_count = total_row_count.div_ceil(row_group_size);
54 for rg_id in 0..row_group_count {
55 let row_group_size = if rg_id == row_group_count - 1 {
57 total_row_count - (row_group_count - 1) * row_group_size
58 } else {
59 row_group_size
60 };
61
62 let selection = RowSelection::from(vec![RowSelector::select(row_group_size)]);
63 selection_in_rg.insert(
64 rg_id,
65 RowSelectionWithCount {
66 selection,
67 row_count: row_group_size,
68 selector_len: 1,
69 },
70 );
71 }
72
73 Self {
74 selection_in_rg,
75 row_count: total_row_count,
76 selector_len: row_group_count,
77 }
78 }
79
80 pub fn get(&self, rg_id: usize) -> Option<&RowSelection> {
84 self.selection_in_rg.get(&rg_id).map(|x| &x.selection)
85 }
86
87 pub fn from_inverted_index_apply_output(
97 row_group_size: usize,
98 apply_output: ApplyOutput,
99 ) -> Self {
100 let segment_row_count = apply_output.segment_row_count;
103 let row_group_ranges = apply_output.matched_segment_ids.iter_ones().map(|seg_id| {
104 let begin_row_id = seg_id * segment_row_count;
106 let row_group_id = begin_row_id / row_group_size;
108 let rg_begin_row_id = begin_row_id % row_group_size;
110 let rg_end_row_id = (rg_begin_row_id + segment_row_count).min(row_group_size);
112
113 (row_group_id, rg_begin_row_id..rg_end_row_id)
114 });
115
116 let mut total_row_count = 0;
118 let mut total_selector_len = 0;
119 let selection_in_rg = row_group_ranges
120 .chunk_by(|(row_group_id, _)| *row_group_id)
121 .into_iter()
122 .map(|(row_group_id, group)| {
123 let ranges = group.map(|(_, ranges)| ranges);
125 let selection = row_selection_from_row_ranges(ranges, row_group_size);
131 let row_count = selection.row_count();
132 let selector_len = selector_len(&selection);
133 total_row_count += row_count;
134 total_selector_len += selector_len;
135 (
136 row_group_id,
137 RowSelectionWithCount {
138 selection,
139 row_count,
140 selector_len,
141 },
142 )
143 })
144 .collect();
145
146 Self {
147 selection_in_rg,
148 row_count: total_row_count,
149 selector_len: total_selector_len,
150 }
151 }
152
153 pub fn from_row_ids(
165 row_ids: BTreeSet<u32>,
166 row_group_size: usize,
167 num_row_groups: usize,
168 ) -> Self {
169 let row_group_to_row_ids =
171 Self::group_row_ids_by_row_group(row_ids, row_group_size, num_row_groups);
172
173 let mut total_row_count = 0;
175 let mut total_selector_len = 0;
176 let selection_in_rg = row_group_to_row_ids
177 .into_iter()
178 .map(|(row_group_id, row_ids)| {
179 let selection =
180 row_selection_from_sorted_row_ids(row_ids.into_iter(), row_group_size);
181 let row_count = selection.row_count();
182 let selector_len = selector_len(&selection);
183 total_row_count += row_count;
184 total_selector_len += selector_len;
185 (
186 row_group_id,
187 RowSelectionWithCount {
188 selection,
189 row_count,
190 selector_len,
191 },
192 )
193 })
194 .collect();
195
196 Self {
197 selection_in_rg,
198 row_count: total_row_count,
199 selector_len: total_selector_len,
200 }
201 }
202
203 pub fn from_row_ranges(
216 row_ranges: Vec<(usize, Vec<Range<usize>>)>,
217 row_group_size: usize,
218 ) -> Self {
219 let mut total_row_count = 0;
220 let mut total_selector_len = 0;
221 let selection_in_rg = row_ranges
222 .into_iter()
223 .map(|(row_group_id, ranges)| {
224 let selection = row_selection_from_row_ranges(ranges.into_iter(), row_group_size);
225 let row_count = selection.row_count();
226 let selector_len = selector_len(&selection);
227 total_row_count += row_count;
228 total_selector_len += selector_len;
229 (
230 row_group_id,
231 RowSelectionWithCount {
232 selection,
233 row_count,
234 selector_len,
235 },
236 )
237 })
238 .collect();
239
240 Self {
241 selection_in_rg,
242 row_count: total_row_count,
243 selector_len: total_selector_len,
244 }
245 }
246
247 fn group_row_ids_by_row_group(
257 row_ids: BTreeSet<u32>,
258 row_group_size: usize,
259 num_row_groups: usize,
260 ) -> Vec<(usize, Vec<usize>)> {
261 let est_rows_per_group = row_ids.len() / num_row_groups;
262 let mut row_group_to_row_ids: Vec<(usize, Vec<usize>)> = Vec::with_capacity(num_row_groups);
263
264 for row_id in row_ids {
265 let row_group_id = row_id as usize / row_group_size;
266 let row_id_in_group = row_id as usize % row_group_size;
267
268 if let Some((rg_id, row_ids)) = row_group_to_row_ids.last_mut()
269 && *rg_id == row_group_id
270 {
271 row_ids.push(row_id_in_group);
272 } else {
273 let mut row_ids = Vec::with_capacity(est_rows_per_group);
274 row_ids.push(row_id_in_group);
275 row_group_to_row_ids.push((row_group_id, row_ids));
276 }
277 }
278
279 row_group_to_row_ids
280 }
281
282 pub fn intersect(&self, other: &Self) -> Self {
284 let mut res = BTreeMap::new();
285 let mut total_row_count = 0;
286 let mut total_selector_len = 0;
287
288 for (rg_id, x) in other.selection_in_rg.iter() {
289 let Some(y) = self.selection_in_rg.get(rg_id) else {
290 continue;
291 };
292 let selection = x.selection.intersection(&y.selection);
293 let row_count = selection.row_count();
294 let selector_len = selector_len(&selection);
295 if row_count > 0 {
296 total_row_count += row_count;
297 total_selector_len += selector_len;
298 res.insert(
299 *rg_id,
300 RowSelectionWithCount {
301 selection,
302 row_count,
303 selector_len,
304 },
305 );
306 }
307 }
308
309 Self {
310 selection_in_rg: res,
311 row_count: total_row_count,
312 selector_len: total_selector_len,
313 }
314 }
315
316 pub fn row_group_count(&self) -> usize {
318 self.selection_in_rg.len()
319 }
320
321 pub fn row_count(&self) -> usize {
323 self.row_count
324 }
325
326 pub fn pop_first(&mut self) -> Option<(usize, RowSelection)> {
328 let (
329 row_group_id,
330 RowSelectionWithCount {
331 selection,
332 row_count,
333 selector_len,
334 },
335 ) = self.selection_in_rg.pop_first()?;
336
337 self.row_count -= row_count;
338 self.selector_len -= selector_len;
339 Some((row_group_id, selection))
340 }
341
342 pub fn remove_row_group(&mut self, row_group_id: usize) {
344 let Some(RowSelectionWithCount {
345 row_count,
346 selector_len,
347 ..
348 }) = self.selection_in_rg.remove(&row_group_id)
349 else {
350 return;
351 };
352 self.row_count -= row_count;
353 self.selector_len -= selector_len;
354 }
355
356 pub fn is_empty(&self) -> bool {
358 self.selection_in_rg.is_empty()
359 }
360
361 pub fn contains_row_group(&self, row_group_id: usize) -> bool {
363 self.selection_in_rg.contains_key(&row_group_id)
364 }
365
366 pub fn iter(&self) -> impl Iterator<Item = (&usize, &RowSelection)> {
368 self.selection_in_rg
369 .iter()
370 .map(|(row_group_id, x)| (row_group_id, &x.selection))
371 }
372
373 pub fn mem_usage(&self) -> usize {
375 self.selector_len * size_of::<RowSelector>()
376 + self.selection_in_rg.len() * size_of::<RowSelectionWithCount>()
377 }
378}
379
380pub(crate) fn row_selection_from_row_ranges(
389 row_ranges: impl Iterator<Item = Range<usize>>,
390 total_row_count: usize,
391) -> RowSelection {
392 let mut selectors: Vec<RowSelector> = Vec::new();
393 let mut last_processed_end = 0;
394
395 for Range { start, end } in row_ranges {
396 let end = end.min(total_row_count);
397 if start > last_processed_end {
398 add_or_merge_selector(&mut selectors, start - last_processed_end, true);
399 }
400
401 add_or_merge_selector(&mut selectors, end - start, false);
402 last_processed_end = end;
403 }
404
405 if last_processed_end < total_row_count {
406 add_or_merge_selector(&mut selectors, total_row_count - last_processed_end, true);
407 }
408
409 RowSelection::from(selectors)
410}
411
412pub(crate) fn row_selection_from_sorted_row_ids(
417 row_ids: impl Iterator<Item = usize>,
418 total_row_count: usize,
419) -> RowSelection {
420 let mut selectors: Vec<RowSelector> = Vec::new();
421 let mut last_processed_end = 0;
422
423 for row_id in row_ids {
424 let start = row_id;
425 let end = start + 1;
426
427 if start > last_processed_end {
428 add_or_merge_selector(&mut selectors, start - last_processed_end, true);
429 }
430
431 add_or_merge_selector(&mut selectors, end - start, false);
432 last_processed_end = end;
433 }
434
435 if last_processed_end < total_row_count {
436 add_or_merge_selector(&mut selectors, total_row_count - last_processed_end, true);
437 }
438
439 RowSelection::from(selectors)
440}
441
442fn add_or_merge_selector(selectors: &mut Vec<RowSelector>, count: usize, is_skip: bool) {
445 if let Some(last) = selectors.last_mut() {
446 if last.skip == is_skip {
448 last.row_count += count;
449 return;
450 }
451 }
452 let new_selector = if is_skip {
454 RowSelector::skip(count)
455 } else {
456 RowSelector::select(count)
457 };
458 selectors.push(new_selector);
459}
460
461fn selector_len(selection: &RowSelection) -> usize {
463 selection.iter().size_hint().0
464}
465
466#[cfg(test)]
467#[allow(clippy::single_range_in_vec_init)]
468mod tests {
469 use super::*;
470
471 #[test]
472 fn test_selector_len() {
473 let selection = RowSelection::from(vec![RowSelector::skip(5), RowSelector::select(5)]);
474 assert_eq!(selector_len(&selection), 2);
475
476 let selection = RowSelection::from(vec![
477 RowSelector::select(5),
478 RowSelector::skip(5),
479 RowSelector::select(5),
480 ]);
481 assert_eq!(selector_len(&selection), 3);
482
483 let selection = RowSelection::from(vec![]);
484 assert_eq!(selector_len(&selection), 0);
485 }
486
487 #[test]
488 fn test_single_contiguous_range() {
489 let selection = row_selection_from_row_ranges(Some(5..10).into_iter(), 10);
490 let expected = RowSelection::from(vec![RowSelector::skip(5), RowSelector::select(5)]);
491 assert_eq!(selection, expected);
492 }
493
494 #[test]
495 fn test_non_contiguous_ranges() {
496 let ranges = [1..3, 5..8];
497 let selection = row_selection_from_row_ranges(ranges.iter().cloned(), 10);
498 let expected = RowSelection::from(vec![
499 RowSelector::skip(1),
500 RowSelector::select(2),
501 RowSelector::skip(2),
502 RowSelector::select(3),
503 RowSelector::skip(2),
504 ]);
505 assert_eq!(selection, expected);
506 }
507
508 #[test]
509 fn test_empty_range() {
510 let ranges = [];
511 let selection = row_selection_from_row_ranges(ranges.iter().cloned(), 10);
512 let expected = RowSelection::from(vec![RowSelector::skip(10)]);
513 assert_eq!(selection, expected);
514 }
515
516 #[test]
517 fn test_adjacent_ranges() {
518 let ranges = [1..2, 2..3];
519 let selection = row_selection_from_row_ranges(ranges.iter().cloned(), 10);
520 let expected = RowSelection::from(vec![
521 RowSelector::skip(1),
522 RowSelector::select(2),
523 RowSelector::skip(7),
524 ]);
525 assert_eq!(selection, expected);
526 }
527
528 #[test]
529 fn test_large_gap_between_ranges() {
530 let ranges = [1..2, 100..101];
531 let selection = row_selection_from_row_ranges(ranges.iter().cloned(), 10240);
532 let expected = RowSelection::from(vec![
533 RowSelector::skip(1),
534 RowSelector::select(1),
535 RowSelector::skip(98),
536 RowSelector::select(1),
537 RowSelector::skip(10139),
538 ]);
539 assert_eq!(selection, expected);
540 }
541
542 #[test]
543 fn test_range_end_over_total_row_count() {
544 let ranges = Some(1..10);
545 let selection = row_selection_from_row_ranges(ranges.into_iter(), 5);
546 let expected = RowSelection::from(vec![RowSelector::skip(1), RowSelector::select(4)]);
547 assert_eq!(selection, expected);
548 }
549
550 #[test]
551 fn test_row_ids_to_selection() {
552 let row_ids = [1, 3, 5, 7, 9].into_iter();
553 let selection = row_selection_from_sorted_row_ids(row_ids, 10);
554 let expected = RowSelection::from(vec![
555 RowSelector::skip(1),
556 RowSelector::select(1),
557 RowSelector::skip(1),
558 RowSelector::select(1),
559 RowSelector::skip(1),
560 RowSelector::select(1),
561 RowSelector::skip(1),
562 RowSelector::select(1),
563 RowSelector::skip(1),
564 RowSelector::select(1),
565 ]);
566 assert_eq!(selection, expected);
567 }
568
569 #[test]
570 fn test_row_ids_to_selection_full() {
571 let row_ids = 0..10;
572 let selection = row_selection_from_sorted_row_ids(row_ids, 10);
573 let expected = RowSelection::from(vec![RowSelector::select(10)]);
574 assert_eq!(selection, expected);
575 }
576
577 #[test]
578 fn test_row_ids_to_selection_empty() {
579 let selection = row_selection_from_sorted_row_ids(None.into_iter(), 10);
580 let expected = RowSelection::from(vec![RowSelector::skip(10)]);
581 assert_eq!(selection, expected);
582 }
583
584 #[test]
585 fn test_group_row_ids() {
586 let row_ids = [0, 1, 2, 5, 6, 7, 8, 12].into_iter().collect();
587 let row_group_size = 5;
588 let num_row_groups = 3;
589
590 let row_group_to_row_ids =
591 RowGroupSelection::group_row_ids_by_row_group(row_ids, row_group_size, num_row_groups);
592
593 assert_eq!(
594 row_group_to_row_ids,
595 vec![(0, vec![0, 1, 2]), (1, vec![0, 1, 2, 3]), (2, vec![2])]
596 );
597 }
598
599 #[test]
600 fn test_row_group_selection_new() {
601 let selection = RowGroupSelection::new(100, 250);
603 assert_eq!(selection.row_count(), 250);
604 assert_eq!(selection.row_group_count(), 3);
605
606 let row_selection = selection.get(0).unwrap();
608 assert_eq!(row_selection.row_count(), 100);
609
610 let row_selection = selection.get(1).unwrap();
611 assert_eq!(row_selection.row_count(), 100);
612
613 let row_selection = selection.get(2).unwrap();
614 assert_eq!(row_selection.row_count(), 50);
615
616 let selection = RowGroupSelection::new(100, 0);
618 assert_eq!(selection.row_count(), 0);
619 assert_eq!(selection.row_group_count(), 0);
620 assert!(selection.get(0).is_none());
621
622 let selection = RowGroupSelection::new(100, 50);
624 assert_eq!(selection.row_count(), 50);
625 assert_eq!(selection.row_group_count(), 1);
626
627 let row_selection = selection.get(0).unwrap();
628 assert_eq!(row_selection.row_count(), 50);
629
630 let selection = RowGroupSelection::new(100, 150);
632 assert_eq!(selection.row_count(), 150);
633 assert_eq!(selection.row_group_count(), 2);
634
635 let row_selection = selection.get(0).unwrap();
636 assert_eq!(row_selection.row_count(), 100);
637
638 let row_selection = selection.get(1).unwrap();
639 assert_eq!(row_selection.row_count(), 50);
640
641 let selection = RowGroupSelection::new(100, 101);
643 assert_eq!(selection.row_count(), 101);
644 assert_eq!(selection.row_group_count(), 2);
645
646 let row_selection = selection.get(0).unwrap();
647 assert_eq!(row_selection.row_count(), 100);
648
649 let row_selection = selection.get(1).unwrap();
650 assert_eq!(row_selection.row_count(), 1);
651 }
652
653 #[test]
654 fn test_from_row_ids() {
655 let row_group_size = 100;
656 let num_row_groups = 3;
657
658 let row_ids: BTreeSet<u32> = vec![5, 15, 25, 35, 105, 115, 205, 215]
660 .into_iter()
661 .collect();
662 let selection = RowGroupSelection::from_row_ids(row_ids, row_group_size, num_row_groups);
663 assert_eq!(selection.row_count(), 8);
664 assert_eq!(selection.row_group_count(), 3);
665
666 let row_selection = selection.get(0).unwrap();
668 assert_eq!(row_selection.row_count(), 4); let row_selection = selection.get(1).unwrap();
671 assert_eq!(row_selection.row_count(), 2); let row_selection = selection.get(2).unwrap();
674 assert_eq!(row_selection.row_count(), 2); let empty_row_ids: BTreeSet<u32> = BTreeSet::new();
678 let selection =
679 RowGroupSelection::from_row_ids(empty_row_ids, row_group_size, num_row_groups);
680 assert_eq!(selection.row_count(), 0);
681 assert_eq!(selection.row_group_count(), 0);
682 assert!(selection.get(0).is_none());
683
684 let consecutive_row_ids: BTreeSet<u32> = vec![5, 6, 7, 8, 9].into_iter().collect();
686 let selection =
687 RowGroupSelection::from_row_ids(consecutive_row_ids, row_group_size, num_row_groups);
688 assert_eq!(selection.row_count(), 5);
689 assert_eq!(selection.row_group_count(), 1);
690
691 let row_selection = selection.get(0).unwrap();
692 assert_eq!(row_selection.row_count(), 5); let boundary_row_ids: BTreeSet<u32> = vec![0, 99, 100, 199, 200, 249].into_iter().collect();
696 let selection =
697 RowGroupSelection::from_row_ids(boundary_row_ids, row_group_size, num_row_groups);
698 assert_eq!(selection.row_count(), 6);
699 assert_eq!(selection.row_group_count(), 3);
700
701 let row_selection = selection.get(0).unwrap();
702 assert_eq!(row_selection.row_count(), 2); let row_selection = selection.get(1).unwrap();
705 assert_eq!(row_selection.row_count(), 2); let row_selection = selection.get(2).unwrap();
708 assert_eq!(row_selection.row_count(), 2); let single_group_row_ids: BTreeSet<u32> = vec![5, 10, 15].into_iter().collect();
712 let selection = RowGroupSelection::from_row_ids(single_group_row_ids, row_group_size, 1);
713 assert_eq!(selection.row_count(), 3);
714 assert_eq!(selection.row_group_count(), 1);
715
716 let row_selection = selection.get(0).unwrap();
717 assert_eq!(row_selection.row_count(), 3); }
719
720 #[test]
721 fn test_from_row_ranges() {
722 let row_group_size = 100;
723
724 let ranges = vec![
726 (0, vec![5..15, 25..35]), (1, vec![5..15]), (2, vec![0..5, 10..15]), ];
730 let selection = RowGroupSelection::from_row_ranges(ranges, row_group_size);
731 assert_eq!(selection.row_count(), 40);
732 assert_eq!(selection.row_group_count(), 3);
733
734 let row_selection = selection.get(0).unwrap();
736 assert_eq!(row_selection.row_count(), 20); let row_selection = selection.get(1).unwrap();
739 assert_eq!(row_selection.row_count(), 10); let row_selection = selection.get(2).unwrap();
742 assert_eq!(row_selection.row_count(), 10); let empty_ranges: Vec<(usize, Vec<Range<usize>>)> = vec![];
746 let selection = RowGroupSelection::from_row_ranges(empty_ranges, row_group_size);
747 assert_eq!(selection.row_count(), 0);
748 assert_eq!(selection.row_group_count(), 0);
749 assert!(selection.get(0).is_none());
750
751 let adjacent_ranges = vec![
753 (0, vec![5..15, 15..25]), ];
755 let selection = RowGroupSelection::from_row_ranges(adjacent_ranges, row_group_size);
756 assert_eq!(selection.row_count(), 20);
757 assert_eq!(selection.row_group_count(), 1);
758
759 let row_selection = selection.get(0).unwrap();
760 assert_eq!(row_selection.row_count(), 20); let boundary_ranges = vec![
764 (0, vec![0..10, 90..100]), (1, vec![0..100]), (2, vec![0..50]), ];
768 let selection = RowGroupSelection::from_row_ranges(boundary_ranges, row_group_size);
769 assert_eq!(selection.row_count(), 170);
770 assert_eq!(selection.row_group_count(), 3);
771
772 let row_selection = selection.get(0).unwrap();
773 assert_eq!(row_selection.row_count(), 20); let row_selection = selection.get(1).unwrap();
776 assert_eq!(row_selection.row_count(), 100); let row_selection = selection.get(2).unwrap();
779 assert_eq!(row_selection.row_count(), 50); let single_group_ranges = vec![
783 (0, vec![0..50]), ];
785 let selection = RowGroupSelection::from_row_ranges(single_group_ranges, row_group_size);
786 assert_eq!(selection.row_count(), 50);
787 assert_eq!(selection.row_group_count(), 1);
788
789 let row_selection = selection.get(0).unwrap();
790 assert_eq!(row_selection.row_count(), 50); }
792
793 #[test]
794 fn test_intersect() {
795 let row_group_size = 100;
796
797 let ranges1 = vec![
799 (0, vec![5..15, 25..35]), (1, vec![5..15]), ];
802 let selection1 = RowGroupSelection::from_row_ranges(ranges1, row_group_size);
803
804 let ranges2 = vec![
805 (0, vec![10..20]), (1, vec![10..20]), (2, vec![0..10]), ];
809 let selection2 = RowGroupSelection::from_row_ranges(ranges2, row_group_size);
810
811 let intersection = selection1.intersect(&selection2);
812 assert_eq!(intersection.row_count(), 10);
813 assert_eq!(intersection.row_group_count(), 2);
814
815 let row_selection = intersection.get(0).unwrap();
816 assert_eq!(row_selection.row_count(), 5); let row_selection = intersection.get(1).unwrap();
819 assert_eq!(row_selection.row_count(), 5); let empty_ranges: Vec<(usize, Vec<Range<usize>>)> = vec![];
823 let empty_selection = RowGroupSelection::from_row_ranges(empty_ranges, row_group_size);
824 let intersection = selection1.intersect(&empty_selection);
825 assert_eq!(intersection.row_count(), 0);
826 assert_eq!(intersection.row_group_count(), 0);
827 assert!(intersection.get(0).is_none());
828
829 let non_overlapping_ranges = vec![
831 (3, vec![0..10]), ];
833 let non_overlapping_selection =
834 RowGroupSelection::from_row_ranges(non_overlapping_ranges, row_group_size);
835 let intersection = selection1.intersect(&non_overlapping_selection);
836 assert_eq!(intersection.row_count(), 0);
837 assert_eq!(intersection.row_group_count(), 0);
838 assert!(intersection.get(0).is_none());
839
840 let full_overlap_ranges1 = vec![
842 (0, vec![0..50]), ];
844 let full_overlap_ranges2 = vec![
845 (0, vec![0..50]), ];
847 let selection1 = RowGroupSelection::from_row_ranges(full_overlap_ranges1, row_group_size);
848 let selection2 = RowGroupSelection::from_row_ranges(full_overlap_ranges2, row_group_size);
849 let intersection = selection1.intersect(&selection2);
850 assert_eq!(intersection.row_count(), 50);
851 assert_eq!(intersection.row_group_count(), 1);
852
853 let row_selection = intersection.get(0).unwrap();
854 assert_eq!(row_selection.row_count(), 50); let boundary_ranges1 = vec![
858 (0, vec![0..10, 90..100]), (1, vec![0..100]), ];
861 let boundary_ranges2 = vec![
862 (0, vec![5..15, 95..100]), (1, vec![50..100]), ];
865 let selection1 = RowGroupSelection::from_row_ranges(boundary_ranges1, row_group_size);
866 let selection2 = RowGroupSelection::from_row_ranges(boundary_ranges2, row_group_size);
867 let intersection = selection1.intersect(&selection2);
868 assert_eq!(intersection.row_count(), 60);
869 assert_eq!(intersection.row_group_count(), 2);
870
871 let row_selection = intersection.get(0).unwrap();
872 assert_eq!(row_selection.row_count(), 10); let row_selection = intersection.get(1).unwrap();
875 assert_eq!(row_selection.row_count(), 50); let complex_ranges1 = vec![
879 (0, vec![5..15, 25..35, 45..55]), (1, vec![10..20, 30..40]), ];
882 let complex_ranges2 = vec![
883 (0, vec![10..20, 30..40, 50..60]), (1, vec![15..25, 35..45]), ];
886 let selection1 = RowGroupSelection::from_row_ranges(complex_ranges1, row_group_size);
887 let selection2 = RowGroupSelection::from_row_ranges(complex_ranges2, row_group_size);
888 let intersection = selection1.intersect(&selection2);
889 assert_eq!(intersection.row_count(), 25);
890 assert_eq!(intersection.row_group_count(), 2);
891
892 let row_selection = intersection.get(0).unwrap();
893 assert_eq!(row_selection.row_count(), 15); let row_selection = intersection.get(1).unwrap();
896 assert_eq!(row_selection.row_count(), 10); let last_rg_ranges1 = vec![
900 (2, vec![0..25, 30..40]), ];
902 let last_rg_ranges2 = vec![
903 (2, vec![20..30, 35..45]), ];
905 let selection1 = RowGroupSelection::from_row_ranges(last_rg_ranges1, row_group_size);
906 let selection2 = RowGroupSelection::from_row_ranges(last_rg_ranges2, row_group_size);
907 let intersection = selection1.intersect(&selection2);
908 assert_eq!(intersection.row_count(), 10);
909 assert_eq!(intersection.row_group_count(), 1);
910
911 let row_selection = intersection.get(2).unwrap();
912 assert_eq!(row_selection.row_count(), 10); let empty_ranges = vec![
916 (0, vec![]), (1, vec![5..15]), ];
919 let selection1 = RowGroupSelection::from_row_ranges(empty_ranges, row_group_size);
920 let ranges2 = vec![
921 (0, vec![5..15, 25..35]), (1, vec![5..15]), ];
924 let selection2 = RowGroupSelection::from_row_ranges(ranges2, row_group_size);
925 let intersection = selection1.intersect(&selection2);
926 assert_eq!(intersection.row_count(), 10);
927 assert_eq!(intersection.row_group_count(), 1);
928
929 let row_selection = intersection.get(1).unwrap();
930 assert_eq!(row_selection.row_count(), 10); }
932
933 #[test]
934 fn test_pop_first() {
935 let row_group_size = 100;
936 let ranges = vec![
937 (0, vec![5..15]), (1, vec![5..15]), (2, vec![0..5]), ];
941 let mut selection = RowGroupSelection::from_row_ranges(ranges, row_group_size);
942
943 let (rg_id, row_selection) = selection.pop_first().unwrap();
945 assert_eq!(rg_id, 0);
946 assert_eq!(row_selection.row_count(), 10); assert_eq!(selection.row_count(), 15);
948 assert_eq!(selection.row_group_count(), 2);
949
950 let row_selection = selection.get(1).unwrap();
952 assert_eq!(row_selection.row_count(), 10); let row_selection = selection.get(2).unwrap();
955 assert_eq!(row_selection.row_count(), 5); let (rg_id, row_selection) = selection.pop_first().unwrap();
959 assert_eq!(rg_id, 1);
960 assert_eq!(row_selection.row_count(), 10); assert_eq!(selection.row_count(), 5);
962 assert_eq!(selection.row_group_count(), 1);
963
964 let row_selection = selection.get(2).unwrap();
966 assert_eq!(row_selection.row_count(), 5); let (rg_id, row_selection) = selection.pop_first().unwrap();
970 assert_eq!(rg_id, 2);
971 assert_eq!(row_selection.row_count(), 5); assert_eq!(selection.row_count(), 0);
973 assert_eq!(selection.row_group_count(), 0);
974 assert!(selection.is_empty());
975
976 let mut empty_selection = RowGroupSelection::from_row_ranges(vec![], row_group_size);
978 assert!(empty_selection.pop_first().is_none());
979 assert_eq!(empty_selection.row_count(), 0);
980 assert_eq!(empty_selection.row_group_count(), 0);
981 assert!(empty_selection.is_empty());
982 }
983
984 #[test]
985 fn test_remove_row_group() {
986 let row_group_size = 100;
987 let ranges = vec![
988 (0, vec![5..15]), (1, vec![5..15]), (2, vec![0..5]), ];
992 let mut selection = RowGroupSelection::from_row_ranges(ranges, row_group_size);
993
994 selection.remove_row_group(1);
996 assert_eq!(selection.row_count(), 15);
997 assert_eq!(selection.row_group_count(), 2);
998 assert!(!selection.contains_row_group(1));
999
1000 let row_selection = selection.get(0).unwrap();
1002 assert_eq!(row_selection.row_count(), 10); let row_selection = selection.get(2).unwrap();
1005 assert_eq!(row_selection.row_count(), 5); selection.remove_row_group(5);
1009 assert_eq!(selection.row_count(), 15);
1010 assert_eq!(selection.row_group_count(), 2);
1011
1012 selection.remove_row_group(0);
1014 assert_eq!(selection.row_count(), 5);
1015 assert_eq!(selection.row_group_count(), 1);
1016
1017 let row_selection = selection.get(2).unwrap();
1018 assert_eq!(row_selection.row_count(), 5); selection.remove_row_group(2);
1021 assert_eq!(selection.row_count(), 0);
1022 assert_eq!(selection.row_group_count(), 0);
1023 assert!(selection.is_empty());
1024
1025 let mut empty_selection = RowGroupSelection::from_row_ranges(vec![], row_group_size);
1027 empty_selection.remove_row_group(0);
1028 assert_eq!(empty_selection.row_count(), 0);
1029 assert_eq!(empty_selection.row_group_count(), 0);
1030 assert!(empty_selection.is_empty());
1031 }
1032
1033 #[test]
1034 fn test_contains_row_group() {
1035 let row_group_size = 100;
1036 let ranges = vec![
1037 (0, vec![5..15]), (1, vec![5..15]), ];
1040 let selection = RowGroupSelection::from_row_ranges(ranges, row_group_size);
1041
1042 assert!(selection.contains_row_group(0));
1043 assert!(selection.contains_row_group(1));
1044 assert!(!selection.contains_row_group(2));
1045
1046 let empty_selection = RowGroupSelection::from_row_ranges(vec![], row_group_size);
1048 assert!(!empty_selection.contains_row_group(0));
1049 }
1050}