@@ -2,8 +2,8 @@ use crate::schema::Schema;
22use serde:: { Deserialize , Serialize } ;
33use serde_json:: Value ;
44use std:: collections:: BTreeMap ;
5- use std:: io:: { self , BufReader , Read , Write } ;
65use std:: fs:: File ;
6+ use std:: io:: { self , BufReader , Read , Write } ;
77
88pub struct JSTable {
99 pub timestamp : u64 ,
@@ -19,19 +19,24 @@ struct JSTableHeader {
1919
2020impl 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}
0 commit comments