@@ -22,6 +22,7 @@ use super::se::BinaryObjectSerializer;
22
22
use super :: { OwnedValue , Value } ;
23
23
use crate :: schema:: document:: type_codes;
24
24
use crate :: schema:: { Facet , Field } ;
25
+ use crate :: store:: DocStoreVersion ;
25
26
use crate :: tokenizer:: PreTokenizedString ;
26
27
27
28
#[ derive( Debug , thiserror:: Error , Clone ) ]
@@ -45,6 +46,9 @@ pub enum DeserializeError {
45
46
#[ error( "{0}" ) ]
46
47
/// A custom error message.
47
48
Custom ( String ) ,
49
+ #[ error( "Version {0}, Max version supported: {1}" ) ]
50
+ /// Unsupported version error.
51
+ UnsupportedVersion ( u32 , u32 ) ,
48
52
}
49
53
50
54
impl DeserializeError {
@@ -291,19 +295,24 @@ pub trait ObjectAccess<'de> {
291
295
pub struct BinaryDocumentDeserializer < ' de , R > {
292
296
length : usize ,
293
297
position : usize ,
298
+ doc_store_version : DocStoreVersion ,
294
299
reader : & ' de mut R ,
295
300
}
296
301
297
302
impl < ' de , R > BinaryDocumentDeserializer < ' de , R >
298
303
where R : Read
299
304
{
300
305
/// Attempts to create a new document deserializer from a given reader.
301
- pub ( crate ) fn from_reader ( reader : & ' de mut R ) -> Result < Self , DeserializeError > {
306
+ pub ( crate ) fn from_reader (
307
+ reader : & ' de mut R ,
308
+ doc_store_version : DocStoreVersion ,
309
+ ) -> Result < Self , DeserializeError > {
302
310
let length = VInt :: deserialize ( reader) ?;
303
311
304
312
Ok ( Self {
305
313
length : length. val ( ) as usize ,
306
314
position : 0 ,
315
+ doc_store_version,
307
316
reader,
308
317
} )
309
318
}
@@ -329,8 +338,8 @@ where R: Read
329
338
}
330
339
331
340
let field = Field :: deserialize ( self . reader ) . map_err ( DeserializeError :: from) ?;
332
-
333
- let deserializer = BinaryValueDeserializer :: from_reader ( self . reader ) ?;
341
+ let deserializer =
342
+ BinaryValueDeserializer :: from_reader ( self . reader , self . doc_store_version ) ?;
334
343
let value = V :: deserialize ( deserializer) ?;
335
344
336
345
self . position += 1 ;
@@ -344,13 +353,17 @@ where R: Read
344
353
pub struct BinaryValueDeserializer < ' de , R > {
345
354
value_type : ValueType ,
346
355
reader : & ' de mut R ,
356
+ doc_store_version : DocStoreVersion ,
347
357
}
348
358
349
359
impl < ' de , R > BinaryValueDeserializer < ' de , R >
350
360
where R : Read
351
361
{
352
362
/// Attempts to create a new value deserializer from a given reader.
353
- fn from_reader ( reader : & ' de mut R ) -> Result < Self , DeserializeError > {
363
+ fn from_reader (
364
+ reader : & ' de mut R ,
365
+ doc_store_version : DocStoreVersion ,
366
+ ) -> Result < Self , DeserializeError > {
354
367
let type_code = <u8 as BinarySerializable >:: deserialize ( reader) ?;
355
368
356
369
let value_type = match type_code {
@@ -391,7 +404,11 @@ where R: Read
391
404
}
392
405
} ;
393
406
394
- Ok ( Self { value_type, reader } )
407
+ Ok ( Self {
408
+ value_type,
409
+ reader,
410
+ doc_store_version,
411
+ } )
395
412
}
396
413
397
414
fn validate_type ( & self , expected_type : ValueType ) -> Result < ( ) , DeserializeError > {
@@ -438,7 +455,16 @@ where R: Read
438
455
439
456
fn deserialize_datetime ( self ) -> Result < DateTime , DeserializeError > {
440
457
self . validate_type ( ValueType :: DateTime ) ?;
441
- <DateTime as BinarySerializable >:: deserialize ( self . reader ) . map_err ( DeserializeError :: from)
458
+ match self . doc_store_version {
459
+ DocStoreVersion :: V1 => {
460
+ let timestamp_micros = <i64 as BinarySerializable >:: deserialize ( self . reader ) ?;
461
+ Ok ( DateTime :: from_timestamp_micros ( timestamp_micros) )
462
+ }
463
+ DocStoreVersion :: V2 => {
464
+ let timestamp_nanos = <i64 as BinarySerializable >:: deserialize ( self . reader ) ?;
465
+ Ok ( DateTime :: from_timestamp_nanos ( timestamp_nanos) )
466
+ }
467
+ }
442
468
}
443
469
444
470
fn deserialize_facet ( self ) -> Result < Facet , DeserializeError > {
@@ -514,11 +540,13 @@ where R: Read
514
540
visitor. visit_pre_tokenized_string ( val)
515
541
}
516
542
ValueType :: Array => {
517
- let access = BinaryArrayDeserializer :: from_reader ( self . reader ) ?;
543
+ let access =
544
+ BinaryArrayDeserializer :: from_reader ( self . reader , self . doc_store_version ) ?;
518
545
visitor. visit_array ( access)
519
546
}
520
547
ValueType :: Object => {
521
- let access = BinaryObjectDeserializer :: from_reader ( self . reader ) ?;
548
+ let access =
549
+ BinaryObjectDeserializer :: from_reader ( self . reader , self . doc_store_version ) ?;
522
550
visitor. visit_object ( access)
523
551
}
524
552
#[ allow( deprecated) ]
@@ -537,7 +565,8 @@ where R: Read
537
565
538
566
let out_rc = std:: rc:: Rc :: new ( out) ;
539
567
let mut slice: & [ u8 ] = & out_rc;
540
- let access = BinaryObjectDeserializer :: from_reader ( & mut slice) ?;
568
+ let access =
569
+ BinaryObjectDeserializer :: from_reader ( & mut slice, self . doc_store_version ) ?;
541
570
542
571
visitor. visit_object ( access)
543
572
}
@@ -551,19 +580,24 @@ pub struct BinaryArrayDeserializer<'de, R> {
551
580
length : usize ,
552
581
position : usize ,
553
582
reader : & ' de mut R ,
583
+ doc_store_version : DocStoreVersion ,
554
584
}
555
585
556
586
impl < ' de , R > BinaryArrayDeserializer < ' de , R >
557
587
where R : Read
558
588
{
559
589
/// Attempts to create a new array deserializer from a given reader.
560
- fn from_reader ( reader : & ' de mut R ) -> Result < Self , DeserializeError > {
590
+ fn from_reader (
591
+ reader : & ' de mut R ,
592
+ doc_store_version : DocStoreVersion ,
593
+ ) -> Result < Self , DeserializeError > {
561
594
let length = <VInt as BinarySerializable >:: deserialize ( reader) ?;
562
595
563
596
Ok ( Self {
564
597
length : length. val ( ) as usize ,
565
598
position : 0 ,
566
599
reader,
600
+ doc_store_version,
567
601
} )
568
602
}
569
603
@@ -587,7 +621,8 @@ where R: Read
587
621
return Ok ( None ) ;
588
622
}
589
623
590
- let deserializer = BinaryValueDeserializer :: from_reader ( self . reader ) ?;
624
+ let deserializer =
625
+ BinaryValueDeserializer :: from_reader ( self . reader , self . doc_store_version ) ?;
591
626
let value = V :: deserialize ( deserializer) ?;
592
627
593
628
// Advance the position cursor.
@@ -610,8 +645,11 @@ impl<'de, R> BinaryObjectDeserializer<'de, R>
610
645
where R : Read
611
646
{
612
647
/// Attempts to create a new object deserializer from a given reader.
613
- fn from_reader ( reader : & ' de mut R ) -> Result < Self , DeserializeError > {
614
- let inner = BinaryArrayDeserializer :: from_reader ( reader) ?;
648
+ fn from_reader (
649
+ reader : & ' de mut R ,
650
+ doc_store_version : DocStoreVersion ,
651
+ ) -> Result < Self , DeserializeError > {
652
+ let inner = BinaryArrayDeserializer :: from_reader ( reader, doc_store_version) ?;
615
653
Ok ( Self { inner } )
616
654
}
617
655
}
@@ -819,6 +857,7 @@ mod tests {
819
857
use crate :: schema:: document:: existing_type_impls:: JsonObjectIter ;
820
858
use crate :: schema:: document:: se:: BinaryValueSerializer ;
821
859
use crate :: schema:: document:: { ReferenceValue , ReferenceValueLeaf } ;
860
+ use crate :: store:: DOC_STORE_VERSION ;
822
861
823
862
fn serialize_value < ' a > ( value : ReferenceValue < ' a , & ' a serde_json:: Value > ) -> Vec < u8 > {
824
863
let mut writer = Vec :: new ( ) ;
@@ -829,9 +868,19 @@ mod tests {
829
868
writer
830
869
}
831
870
871
+ fn serialize_owned_value < ' a > ( value : ReferenceValue < ' a , & ' a OwnedValue > ) -> Vec < u8 > {
872
+ let mut writer = Vec :: new ( ) ;
873
+
874
+ let mut serializer = BinaryValueSerializer :: new ( & mut writer) ;
875
+ serializer. serialize_value ( value) . expect ( "Serialize value" ) ;
876
+
877
+ writer
878
+ }
879
+
832
880
fn deserialize_value ( buffer : Vec < u8 > ) -> crate :: schema:: OwnedValue {
833
881
let mut cursor = Cursor :: new ( buffer) ;
834
- let deserializer = BinaryValueDeserializer :: from_reader ( & mut cursor) . unwrap ( ) ;
882
+ let deserializer =
883
+ BinaryValueDeserializer :: from_reader ( & mut cursor, DOC_STORE_VERSION ) . unwrap ( ) ;
835
884
crate :: schema:: OwnedValue :: deserialize ( deserializer) . expect ( "Deserialize value" )
836
885
}
837
886
@@ -1010,6 +1059,17 @@ mod tests {
1010
1059
assert_eq ! ( value, expected_val) ;
1011
1060
}
1012
1061
1062
+ #[ test]
1063
+ fn test_nested_date_precision ( ) {
1064
+ let object = OwnedValue :: Object ( vec ! [ (
1065
+ "my-date" . into( ) ,
1066
+ OwnedValue :: Date ( DateTime :: from_timestamp_nanos( 323456 ) ) ,
1067
+ ) ] ) ;
1068
+ let result = serialize_owned_value ( ( & object) . as_value ( ) ) ;
1069
+ let value = deserialize_value ( result) ;
1070
+ assert_eq ! ( value, object) ;
1071
+ }
1072
+
1013
1073
#[ test]
1014
1074
fn test_nested_serialize ( ) {
1015
1075
let mut object = serde_json:: Map :: new ( ) ;
0 commit comments