From 9e2cbe3362710120833c7ba8491cdff3a9b0225c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Renault?= Date: Wed, 18 Nov 2020 18:40:08 +0100 Subject: [PATCH] Improve the FacetLevelF64 serialization --- .../facet/facet_level_value_f64_codec.rs | 56 +++++++++++++------ 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/src/heed_codec/facet/facet_level_value_f64_codec.rs b/src/heed_codec/facet/facet_level_value_f64_codec.rs index 55fd4b132..1ee8e6bf3 100644 --- a/src/heed_codec/facet/facet_level_value_f64_codec.rs +++ b/src/heed_codec/facet/facet_level_value_f64_codec.rs @@ -13,8 +13,14 @@ impl<'a> heed::BytesDecode<'a> for FacetLevelValueF64Codec { let (field_id, bytes) = bytes.split_first()?; let (level, bytes) = bytes.split_first()?; - let left = bytes[16..24].try_into().ok().map(f64::from_be_bytes)?; - let right = bytes[24..].try_into().ok().map(f64::from_be_bytes)?; + let (left, right) = if *level != 0 { + let left = bytes[16..24].try_into().ok().map(f64::from_be_bytes)?; + let right = bytes[24..].try_into().ok().map(f64::from_be_bytes)?; + (left, right) + } else { + let left = bytes[8..].try_into().ok().map(f64::from_be_bytes)?; + (left, left) + }; Some((*field_id, *level, left, right)) } @@ -26,24 +32,38 @@ impl heed::BytesEncode<'_> for FacetLevelValueF64Codec { fn bytes_encode((field_id, level, left, right): &Self::EItem) -> Option> { let mut buffer = [0u8; 32]; - // Write the globally ordered floats. - let bytes = f64_into_bytes(*left)?; - buffer[..8].copy_from_slice(&bytes[..]); + let len = if *level != 0 { + // Write the globally ordered floats. + let bytes = f64_into_bytes(*left)?; + buffer[..8].copy_from_slice(&bytes[..]); - let bytes = f64_into_bytes(*right)?; - buffer[8..16].copy_from_slice(&bytes[..]); + let bytes = f64_into_bytes(*right)?; + buffer[8..16].copy_from_slice(&bytes[..]); - // Then the f64 values just to be able to read them back. - let bytes = left.to_be_bytes(); - buffer[16..24].copy_from_slice(&bytes[..]); + // Then the f64 values just to be able to read them back. + let bytes = left.to_be_bytes(); + buffer[16..24].copy_from_slice(&bytes[..]); - let bytes = right.to_be_bytes(); - buffer[24..].copy_from_slice(&bytes[..]); + let bytes = right.to_be_bytes(); + buffer[24..].copy_from_slice(&bytes[..]); - let mut bytes = Vec::with_capacity(buffer.len() + 2); + 32 // length + } else { + // Write the globally ordered floats. + let bytes = f64_into_bytes(*left)?; + buffer[..8].copy_from_slice(&bytes[..]); + + // Then the f64 values just to be able to read them back. + let bytes = left.to_be_bytes(); + buffer[8..16].copy_from_slice(&bytes[..]); + + 16 // length + }; + + let mut bytes = Vec::with_capacity(len + 2); bytes.push(*field_id); bytes.push(*level); - bytes.extend_from_slice(&buffer[..]); + bytes.extend_from_slice(&buffer[..len]); Some(Cow::Owned(bytes)) } } @@ -55,8 +75,12 @@ mod tests { #[test] fn globally_ordered_f64() { - let bytes = FacetLevelValueF64Codec::bytes_encode(&(3, 0, -32.0, 32.0)).unwrap(); + let bytes = FacetLevelValueF64Codec::bytes_encode(&(3, 0, 32.0, 0.0)).unwrap(); let (name, level, left, right) = FacetLevelValueF64Codec::bytes_decode(&bytes).unwrap(); - assert_eq!((name, level, left, right), (3, 0, -32.0, 32.0)); + assert_eq!((name, level, left, right), (3, 0, 32.0, 32.0)); + + let bytes = FacetLevelValueF64Codec::bytes_encode(&(3, 1, -32.0, 32.0)).unwrap(); + let (name, level, left, right) = FacetLevelValueF64Codec::bytes_decode(&bytes).unwrap(); + assert_eq!((name, level, left, right), (3, 1, -32.0, 32.0)); } }