Skip to content

Commit d611f18

Browse files
committed
remove configurable binary serialize, add enum for doc store version
1 parent 5480d93 commit d611f18

File tree

9 files changed

+119
-205
lines changed

9 files changed

+119
-205
lines changed

common/src/datetime.rs

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use std::fmt;
2-
use std::io::{self, Read, Write};
2+
use std::io::{Read, Write};
33

44
use serde::{Deserialize, Serialize};
55
use time::format_description::well_known::Rfc3339;
66
use time::{OffsetDateTime, PrimitiveDateTime, UtcOffset};
77

8-
use crate::{BinarySerializable, BinarySerializableConfig, ConfigurableBinarySerializable};
8+
use crate::BinarySerializable;
99

1010
/// Precision with which datetimes are truncated when stored in fast fields. This setting is only
1111
/// relevant for fast fields. In the docstore, datetimes are always saved with nanosecond precision.
@@ -174,29 +174,3 @@ impl BinarySerializable for DateTime {
174174
Ok(Self::from_timestamp_micros(timestamp_micros))
175175
}
176176
}
177-
178-
impl ConfigurableBinarySerializable for DateTime {
179-
fn serialize<W: Write + ?Sized>(
180-
&self,
181-
writer: &mut W,
182-
config: &BinarySerializableConfig,
183-
) -> io::Result<()> {
184-
let truncated_val = match config.date_time_precision {
185-
DateTimePrecision::Seconds => self.into_timestamp_secs(),
186-
DateTimePrecision::Milliseconds => self.into_timestamp_millis(),
187-
DateTimePrecision::Microseconds => self.into_timestamp_micros(),
188-
DateTimePrecision::Nanoseconds => self.into_timestamp_nanos(),
189-
};
190-
<i64 as BinarySerializable>::serialize(&truncated_val, writer)
191-
}
192-
193-
fn deserialize<R: Read>(reader: &mut R, config: &BinarySerializableConfig) -> io::Result<Self> {
194-
let timestamp = <i64 as BinarySerializable>::deserialize(reader)?;
195-
match config.date_time_precision {
196-
DateTimePrecision::Seconds => Ok(Self::from_timestamp_secs(timestamp)),
197-
DateTimePrecision::Milliseconds => Ok(Self::from_timestamp_millis(timestamp)),
198-
DateTimePrecision::Microseconds => Ok(Self::from_timestamp_micros(timestamp)),
199-
DateTimePrecision::Nanoseconds => Ok(Self::from_timestamp_nanos(timestamp)),
200-
}
201-
}
202-
}

common/src/serialize.rs

Lines changed: 1 addition & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::{fmt, io};
44

55
use byteorder::{ReadBytesExt, WriteBytesExt};
66

7-
use crate::{DateTimePrecision, Endianness, VInt};
7+
use crate::{Endianness, VInt};
88

99
#[derive(Default)]
1010
struct Counter(u64);
@@ -25,63 +25,6 @@ impl io::Write for Counter {
2525
}
2626
}
2727

28-
/// The configuration for binary serialization.
29-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
30-
pub struct BinarySerializableConfig {
31-
/// The precision with which DateTime is de/serialized
32-
pub date_time_precision: DateTimePrecision,
33-
}
34-
35-
/// Trait for configurable binary serialization
36-
pub trait ConfigurableBinarySerializable: fmt::Debug + Sized {
37-
fn serialize<W: Write + ?Sized>(
38-
&self,
39-
writer: &mut W,
40-
config: &BinarySerializableConfig,
41-
) -> io::Result<()>;
42-
fn deserialize<R: Read>(reader: &mut R, config: &BinarySerializableConfig) -> io::Result<Self>;
43-
fn num_bytes(&self, config: &BinarySerializableConfig) -> u64 {
44-
let mut counter = Counter::default();
45-
self.serialize(&mut counter, config).unwrap();
46-
counter.0
47-
}
48-
}
49-
50-
/// Implement ConfigurableBinarySerializable trait for types that don't need versioning by
51-
/// forwarding to BinarySerializable trait.
52-
#[macro_export]
53-
macro_rules! impl_configurable_binary_serializable_by_calling_binary_serializable {
54-
($type:ty) => {
55-
impl ConfigurableBinarySerializable for $type {
56-
fn serialize<W: Write + ?Sized>(
57-
&self,
58-
writer: &mut W,
59-
_version: &BinarySerializableConfig,
60-
) -> io::Result<()> {
61-
<Self as BinarySerializable>::serialize(self, writer)
62-
}
63-
64-
fn deserialize<R: Read>(
65-
reader: &mut R,
66-
_version: &BinarySerializableConfig,
67-
) -> io::Result<Self> {
68-
<Self as BinarySerializable>::deserialize(reader)
69-
}
70-
}
71-
};
72-
}
73-
74-
impl_configurable_binary_serializable_by_calling_binary_serializable!(String);
75-
impl_configurable_binary_serializable_by_calling_binary_serializable!(u64);
76-
impl_configurable_binary_serializable_by_calling_binary_serializable!(i64);
77-
impl_configurable_binary_serializable_by_calling_binary_serializable!(f64);
78-
impl_configurable_binary_serializable_by_calling_binary_serializable!(Vec<u8>);
79-
impl_configurable_binary_serializable_by_calling_binary_serializable!(u128);
80-
impl_configurable_binary_serializable_by_calling_binary_serializable!(bool);
81-
impl_configurable_binary_serializable_by_calling_binary_serializable!(());
82-
impl_configurable_binary_serializable_by_calling_binary_serializable!(Cow<'_, str>);
83-
impl_configurable_binary_serializable_by_calling_binary_serializable!(Cow<'_, [u8]>);
84-
8528
/// Trait for a simple binary serialization.
8629
pub trait BinarySerializable: fmt::Debug + Sized {
8730
/// Serialize

src/schema/document/de.rs

Lines changed: 62 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ use std::net::Ipv6Addr;
1616
use std::sync::Arc;
1717

1818
use columnar::MonotonicallyMappableToU128;
19-
use common::{u64_to_f64, BinarySerializable, ConfigurableBinarySerializable, DateTime, VInt};
19+
use common::{u64_to_f64, BinarySerializable, DateTime, VInt};
2020

2121
use super::se::BinaryObjectSerializer;
2222
use super::{OwnedValue, Value};
2323
use crate::schema::document::type_codes;
2424
use crate::schema::{Facet, Field};
25-
use crate::store::doc_store_version_to_serialize_config;
25+
use crate::store::DocStoreVersion;
2626
use crate::tokenizer::PreTokenizedString;
2727

2828
#[derive(Debug, thiserror::Error, Clone)]
@@ -295,7 +295,7 @@ pub trait ObjectAccess<'de> {
295295
pub struct BinaryDocumentDeserializer<'de, R> {
296296
length: usize,
297297
position: usize,
298-
doc_store_version: u32,
298+
doc_store_version: DocStoreVersion,
299299
reader: &'de mut R,
300300
}
301301

@@ -305,7 +305,7 @@ where R: Read
305305
/// Attempts to create a new document deserializer from a given reader.
306306
pub(crate) fn from_reader(
307307
reader: &'de mut R,
308-
doc_store_version: u32,
308+
doc_store_version: DocStoreVersion,
309309
) -> Result<Self, DeserializeError> {
310310
let length = VInt::deserialize(reader)?;
311311

@@ -353,14 +353,17 @@ where R: Read
353353
pub struct BinaryValueDeserializer<'de, R> {
354354
value_type: ValueType,
355355
reader: &'de mut R,
356-
doc_store_version: u32,
356+
doc_store_version: DocStoreVersion,
357357
}
358358

359359
impl<'de, R> BinaryValueDeserializer<'de, R>
360360
where R: Read
361361
{
362362
/// Attempts to create a new value deserializer from a given reader.
363-
fn from_reader(reader: &'de mut R, doc_store_version: u32) -> Result<Self, DeserializeError> {
363+
fn from_reader(
364+
reader: &'de mut R,
365+
doc_store_version: DocStoreVersion,
366+
) -> Result<Self, DeserializeError> {
364367
let type_code = <u8 as BinarySerializable>::deserialize(reader)?;
365368

366369
let value_type = match type_code {
@@ -430,94 +433,66 @@ where R: Read
430433

431434
fn deserialize_string(self) -> Result<String, DeserializeError> {
432435
self.validate_type(ValueType::String)?;
433-
<String as ConfigurableBinarySerializable>::deserialize(
434-
self.reader,
435-
&doc_store_version_to_serialize_config(self.doc_store_version)?,
436-
)
437-
.map_err(DeserializeError::from)
436+
<String as BinarySerializable>::deserialize(self.reader).map_err(DeserializeError::from)
438437
}
439438

440439
fn deserialize_u64(self) -> Result<u64, DeserializeError> {
441440
self.validate_type(ValueType::U64)?;
442-
<u64 as ConfigurableBinarySerializable>::deserialize(
443-
self.reader,
444-
&doc_store_version_to_serialize_config(self.doc_store_version)?,
445-
)
446-
.map_err(DeserializeError::from)
441+
<u64 as BinarySerializable>::deserialize(self.reader).map_err(DeserializeError::from)
447442
}
448443

449444
fn deserialize_i64(self) -> Result<i64, DeserializeError> {
450445
self.validate_type(ValueType::I64)?;
451-
<i64 as ConfigurableBinarySerializable>::deserialize(
452-
self.reader,
453-
&doc_store_version_to_serialize_config(self.doc_store_version)?,
454-
)
455-
.map_err(DeserializeError::from)
446+
<i64 as BinarySerializable>::deserialize(self.reader).map_err(DeserializeError::from)
456447
}
457448

458449
fn deserialize_f64(self) -> Result<f64, DeserializeError> {
459450
self.validate_type(ValueType::F64)?;
460-
<u64 as ConfigurableBinarySerializable>::deserialize(
461-
self.reader,
462-
&doc_store_version_to_serialize_config(self.doc_store_version)?,
463-
)
464-
.map(u64_to_f64)
465-
.map_err(DeserializeError::from)
451+
<u64 as BinarySerializable>::deserialize(self.reader)
452+
.map(u64_to_f64)
453+
.map_err(DeserializeError::from)
466454
}
467455

468456
fn deserialize_datetime(self) -> Result<DateTime, DeserializeError> {
469457
self.validate_type(ValueType::DateTime)?;
470-
<DateTime as ConfigurableBinarySerializable>::deserialize(
471-
self.reader,
472-
&doc_store_version_to_serialize_config(self.doc_store_version)?,
473-
)
474-
.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+
}
475468
}
476469

477470
fn deserialize_facet(self) -> Result<Facet, DeserializeError> {
478471
self.validate_type(ValueType::Facet)?;
479-
<Facet as ConfigurableBinarySerializable>::deserialize(
480-
self.reader,
481-
&doc_store_version_to_serialize_config(self.doc_store_version)?,
482-
)
483-
.map_err(DeserializeError::from)
472+
<Facet as BinarySerializable>::deserialize(self.reader).map_err(DeserializeError::from)
484473
}
485474

486475
fn deserialize_bytes(self) -> Result<Vec<u8>, DeserializeError> {
487476
self.validate_type(ValueType::Bytes)?;
488-
<Vec<u8> as ConfigurableBinarySerializable>::deserialize(
489-
self.reader,
490-
&doc_store_version_to_serialize_config(self.doc_store_version)?,
491-
)
492-
.map_err(DeserializeError::from)
477+
<Vec<u8> as BinarySerializable>::deserialize(self.reader).map_err(DeserializeError::from)
493478
}
494479

495480
fn deserialize_ip_address(self) -> Result<Ipv6Addr, DeserializeError> {
496481
self.validate_type(ValueType::IpAddr)?;
497-
<u128 as ConfigurableBinarySerializable>::deserialize(
498-
self.reader,
499-
&doc_store_version_to_serialize_config(self.doc_store_version)?,
500-
)
501-
.map(Ipv6Addr::from_u128)
502-
.map_err(DeserializeError::from)
482+
<u128 as BinarySerializable>::deserialize(self.reader)
483+
.map(Ipv6Addr::from_u128)
484+
.map_err(DeserializeError::from)
503485
}
504486

505487
fn deserialize_bool(self) -> Result<bool, DeserializeError> {
506488
self.validate_type(ValueType::Bool)?;
507-
<bool as ConfigurableBinarySerializable>::deserialize(
508-
self.reader,
509-
&doc_store_version_to_serialize_config(self.doc_store_version)?,
510-
)
511-
.map_err(DeserializeError::from)
489+
<bool as BinarySerializable>::deserialize(self.reader).map_err(DeserializeError::from)
512490
}
513491

514492
fn deserialize_pre_tokenized_string(self) -> Result<PreTokenizedString, DeserializeError> {
515493
self.validate_type(ValueType::PreTokStr)?;
516-
<PreTokenizedString as ConfigurableBinarySerializable>::deserialize(
517-
self.reader,
518-
&doc_store_version_to_serialize_config(self.doc_store_version)?,
519-
)
520-
.map_err(DeserializeError::from)
494+
<PreTokenizedString as BinarySerializable>::deserialize(self.reader)
495+
.map_err(DeserializeError::from)
521496
}
522497

523498
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, DeserializeError>
@@ -605,14 +580,17 @@ pub struct BinaryArrayDeserializer<'de, R> {
605580
length: usize,
606581
position: usize,
607582
reader: &'de mut R,
608-
doc_store_version: u32,
583+
doc_store_version: DocStoreVersion,
609584
}
610585

611586
impl<'de, R> BinaryArrayDeserializer<'de, R>
612587
where R: Read
613588
{
614589
/// Attempts to create a new array deserializer from a given reader.
615-
fn from_reader(reader: &'de mut R, doc_store_version: u32) -> Result<Self, DeserializeError> {
590+
fn from_reader(
591+
reader: &'de mut R,
592+
doc_store_version: DocStoreVersion,
593+
) -> Result<Self, DeserializeError> {
616594
let length = <VInt as BinarySerializable>::deserialize(reader)?;
617595

618596
Ok(Self {
@@ -667,7 +645,10 @@ impl<'de, R> BinaryObjectDeserializer<'de, R>
667645
where R: Read
668646
{
669647
/// Attempts to create a new object deserializer from a given reader.
670-
fn from_reader(reader: &'de mut R, doc_store_version: u32) -> Result<Self, DeserializeError> {
648+
fn from_reader(
649+
reader: &'de mut R,
650+
doc_store_version: DocStoreVersion,
651+
) -> Result<Self, DeserializeError> {
671652
let inner = BinaryArrayDeserializer::from_reader(reader, doc_store_version)?;
672653
Ok(Self { inner })
673654
}
@@ -887,6 +868,15 @@ mod tests {
887868
writer
888869
}
889870

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+
890880
fn deserialize_value(buffer: Vec<u8>) -> crate::schema::OwnedValue {
891881
let mut cursor = Cursor::new(buffer);
892882
let deserializer =
@@ -1069,6 +1059,17 @@ mod tests {
10691059
assert_eq!(value, expected_val);
10701060
}
10711061

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+
10721073
#[test]
10731074
fn test_nested_serialize() {
10741075
let mut object = serde_json::Map::new();

0 commit comments

Comments
 (0)