Skip to content

Commit b406960

Browse files
Merge pull request #58 from JakeRoggenbuck/implement-index-completely
Implement index completely
2 parents e96a224 + d0a8e87 commit b406960

File tree

3 files changed

+66
-28
lines changed

3 files changed

+66
-28
lines changed

simple_tester.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@
2828
print(vals)
2929

3030
for x in range(0, 8):
31-
print(f"query.sum(13, 17, {x})", query.sum(13, 17, x))
31+
print(f"query.sum(15, 17, {x})", query.sum(15, 17, x))

src/database.rs

Lines changed: 60 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,32 @@
11
use super::container::{BaseContainer, TailContainer};
22
use super::page::PhysicalPage;
33
use pyo3::prelude::*;
4+
use std::collections::BTreeMap;
45
use std::collections::HashMap;
56
use std::sync::{Arc, Mutex};
67

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+
730
#[derive(Clone)]
831
pub struct PageRange {
932
base_container: BaseContainer,
@@ -80,43 +103,61 @@ pub struct RTable {
80103
pub num_records: u64,
81104

82105
#[pyo3(get)]
83-
pub num_columns: i64,
106+
pub num_columns: usize,
107+
108+
pub index: RIndex,
84109
}
85110

86111
impl RTable {
87112
pub fn write(&mut self, values: Vec<u64>) -> Record {
88113
// 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);
91120

92121
// 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());
94123

95124
self.num_records += 1;
96125
return rec;
97126
}
98127

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);
101131

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+
}
106140
}
141+
142+
None
107143
}
108144

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+
}
111152
}
112153

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 {
114155
let mut agg = 0i64;
115156

116157
// Make sum range inclusive
117158
// 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) {
120161
agg += v[col_index as usize] as i64;
121162
}
122163
}
@@ -154,19 +195,15 @@ impl RDatabase {
154195
unreachable!("Not used in milestone 1");
155196
}
156197

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 {
163199
let t = RTable {
164200
name: name.clone(),
165201
page_range: PageRange::new(num_columns as u64),
166-
primary_key_column,
202+
primary_key_column: primary_key_column as usize,
167203
page_directory: HashMap::new(),
168-
num_columns: 1,
204+
num_columns: num_columns as usize,
169205
num_records: 0,
206+
index: RIndex::new(),
170207
};
171208

172209
let i = self.tables.len();

src/query.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,20 @@ impl RQuery {
2323

2424
fn select(
2525
&mut self,
26-
search_key: i64,
26+
primary_key: i64,
2727
_search_key_index: i64,
2828
_projected_columns_index: Vec<i64>,
2929
) -> Option<Vec<u64>> {
30-
self.table.read(search_key as u64)
30+
self.table.read(primary_key as u64)
3131
}
3232

3333
fn select_version(&mut self) {}
3434

3535
fn update(&mut self) {}
3636

37-
fn sum(&mut self, start: u64, end: u64, col_index: u64) -> i64 {
38-
self.table.sum(start, end, col_index)
37+
fn sum(&mut self, start_primary_key: u64, end_primary_key: u64, col_index: u64) -> i64 {
38+
self.table
39+
.sum(start_primary_key, end_primary_key, col_index)
3940
}
4041

4142
fn sum_version(&mut self) {}

0 commit comments

Comments
 (0)