Skip to content

Commit bc26f5d

Browse files
committed
Reformat code
1 parent 92b84d1 commit bc26f5d

8 files changed

Lines changed: 308 additions & 193 deletions

File tree

src/db.rs

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use crate::log::{LogEntry, Logger, Operation};
33
use crate::storage::MemTable;
44
use serde_json::Value;
55
use std::fs;
6-
use uuid::Uuid;
76
use std::iter::Peekable;
7+
use uuid::Uuid;
88

99
const MEMTABLE_THRESHOLD: usize = 10;
1010
const JSTABLE_THRESHOLD: u64 = 5;
@@ -111,7 +111,11 @@ impl DB {
111111
let mut sources: Vec<Peekable<Box<dyn Iterator<Item = (String, Value)>>>> = Vec::new();
112112

113113
// 1. MemTable Iterator (Priority 0 - Highest)
114-
let mem_iter = self.memtable.documents.iter().map(|(k, v)| (k.clone(), v.clone()));
114+
let mem_iter = self
115+
.memtable
116+
.documents
117+
.iter()
118+
.map(|(k, v)| (k.clone(), v.clone()));
115119
sources.push((Box::new(mem_iter) as Box<dyn Iterator<Item = (String, Value)>>).peekable());
116120

117121
// 2. JSTable Iterators (Newer to Older)
@@ -120,7 +124,8 @@ impl DB {
120124
if let Ok(iter) = jstable::JSTableIterator::new(&path) {
121125
// Map Result to Value, unwrapping errors for now
122126
let iter = iter.map(|r| r.unwrap());
123-
sources.push((Box::new(iter) as Box<dyn Iterator<Item = (String, Value)>>).peekable());
127+
sources
128+
.push((Box::new(iter) as Box<dyn Iterator<Item = (String, Value)>>).peekable());
124129
}
125130
}
126131

@@ -295,7 +300,7 @@ mod tests {
295300
// Verify data is preserved
296301
// We inserted 0..50 (50 items) + 1 (999). 51 items total.
297302
// Item "0" should be in the compacted table.
298-
// We can't easily query DB yet (no read path implemented in DB),
303+
// We can't easily query DB yet (no read path implemented in DB),
299304
// so we manually check the file.
300305
let jstable_path = format!("{}/jstable-0", dir.path().to_str().unwrap());
301306
let table = jstable::read_jstable(&jstable_path).unwrap();
@@ -310,31 +315,31 @@ mod tests {
310315

311316
// 1. Insert doc to be deleted
312317
let id_to_delete = db.insert(json!({ "a": 100 }));
313-
318+
314319
// Fill memtable to force flush 1 (jstable-0)
315320
// 1 item already inserted. Insert 9 more to fill (total 10).
316321
for i in 0..9 {
317322
db.insert(json!({ "fill": i }));
318323
}
319324
// 11th insert triggers flush of the first 10
320325
db.insert(json!({ "trigger_1": 1 }));
321-
assert_eq!(db.jstable_count, 1);
326+
assert_eq!(db.jstable_count, 1);
322327

323328
// 2. Delete the doc
324329
// id_to_delete is in jstable-0.
325330
// delete adds tombstone to memtable.
326331
// memtable currently has "trigger_1" (1 item).
327332
// delete adds 1 item. len = 2.
328333
db.delete(&id_to_delete);
329-
334+
330335
// Fill memtable to force flush 2 (jstable-1)
331336
// Memtable len is 2. Need 8 more to fill (total 10).
332337
for i in 0..8 {
333338
db.insert(json!({ "fill_2": i }));
334339
}
335340
// 11th insert (relative to this batch) triggers flush
336341
db.insert(json!({ "trigger_2": 1 }));
337-
assert_eq!(db.jstable_count, 2);
342+
assert_eq!(db.jstable_count, 2);
338343

339344
// 3. Create 3 more tables to reach threshold 5
340345
for t in 0..3 {
@@ -350,12 +355,12 @@ mod tests {
350355
// After 3rd iteration (total 5th flush), compaction triggers.
351356
// jstable_count goes 4 -> 5 -> 1.
352357
assert_eq!(db.jstable_count, 1);
353-
358+
354359
// 4. Verify id_to_delete is NOT in jstable-0
355360
let jstable_path = format!("{}/jstable-0", dir.path().to_str().unwrap());
356361
let table = jstable::read_jstable(&jstable_path).unwrap();
357362
assert!(!table.documents.contains_key(&id_to_delete));
358-
363+
359364
// Verify other documents exist (e.g. from flush 1)
360365
assert!(table.documents.len() > 40);
361366
}
@@ -369,12 +374,12 @@ mod tests {
369374
// 0..9
370375
let mut ids = Vec::new();
371376
for i in 0..MEMTABLE_THRESHOLD {
372-
ids.push(db.insert(json!({"val": i})));
377+
ids.push(db.insert(json!({"val": i})));
373378
}
374379
// This filled memtable (10 items). Next insert triggers flush.
375-
380+
376381
// 2. Insert into MemTable (triggers flush of 0..9 to jstable-0)
377-
let id_val_10 = db.insert(json!({"val": 10}));
382+
let id_val_10 = db.insert(json!({"val": 10}));
378383
// Memtable has 1 item (val 10). jstable-0 has 10 items.
379384

380385
// 3. Shadowing: Update an item from jstable-0
@@ -392,14 +397,14 @@ mod tests {
392397

393398
// Check shadowing
394399
assert_eq!(results.get(&id_to_shadow).unwrap(), &json!({"val": 999}));
395-
400+
396401
// Check deletion
397402
assert!(!results.contains_key(&id_to_delete));
398-
403+
399404
// Check preservation of older jstable item
400405
let id_preserved = ids[2].clone(); // val: 2
401406
assert_eq!(results.get(&id_preserved).unwrap(), &json!({"val": 2}));
402-
407+
403408
// Check memtable item
404409
assert_eq!(results.get(&id_val_10).unwrap(), &json!({"val": 10}));
405410
}

src/jstable.rs

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use crate::schema::Schema;
22
use serde::{Deserialize, Serialize};
33
use serde_json::Value;
44
use std::collections::BTreeMap;
5-
use std::io::{self, BufReader, Read, Write};
65
use std::fs::File;
6+
use std::io::{self, BufReader, Read, Write};
77

88
pub struct JSTable {
99
pub timestamp: u64,
@@ -19,19 +19,24 @@ struct JSTableHeader {
1919

2020
impl JSTable {
2121
pub fn new(timestamp: u64, schema: Schema, documents: BTreeMap<String, Value>) -> Self {
22-
JSTable { timestamp, schema, documents }
22+
JSTable {
23+
timestamp,
24+
schema,
25+
documents,
26+
}
2327
}
2428

2529
pub fn write(&self, path: &str) -> io::Result<()> {
2630
let mut file = File::create(path)?;
27-
31+
2832
// Write Header
2933
let header = JSTableHeader {
3034
timestamp: self.timestamp,
3135
schema: self.schema.clone(),
3236
};
3337
// Serialize header using jsonb
34-
let header_blob = jsonb::to_owned_jsonb(&header).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
38+
let header_blob = jsonb::to_owned_jsonb(&header)
39+
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
3540
let header_bytes = header_blob.to_vec();
3641
let header_len = header_bytes.len() as u32;
3742
file.write_all(&header_len.to_le_bytes())?;
@@ -40,7 +45,8 @@ impl JSTable {
4045
// Write Documents
4146
for (id, doc) in &self.documents {
4247
let record: (String, &Value) = (id.clone(), doc);
43-
let record_blob = jsonb::to_owned_jsonb(&record).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
48+
let record_blob = jsonb::to_owned_jsonb(&record)
49+
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
4450
let record_bytes = record_blob.to_vec();
4551
let record_len = record_bytes.len() as u32;
4652
file.write_all(&record_len.to_le_bytes())?;
@@ -69,11 +75,13 @@ impl JSTableIterator {
6975
// Read Header Blob
7076
let mut header_blob = vec![0u8; header_len];
7177
reader.read_exact(&mut header_blob)?;
72-
73-
let header_val = jsonb::from_slice(&header_blob).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
78+
79+
let header_val = jsonb::from_slice(&header_blob)
80+
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
7481
// Convert jsonb::Value -> String -> T
7582
let header_str = header_val.to_string();
76-
let header: JSTableHeader = serde_json::from_str(&header_str).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
83+
let header: JSTableHeader = serde_json::from_str(&header_str)
84+
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))?;
7785

7886
Ok(Self {
7987
reader,
@@ -95,17 +103,21 @@ impl Iterator for JSTableIterator {
95103
if let Err(e) = self.reader.read_exact(&mut record_blob) {
96104
return Some(Err(e));
97105
}
98-
99-
let record_val = match jsonb::from_slice(&record_blob).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e)) {
106+
107+
let record_val = match jsonb::from_slice(&record_blob)
108+
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))
109+
{
100110
Ok(v) => v,
101111
Err(e) => return Some(Err(e)),
102112
};
103113
let record_str = record_val.to_string();
104-
let record: (String, Value) = match serde_json::from_str(&record_str).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e)) {
114+
let record: (String, Value) = match serde_json::from_str(&record_str)
115+
.map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))
116+
{
105117
Ok(v) => v,
106118
Err(e) => return Some(Err(e)),
107119
};
108-
120+
109121
Some(Ok(record))
110122
}
111123
Err(e) if e.kind() == io::ErrorKind::UnexpectedEof => None,
@@ -118,13 +130,13 @@ pub fn read_jstable(path: &str) -> io::Result<JSTable> {
118130
let iterator = JSTableIterator::new(path)?;
119131
let timestamp = iterator.timestamp;
120132
let schema = iterator.schema.clone();
121-
133+
122134
let mut documents = BTreeMap::new();
123135
for result in iterator {
124136
let (id, doc) = result?;
125137
documents.insert(id, doc);
126138
}
127-
139+
128140
Ok(JSTable {
129141
timestamp,
130142
schema,
@@ -166,9 +178,10 @@ mod tests {
166178
fn test_read_jstable() -> Result<(), Box<dyn std::error::Error>> {
167179
let schema = Schema {
168180
types: vec![SchemaType::Object],
169-
properties: Some(BTreeMap::from([
170-
("a".to_string(), Schema::new(SchemaType::Integer)),
171-
])),
181+
properties: Some(BTreeMap::from([(
182+
"a".to_string(),
183+
Schema::new(SchemaType::Integer),
184+
)])),
172185
items: None,
173186
};
174187
let mut documents = BTreeMap::new();
@@ -193,9 +206,10 @@ mod tests {
193206
fn test_jstable_iterator() -> Result<(), Box<dyn std::error::Error>> {
194207
let schema = Schema {
195208
types: vec![SchemaType::Object],
196-
properties: Some(BTreeMap::from([
197-
("a".to_string(), Schema::new(SchemaType::Integer)),
198-
])),
209+
properties: Some(BTreeMap::from([(
210+
"a".to_string(),
211+
Schema::new(SchemaType::Integer),
212+
)])),
199213
items: None,
200214
};
201215
let mut documents = BTreeMap::new();
@@ -208,7 +222,7 @@ mod tests {
208222

209223
let mut iterator = JSTableIterator::new(file.path().to_str().unwrap())?;
210224
assert_eq!(iterator.timestamp, 12345);
211-
225+
212226
let mut count = 0;
213227
let mut ids = Vec::new();
214228
for result in iterator {
@@ -220,14 +234,14 @@ mod tests {
220234
assert_eq!(count, 2);
221235
assert!(ids.contains(&"id1".to_string()));
222236
assert!(ids.contains(&"id2".to_string()));
223-
237+
224238
Ok(())
225239
}
226240

227241
#[test]
228242
fn test_merge_jstables_conflict_resolution() {
229243
let schema = Schema::new(SchemaType::Object);
230-
244+
231245
let mut docs1 = BTreeMap::new();
232246
docs1.insert("id1".to_string(), json!({"v": 1}));
233247
let t1 = JSTable::new(100, schema.clone(), docs1);
@@ -251,7 +265,10 @@ mod tests {
251265
let t2b = JSTable::new(200, schema.clone(), docs2);
252266

253267
let merged_reverse = merge_jstables(&[t2b, t1b]);
254-
assert_eq!(*merged_reverse.documents.get("id1").unwrap(), json!({"v": 2}));
268+
assert_eq!(
269+
*merged_reverse.documents.get("id1").unwrap(),
270+
json!({"v": 2})
271+
);
255272
assert_eq!(merged_reverse.timestamp, 200);
256273
}
257274
}

src/log.rs

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,9 @@ use std::path::{Path, PathBuf};
77

88
#[derive(Serialize, Deserialize, Debug)]
99
pub enum Operation {
10-
Insert {
11-
id: String,
12-
doc: Value,
13-
},
14-
Update {
15-
id: String,
16-
doc: Value,
17-
},
18-
Delete {
19-
id: String,
20-
},
10+
Insert { id: String, doc: Value },
11+
Update { id: String, doc: Value },
12+
Delete { id: String },
2113
}
2214

2315
#[derive(Serialize, Deserialize, Debug)]
@@ -35,10 +27,7 @@ pub struct Logger {
3527
impl Logger {
3628
pub fn new<P: AsRef<Path>>(path: P, rotation_threshold: u64) -> std::io::Result<Self> {
3729
let path = path.as_ref().to_path_buf();
38-
let file = OpenOptions::new()
39-
.create(true)
40-
.append(true)
41-
.open(&path)?;
30+
let file = OpenOptions::new().create(true).append(true).open(&path)?;
4231
Ok(Logger {
4332
file,
4433
path,
@@ -50,10 +39,7 @@ impl Logger {
5039
if self.file.metadata()?.len() > self.rotation_threshold {
5140
self.rotate()?;
5241
}
53-
let entry = LogEntry {
54-
ts: Utc::now(),
55-
op,
56-
};
42+
let entry = LogEntry { ts: Utc::now(), op };
5743
let json = serde_json::to_string(&entry)?;
5844
writeln!(self.file, "{}", json)
5945
}

0 commit comments

Comments
 (0)