|
1 | | -use crate::numeric_id::NumericId; |
| 1 | +use crate::{numeric_id::NumericId, offsets::Offsets}; |
2 | 2 |
|
3 | 3 | use crate::{ |
4 | 4 | TupleIndex, |
| 5 | + hash_index::ColumnIndex, |
5 | 6 | table_shortcuts::{fill_table, v}, |
6 | 7 | table_spec::{ColumnId, WrappedTable}, |
7 | 8 | }; |
@@ -89,3 +90,44 @@ fn basic_updates() { |
89 | 90 | } |
90 | 91 | } |
91 | 92 | } |
| 93 | + |
| 94 | +#[test] |
| 95 | +fn multi_column_column_index_rebuild_orders_each_value_by_row() { |
| 96 | + let rows = (0..128).map(|i| { |
| 97 | + let left = if i >= 96 { v(7) } else { v(1_000 + i) }; |
| 98 | + let right = if i < 32 { v(7) } else { v(2_000 + i) }; |
| 99 | + vec![v(i), left, right] |
| 100 | + }); |
| 101 | + let mut table = WrappedTable::new(fill_table(rows, 1, None, |old, new| { |
| 102 | + assert_eq!(old, new, "no conflicts in this test"); |
| 103 | + None |
| 104 | + })); |
| 105 | + let mut index = Index::new(vec![ColumnId::new(1), ColumnId::new(2)], ColumnIndex::new()); |
| 106 | + index.refresh(table.as_ref()); |
| 107 | + |
| 108 | + empty_execution_state!(es); |
| 109 | + let start_version = table.version().major; |
| 110 | + while table.version().major == start_version { |
| 111 | + table.new_buffer().stage_remove(&[v(0)]); |
| 112 | + table.merge(&mut es); |
| 113 | + table.new_buffer().stage_insert(&[v(0), v(1000), v(7)]); |
| 114 | + table.merge(&mut es); |
| 115 | + } |
| 116 | + |
| 117 | + index.refresh(table.as_ref()); |
| 118 | + let key = v(7); |
| 119 | + let subset = index.get_subset(&key).unwrap(); |
| 120 | + let mut row_ids = Vec::new(); |
| 121 | + subset.offsets(|row_id| row_ids.push(row_id.index())); |
| 122 | + |
| 123 | + let mut expected = Vec::new(); |
| 124 | + table |
| 125 | + .scan(table.all().as_ref()) |
| 126 | + .iter() |
| 127 | + .for_each(|(row_id, row)| { |
| 128 | + if row[1] == key || row[2] == key { |
| 129 | + expected.push(row_id.index()); |
| 130 | + } |
| 131 | + }); |
| 132 | + assert_eq!(row_ids, expected); |
| 133 | +} |
0 commit comments