Skip to content

Commit 167006a

Browse files
committed
fix: merge JSTables with vector
1 parent 6bbad2e commit 167006a

2 files changed

Lines changed: 8 additions & 11 deletions

File tree

src/db.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ impl Collection {
279279
tables.push(jstable::read_jstable(path.to_str().unwrap()).unwrap());
280280
}
281281

282-
let merged_table = jstable::merge_jstables(&tables);
282+
let merged_table = jstable::merge_jstables(tables);
283283

284284
for i in 0..self.jstable_count {
285285
let base_path = self.dir.join(format!("jstable-{}", i));

src/jstable.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -375,9 +375,8 @@ pub fn read_index(path: &str) -> io::Result<Vec<(String, u64)>> {
375375
Ok(index)
376376
}
377377

378-
pub fn merge_jstables(tables: &[JSTable]) -> JSTable {
379-
let mut sorted_tables: Vec<&JSTable> = tables.iter().collect();
380-
sorted_tables.sort_by_key(|t| t.timestamp);
378+
pub fn merge_jstables(mut tables: Vec<JSTable>) -> JSTable {
379+
tables.sort_by_key(|t| t.timestamp);
381380

382381
let mut merged_schema = Schema::new(InstanceType::Object);
383382
let mut merged_documents = BTreeMap::new();
@@ -389,14 +388,12 @@ pub fn merge_jstables(tables: &[JSTable]) -> JSTable {
389388
String::new()
390389
};
391390

392-
for table in sorted_tables {
391+
for mut table in tables {
393392
if table.timestamp > max_timestamp {
394393
max_timestamp = table.timestamp;
395394
}
396-
merged_schema.merge(table.schema.clone());
397-
for (id, doc) in &table.documents {
398-
merged_documents.insert(id.clone(), doc.clone());
399-
}
395+
merged_schema.merge(table.schema);
396+
merged_documents.append(&mut table.documents);
400397
}
401398

402399
// Filter nulls (tombstones) - Value::Null matches jsonb Null
@@ -552,7 +549,7 @@ mod tests {
552549
let t2 = JSTable::new(200, "test_col".to_string(), schema.clone(), docs2);
553550

554551
// Case 1: t1 (older) then t2 (newer) in the slice
555-
let merged = merge_jstables(&[t1, t2]);
552+
let merged = merge_jstables(vec![t1, t2]);
556553
assert_eq!(
557554
jsonb_to_serde(merged.documents.get("id1").unwrap()),
558555
json!({"v": 2})
@@ -569,7 +566,7 @@ mod tests {
569566
docs2.insert("id1".to_string(), serde_to_jsonb(json!({"v": 2})));
570567
let t2b = JSTable::new(200, "test_col".to_string(), schema.clone(), docs2);
571568

572-
let merged_reverse = merge_jstables(&[t2b, t1b]);
569+
let merged_reverse = merge_jstables(vec![t2b, t1b]);
573570
assert_eq!(
574571
jsonb_to_serde(merged_reverse.documents.get("id1").unwrap()),
575572
json!({"v": 2})

0 commit comments

Comments
 (0)