|
1 | 1 | use super::container::{BaseContainer, TailContainer}; |
2 | 2 | use super::page::PhysicalPage; |
3 | 3 | use pyo3::prelude::*; |
| 4 | +use std::collections::BTreeMap; |
4 | 5 | use std::collections::HashMap; |
5 | 6 | use std::sync::{Arc, Mutex}; |
6 | 7 |
|
| 8 | +#[pyclass] |
| 9 | +#[derive(Clone)] |
| 10 | +pub struct RIndex { |
| 11 | + index: BTreeMap<u64, u64>, |
| 12 | +} |
| 13 | + |
| 14 | +impl RIndex { |
| 15 | + pub fn new() -> RIndex { |
| 16 | + RIndex { |
| 17 | + index: BTreeMap::new(), |
| 18 | + } |
| 19 | + } |
| 20 | + |
| 21 | + pub fn add(&mut self, primary_key: u64, rid: u64) { |
| 22 | + self.index.insert(primary_key, rid); |
| 23 | + } |
| 24 | + |
| 25 | + pub fn get(&self, primary_key: u64) -> Option<&u64> { |
| 26 | + self.index.get(&primary_key) |
| 27 | + } |
| 28 | +} |
| 29 | + |
7 | 30 | #[derive(Clone)] |
8 | 31 | pub struct PageRange { |
9 | 32 | base_container: BaseContainer, |
@@ -80,43 +103,61 @@ pub struct RTable { |
80 | 103 | pub num_records: u64, |
81 | 104 |
|
82 | 105 | #[pyo3(get)] |
83 | | - pub num_columns: i64, |
| 106 | + pub num_columns: usize, |
| 107 | + |
| 108 | + pub index: RIndex, |
84 | 109 | } |
85 | 110 |
|
86 | 111 | impl RTable { |
87 | 112 | pub fn write(&mut self, values: Vec<u64>) -> Record { |
88 | 113 | // Use the primary_key_column'th value as the given key |
89 | | - let given_key = values[self.primary_key_column]; |
90 | | - let rec = self.page_range.write(self.num_records, values); |
| 114 | + let primary_key = values[self.primary_key_column]; |
| 115 | + |
| 116 | + let rid = self.num_records; |
| 117 | + self.index.add(primary_key, rid); |
| 118 | + |
| 119 | + let rec = self.page_range.write(rid, values); |
91 | 120 |
|
92 | 121 | // Save the RID -> Record so it can later be read |
93 | | - self.page_directory.insert(given_key, rec.clone()); |
| 122 | + self.page_directory.insert(rid, rec.clone()); |
94 | 123 |
|
95 | 124 | self.num_records += 1; |
96 | 125 | return rec; |
97 | 126 | } |
98 | 127 |
|
99 | | - pub fn read(&self, rid: u64) -> Option<Vec<u64>> { |
100 | | - let rec = self.page_directory.get(&rid); |
| 128 | + pub fn read(&self, primary_key: u64) -> Option<Vec<u64>> { |
| 129 | + // Lookup RID from primary_key |
| 130 | + let rid = self.index.get(primary_key); |
101 | 131 |
|
102 | | - // If the rec exists in the page_directory, return the read values |
103 | | - match rec { |
104 | | - Some(r) => self.page_range.read(r.clone()), |
105 | | - None => None, |
| 132 | + if let Some(r) = rid { |
| 133 | + let rec = self.page_directory.get(&r); |
| 134 | + |
| 135 | + // If the rec exists in the page_directory, return the read values |
| 136 | + match rec { |
| 137 | + Some(r) => return self.page_range.read(r.clone()), |
| 138 | + None => return None, |
| 139 | + } |
106 | 140 | } |
| 141 | + |
| 142 | + None |
107 | 143 | } |
108 | 144 |
|
109 | | - pub fn delete(&mut self, rid: u64) { |
110 | | - self.page_directory.remove(&rid); |
| 145 | + pub fn delete(&mut self, primary_key: u64) { |
| 146 | + // Lookup RID from primary_key |
| 147 | + let rid = self.index.get(primary_key); |
| 148 | + |
| 149 | + if let Some(r) = rid { |
| 150 | + self.page_directory.remove(&r); |
| 151 | + } |
111 | 152 | } |
112 | 153 |
|
113 | | - pub fn sum(&mut self, start: u64, end: u64, col_index: u64) -> i64 { |
| 154 | + pub fn sum(&mut self, start_primary_key: u64, end_primary_key: u64, col_index: u64) -> i64 { |
114 | 155 | let mut agg = 0i64; |
115 | 156 |
|
116 | 157 | // Make sum range inclusive |
117 | 158 | // TODO: Validate this assumption if it should actually be inclusive |
118 | | - for rid in start..end + 1 { |
119 | | - if let Some(v) = self.read(rid) { |
| 159 | + for primary_key in start_primary_key..end_primary_key + 1 { |
| 160 | + if let Some(v) = self.read(primary_key) { |
120 | 161 | agg += v[col_index as usize] as i64; |
121 | 162 | } |
122 | 163 | } |
@@ -154,19 +195,15 @@ impl RDatabase { |
154 | 195 | unreachable!("Not used in milestone 1"); |
155 | 196 | } |
156 | 197 |
|
157 | | - fn create_table( |
158 | | - &mut self, |
159 | | - name: String, |
160 | | - num_columns: i64, |
161 | | - primary_key_column: usize, |
162 | | - ) -> RTable { |
| 198 | + fn create_table(&mut self, name: String, num_columns: u64, primary_key_column: u64) -> RTable { |
163 | 199 | let t = RTable { |
164 | 200 | name: name.clone(), |
165 | 201 | page_range: PageRange::new(num_columns as u64), |
166 | | - primary_key_column, |
| 202 | + primary_key_column: primary_key_column as usize, |
167 | 203 | page_directory: HashMap::new(), |
168 | | - num_columns: 1, |
| 204 | + num_columns: num_columns as usize, |
169 | 205 | num_records: 0, |
| 206 | + index: RIndex::new(), |
170 | 207 | }; |
171 | 208 |
|
172 | 209 | let i = self.tables.len(); |
|
0 commit comments