kermit_ds/ds/column_trie/
column_trie_iter.rs1use {
2 super::implementation::ColumnTrie,
3 crate::relation::Relation,
4 kermit_derive::IntoTrieIter,
5 kermit_iters::{LinearIterator, TrieIterable, TrieIterator, TrieIteratorWrapper},
6};
7
8#[derive(IntoTrieIter)]
9pub struct ColumnTrieIter<'a> {
10 layer_number: usize,
12 interval_i: usize,
14 rel_data_i: usize,
16 rel_data: Option<&'a [usize]>,
18 trie: &'a ColumnTrie,
20}
21
22impl<'a> ColumnTrieIter<'a> {
23 pub fn new(trie: &'a ColumnTrie) -> Self {
24 ColumnTrieIter {
25 interval_i: 0,
26 rel_data: None,
27 rel_data_i: 0,
28 layer_number: 0,
29 trie,
30 }
31 }
32}
33
34impl LinearIterator for ColumnTrieIter<'_> {
35 fn key(&self) -> Option<usize> {
36 if let Some(data) = self.rel_data {
37 data.get(self.rel_data_i).copied()
38 } else {
39 None
40 }
41 }
42
43 fn next(&mut self) -> Option<usize> {
44 if let Some(data) = self.rel_data {
45 if self.rel_data_i > data.len() - 1 {
46 return None;
47 }
48 self.rel_data_i += 1;
49 data.get(self.rel_data_i).copied()
50 } else {
51 None
52 }
53 }
54
55 fn seek(&mut self, seek_key: usize) -> bool {
56 while let Some(key) = self.next() {
57 if key >= seek_key {
58 break;
59 }
60 }
61 self.at_end()
62 }
63
64 fn at_end(&self) -> bool {
65 if let Some(data) = self.rel_data {
66 self.rel_data_i >= data.len()
67 } else {
68 true
69 }
70 }
71}
72
73impl TrieIterator for ColumnTrieIter<'_> {
74 fn open(&mut self) -> bool {
75 if self.layer_number == self.trie.header().arity() {
76 false
78 } else if self.layer_number == 0 {
79 let next_layer = self.trie.layer(0);
80 if next_layer.data.is_empty() {
81 return false;
83 }
84 self.layer_number = 1;
86 self.rel_data_i = 0;
87 self.interval_i = 0;
88 self.rel_data = Some(&self.trie.layer(0).data);
89 true
90 } else {
91 let curr_layer = self.trie.layer(self.layer_number - 1);
93 let prev_start_index = curr_layer.interval[self.interval_i];
94 self.interval_i = prev_start_index + self.rel_data_i;
95 self.layer_number += 1;
97 let next_layer = self.trie.layer(self.layer_number - 1);
99 let next_start_index = next_layer.interval[self.interval_i];
101 let next_end_index = if self.interval_i + 1 < next_layer.interval.len() {
102 next_layer.interval[self.interval_i + 1]
103 } else {
104 next_layer.data.len()
105 };
106 self.rel_data = Some(&next_layer.data[next_start_index..next_end_index]);
108 self.rel_data_i = 0;
109 true
110 }
111 }
112
113 fn up(&mut self) -> bool {
114 if self.layer_number == 0 {
115 false
117 } else if self.layer_number == 1 {
118 self.layer_number = 0;
120 self.interval_i = 0;
121 self.rel_data_i = 0;
122 self.rel_data = None;
123 true
124 } else {
125 self.layer_number -= 1;
127 let layer = self.trie.layer(self.layer_number - 1);
128 let data_index = self.interval_i;
132 for (i, start_index) in layer.interval.iter().enumerate() {
137 if data_index < *start_index {
138 break;
139 } else {
140 self.interval_i = i;
141 }
142 }
143
144 let start_index = layer.interval[self.interval_i];
146 let end_index = if self.interval_i + 1 < layer.interval.len() {
148 layer.interval[self.interval_i + 1]
149 } else {
150 layer.data.len()
151 };
152
153 self.rel_data = Some(&layer.data[start_index..end_index]);
155 self.rel_data_i = data_index - start_index;
156
157 true
158 }
159 }
160}
161
162impl TrieIterable for ColumnTrie {
164 fn trie_iter(&self) -> impl TrieIterator + IntoIterator<Item = Vec<usize>> {
165 ColumnTrieIter::new(self)
166 }
167}