use bytes::Bytes;
use seerdb::{DBOptions, StringAppendOperator};
use std::sync::Arc;
use tempfile::tempdir;
#[test]
fn test_merge_in_memory() {
let dir = tempdir().unwrap();
let db = DBOptions::default()
.merge_operator(Arc::new(StringAppendOperator::new(',')))
.open(dir.path())
.unwrap();
db.put(b"key1", b"val").unwrap();
db.merge(b"key1", b"op1").unwrap();
assert_eq!(db.get(b"key1").unwrap(), Some(Bytes::from("val,op1")));
}
#[test]
fn test_merge_stacking() {
let dir = tempdir().unwrap();
let db = DBOptions::default()
.merge_operator(Arc::new(StringAppendOperator::new(',')))
.open(dir.path())
.unwrap();
db.merge(b"list", b"item1").unwrap();
db.merge(b"list", b"item2").unwrap();
assert_eq!(db.get(b"list").unwrap(), Some(Bytes::from("item1,item2")));
}
#[test]
fn test_merge_flush_and_recovery() {
let dir = tempdir().unwrap();
{
let db = DBOptions::default()
.memtable_capacity(1024)
.merge_operator(Arc::new(StringAppendOperator::new(',')))
.open(dir.path())
.unwrap();
db.put(b"key", b"base").unwrap();
db.merge(b"key", b"op1").unwrap();
db.flush().unwrap();
db.merge(b"key", b"op2").unwrap();
assert_eq!(db.get(b"key").unwrap(), Some(Bytes::from("base,op1,op2")));
}
{
let db = DBOptions::default()
.memtable_capacity(1024)
.merge_operator(Arc::new(StringAppendOperator::new(',')))
.open(dir.path())
.unwrap();
assert_eq!(db.get(b"key").unwrap(), Some(Bytes::from("base,op1,op2")));
}
}
#[test]
fn test_merge_with_delete() {
let dir = tempdir().unwrap();
let db = DBOptions::default()
.merge_operator(Arc::new(StringAppendOperator::new(',')))
.open(dir.path())
.unwrap();
db.put(b"key", b"val1").unwrap();
db.delete(b"key").unwrap();
db.merge(b"key", b"val2").unwrap();
assert_eq!(db.get(b"key").unwrap(), Some(Bytes::from("val2")));
}