feat: add document test
This commit is contained in:
parent
2bc939479c
commit
0ce76c5a89
|
|
@ -2253,6 +2253,7 @@ dependencies = [
|
||||||
"bincode",
|
"bincode",
|
||||||
"serde",
|
"serde",
|
||||||
"sled",
|
"sled",
|
||||||
|
"tempfile",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,4 +9,7 @@ edition = "2021"
|
||||||
sled = "0.34.7"
|
sled = "0.34.7"
|
||||||
thiserror = "1.0.30"
|
thiserror = "1.0.30"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
bincode = "1.3.3"
|
bincode = "1.3.3"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
tempfile = "3.4.0"
|
||||||
|
|
@ -27,7 +27,7 @@ impl RevDB {
|
||||||
from_key: K,
|
from_key: K,
|
||||||
to_key: K,
|
to_key: K,
|
||||||
) -> Result<Vec<IVec>, RevDBError> {
|
) -> Result<Vec<IVec>, RevDBError> {
|
||||||
let iter = self.db.range(from_key..to_key);
|
let iter = self.db.range(from_key..=to_key);
|
||||||
let mut items = vec![];
|
let mut items = vec![];
|
||||||
for item in iter {
|
for item in iter {
|
||||||
let (_, value) = item?;
|
let (_, value) = item?;
|
||||||
|
|
|
||||||
|
|
@ -12,11 +12,10 @@ impl<'a> Document<'a> {
|
||||||
&self,
|
&self,
|
||||||
uid: i64,
|
uid: i64,
|
||||||
document_id: i64,
|
document_id: i64,
|
||||||
rev_id: i64,
|
value: DocumentRevData,
|
||||||
data: &[u8],
|
|
||||||
) -> Result<(), RevDBError> {
|
) -> Result<(), RevDBError> {
|
||||||
let key = make_document_key(uid, document_id, rev_id);
|
let key = make_document_key(uid, document_id, value.rev_id);
|
||||||
let _ = self.db.insert(key, data)?;
|
let _ = self.db.insert(key, &value.to_vec()?)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -25,18 +24,24 @@ impl<'a> Document<'a> {
|
||||||
uid: i64,
|
uid: i64,
|
||||||
document_id: i64,
|
document_id: i64,
|
||||||
rev_id: i64,
|
rev_id: i64,
|
||||||
) -> Result<Option<Vec<u8>>, RevDBError> {
|
) -> Result<Option<DocumentRevData>, RevDBError> {
|
||||||
let key = make_document_key(uid, document_id, rev_id);
|
let key = make_document_key(uid, document_id, rev_id);
|
||||||
let value = self.db.get(key)?;
|
match self.db.get(key)? {
|
||||||
Ok(value.map(|value| value.to_vec()))
|
None => Ok(None),
|
||||||
|
Some(value) => {
|
||||||
|
let data = DocumentRevData::from_vec(value.as_ref())?;
|
||||||
|
Ok(Some(data))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_with_range(
|
pub fn get_with_range<R: Into<RevRange>>(
|
||||||
&self,
|
&self,
|
||||||
uid: i64,
|
uid: i64,
|
||||||
document_id: i64,
|
document_id: i64,
|
||||||
range: RevRange,
|
range: R,
|
||||||
) -> Result<Vec<DocumentRevData>, RevDBError> {
|
) -> Result<Vec<DocumentRevData>, RevDBError> {
|
||||||
|
let range = range.into();
|
||||||
let from = make_document_key(uid, document_id, range.start);
|
let from = make_document_key(uid, document_id, range.start);
|
||||||
let to = make_document_key(uid, document_id, range.end);
|
let to = make_document_key(uid, document_id, range.end);
|
||||||
self.batch_get(from, to)
|
self.batch_get(from, to)
|
||||||
|
|
@ -64,7 +69,7 @@ impl<'a> Document<'a> {
|
||||||
self.batch_get(from, to)
|
self.batch_get(from, to)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn batch_get<K: AsRef<[u8]>>(
|
fn batch_get<K: AsRef<[u8]>>(
|
||||||
&self,
|
&self,
|
||||||
from: K,
|
from: K,
|
||||||
to: K,
|
to: K,
|
||||||
|
|
@ -79,7 +84,7 @@ impl<'a> Document<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
pub struct DocumentRevData {
|
pub struct DocumentRevData {
|
||||||
#[serde(rename = "rid")]
|
#[serde(rename = "rid")]
|
||||||
pub rev_id: i64,
|
pub rev_id: i64,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
mod db;
|
pub mod db;
|
||||||
pub mod document;
|
pub mod document;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
pub mod range;
|
pub mod range;
|
||||||
|
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
#[test]
|
|
||||||
fn read_document() {}
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
mod test;
|
||||||
|
mod util;
|
||||||
|
|
@ -0,0 +1,134 @@
|
||||||
|
use crate::document::util::make_test_db;
|
||||||
|
use revdb::document::{Document, DocumentRevData};
|
||||||
|
use revdb::range::RevRange;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn insert_text() {
|
||||||
|
let db = make_test_db();
|
||||||
|
let document = db.document();
|
||||||
|
let uid = 12345678;
|
||||||
|
let document_id = 1;
|
||||||
|
let value = DocumentRevData {
|
||||||
|
rev_id: 0,
|
||||||
|
base_rev_id: 0,
|
||||||
|
content: "hello world".to_string(),
|
||||||
|
};
|
||||||
|
document.insert(uid, document_id, value.clone()).unwrap();
|
||||||
|
|
||||||
|
let restored_data = document.get(uid, document_id, 0).unwrap().unwrap();
|
||||||
|
assert_eq!(value.content, restored_data.content);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn insert_multi_text() {
|
||||||
|
let db = make_test_db();
|
||||||
|
let document = db.document();
|
||||||
|
let uid = 12345678;
|
||||||
|
let document_id = 1;
|
||||||
|
|
||||||
|
let mut base_rev_id = 0;
|
||||||
|
let mut expected_str = "".to_string();
|
||||||
|
for i in 0..=100 {
|
||||||
|
let content = i.to_string();
|
||||||
|
expected_str.push_str(&content);
|
||||||
|
let value = DocumentRevData {
|
||||||
|
rev_id: i,
|
||||||
|
base_rev_id,
|
||||||
|
content,
|
||||||
|
};
|
||||||
|
base_rev_id += 1;
|
||||||
|
document.insert(uid, document_id, value).unwrap();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
let restored_str = document
|
||||||
|
.get_with_range(uid, document_id, RevRange::new(0, 100))
|
||||||
|
.unwrap()
|
||||||
|
.into_iter()
|
||||||
|
.map(|data| data.content)
|
||||||
|
.collect::<Vec<String>>()
|
||||||
|
.join("");
|
||||||
|
|
||||||
|
assert_eq!(expected_str, restored_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn insert_100_string_to_document(uid: i64, document_id: i64, document: &Document) {
|
||||||
|
let mut base_rev_id = 0;
|
||||||
|
for i in 0..=100 {
|
||||||
|
let content = i.to_string();
|
||||||
|
let value = DocumentRevData {
|
||||||
|
rev_id: i,
|
||||||
|
base_rev_id,
|
||||||
|
content,
|
||||||
|
};
|
||||||
|
base_rev_id += 1;
|
||||||
|
document.insert(uid, document_id, value).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn values_to_string(values: Vec<DocumentRevData>) -> String {
|
||||||
|
values
|
||||||
|
.into_iter()
|
||||||
|
.map(|data| data.content)
|
||||||
|
.collect::<Vec<String>>()
|
||||||
|
.join("")
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_value_before() {
|
||||||
|
let db = make_test_db();
|
||||||
|
let document = db.document();
|
||||||
|
let uid = 12345678;
|
||||||
|
let document_id = 1;
|
||||||
|
insert_100_string_to_document(uid, document_id, &document);
|
||||||
|
|
||||||
|
let restored_str = values_to_string(document.get_before(uid, document_id, 50).unwrap());
|
||||||
|
assert_eq!("01234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950", restored_str);
|
||||||
|
|
||||||
|
let restored_str = values_to_string(document.get_before(uid, document_id, 0).unwrap());
|
||||||
|
assert_eq!("0", restored_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_value_after() {
|
||||||
|
let db = make_test_db();
|
||||||
|
let document = db.document();
|
||||||
|
let uid = 12345678;
|
||||||
|
let document_id = 1;
|
||||||
|
insert_100_string_to_document(uid, document_id, &document);
|
||||||
|
|
||||||
|
let restored_str = values_to_string(document.get_after(uid, document_id, 50).unwrap());
|
||||||
|
assert_eq!("5051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100", restored_str);
|
||||||
|
|
||||||
|
let restored_str = values_to_string(document.get_after(uid, document_id, 100).unwrap());
|
||||||
|
assert_eq!("100", restored_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn get_value_with_range() {
|
||||||
|
let db = make_test_db();
|
||||||
|
let document = db.document();
|
||||||
|
let uid = 12345678;
|
||||||
|
let document_id = 1;
|
||||||
|
insert_100_string_to_document(uid, document_id, &document);
|
||||||
|
|
||||||
|
let restored_str = values_to_string(
|
||||||
|
document
|
||||||
|
.get_with_range(uid, document_id, RevRange::new(50, 60))
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
assert_eq!("5051525354555657585960", restored_str);
|
||||||
|
|
||||||
|
let restored_str = values_to_string(
|
||||||
|
document
|
||||||
|
.get_with_range(uid, document_id, RevRange::new(50, 200))
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
assert_eq!("5051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100", restored_str);
|
||||||
|
|
||||||
|
let restored_str = values_to_string(
|
||||||
|
document
|
||||||
|
.get_with_range(uid, document_id, RevRange::new(50, 50))
|
||||||
|
.unwrap(),
|
||||||
|
);
|
||||||
|
assert_eq!("50", restored_str);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
use revdb::db::RevDB;
|
||||||
|
use tempfile::TempDir;
|
||||||
|
|
||||||
|
pub fn make_test_db() -> RevDB {
|
||||||
|
let tempdir = TempDir::new().unwrap();
|
||||||
|
RevDB::open(tempdir).unwrap()
|
||||||
|
}
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
"nullable": [],
|
"nullable": [],
|
||||||
"parameters": {
|
"parameters": {
|
||||||
"Left": [
|
"Left": [
|
||||||
"Uuid",
|
"Int8",
|
||||||
"Text",
|
"Text",
|
||||||
"Text",
|
"Text",
|
||||||
"Timestamptz",
|
"Timestamptz",
|
||||||
|
|
@ -16,13 +16,33 @@
|
||||||
},
|
},
|
||||||
"query": "\n INSERT INTO users (uid, email, username, create_time, password)\n VALUES ($1, $2, $3, $4, $5)\n "
|
"query": "\n INSERT INTO users (uid, email, username, create_time, password)\n VALUES ($1, $2, $3, $4, $5)\n "
|
||||||
},
|
},
|
||||||
|
"3502aac2e0b7e80c2afdf7aba85cd1bfa9dd7f6b95d711bb1dee50c6fae2f061": {
|
||||||
|
"describe": {
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"name": "email",
|
||||||
|
"ordinal": 0,
|
||||||
|
"type_info": "Text"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"nullable": [
|
||||||
|
false
|
||||||
|
],
|
||||||
|
"parameters": {
|
||||||
|
"Left": [
|
||||||
|
"Int8"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"query": "\n SELECT email \n FROM users\n WHERE uid = $1\n "
|
||||||
|
},
|
||||||
"b188bb8915fa0fc8c5dfefa27f1b086b839633c3c4dc6e4991b43a608d46a170": {
|
"b188bb8915fa0fc8c5dfefa27f1b086b839633c3c4dc6e4991b43a608d46a170": {
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
{
|
{
|
||||||
"name": "uid",
|
"name": "uid",
|
||||||
"ordinal": 0,
|
"ordinal": 0,
|
||||||
"type_info": "Uuid"
|
"type_info": "Int8"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "password",
|
"name": "password",
|
||||||
|
|
@ -41,18 +61,5 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"query": "\n SELECT uid, password\n FROM users\n WHERE email = $1\n "
|
"query": "\n SELECT uid, password\n FROM users\n WHERE email = $1\n "
|
||||||
},
|
|
||||||
"b754835f0a1543fc32acbfee436f775e542036888e7a2051622efa435debb318": {
|
|
||||||
"describe": {
|
|
||||||
"columns": [],
|
|
||||||
"nullable": [],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Text",
|
|
||||||
"Uuid"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"query": "\n UPDATE users\n SET password= $1\n WHERE uid = $2\n "
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue