From 645bab774843b5bdd4394b188b5f9d5da81e7ff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Renault?= Date: Fri, 19 Apr 2019 18:03:32 +0200 Subject: [PATCH] feat: Index documents using the Serializer struct --- meilidb-core/src/query_builder.rs | 2 +- ...extract_string.rs => convert_to_string.rs} | 88 ++++--- meilidb-data/src/serde/extract_document_id.rs | 32 +-- meilidb-data/src/serde/indexer.rs | 233 ++++++++++++++++++ meilidb-data/src/serde/mod.rs | 25 +- meilidb-data/src/serde/serializer.rs | 56 +++-- 6 files changed, 363 insertions(+), 73 deletions(-) rename meilidb-data/src/serde/{extract_string.rs => convert_to_string.rs} (53%) create mode 100644 meilidb-data/src/serde/indexer.rs diff --git a/meilidb-core/src/query_builder.rs b/meilidb-core/src/query_builder.rs index 4d2327871..ad7de9c15 100644 --- a/meilidb-core/src/query_builder.rs +++ b/meilidb-core/src/query_builder.rs @@ -94,7 +94,7 @@ where I: Deref, let stream = self.index.map.search(automaton); op_builder.push(stream); } - op_builder.union() + op_builder.r#union() }; let mut matches = Vec::new(); diff --git a/meilidb-data/src/serde/extract_string.rs b/meilidb-data/src/serde/convert_to_string.rs similarity index 53% rename from meilidb-data/src/serde/extract_string.rs rename to meilidb-data/src/serde/convert_to_string.rs index 9c3ef25e5..67e592e78 100644 --- a/meilidb-data/src/serde/extract_string.rs +++ b/meilidb-data/src/serde/convert_to_string.rs @@ -3,9 +3,9 @@ use serde::ser; use super::SerializerError; -pub struct ExtractString; +pub struct ConvertToString; -impl ser::Serializer for ExtractString { +impl ser::Serializer for ConvertToString { type Ok = String; type Error = SerializerError; type SerializeSeq = ser::Impossible; @@ -16,22 +16,52 @@ impl ser::Serializer for ExtractString { type SerializeStruct = ser::Impossible; type SerializeStructVariant = ser::Impossible; - forward_to_unserializable_type! { - bool => serialize_bool, - char => serialize_char, + fn serialize_bool(self, value: bool) -> Result { + Err(SerializerError::UnserializableType { type_name: "boolean" }) + } - i8 => serialize_i8, - i16 => serialize_i16, - i32 => serialize_i32, - i64 => serialize_i64, + fn serialize_char(self, value: char) -> Result { + Ok(value.to_string()) + } - u8 => serialize_u8, - u16 => serialize_u16, - u32 => serialize_u32, - u64 => serialize_u64, + fn serialize_i8(self, value: i8) -> Result { + Ok(value.to_string()) + } - f32 => serialize_f32, - f64 => serialize_f64, + fn serialize_i16(self, value: i16) -> Result { + Ok(value.to_string()) + } + + fn serialize_i32(self, value: i32) -> Result { + Ok(value.to_string()) + } + + fn serialize_i64(self, value: i64) -> Result { + Ok(value.to_string()) + } + + fn serialize_u8(self, value: u8) -> Result { + Ok(value.to_string()) + } + + fn serialize_u16(self, value: u16) -> Result { + Ok(value.to_string()) + } + + fn serialize_u32(self, value: u32) -> Result { + Ok(value.to_string()) + } + + fn serialize_u64(self, value: u64) -> Result { + Ok(value.to_string()) + } + + fn serialize_f32(self, value: f32) -> Result { + Ok(value.to_string()) + } + + fn serialize_f64(self, value: f64) -> Result { + Ok(value.to_string()) } fn serialize_str(self, value: &str) -> Result { @@ -39,25 +69,25 @@ impl ser::Serializer for ExtractString { } fn serialize_bytes(self, _v: &[u8]) -> Result { - Err(SerializerError::UnserializableType { name: "&[u8]" }) + Err(SerializerError::UnserializableType { type_name: "&[u8]" }) } fn serialize_none(self) -> Result { - Err(SerializerError::UnserializableType { name: "Option" }) + Err(SerializerError::UnserializableType { type_name: "Option" }) } fn serialize_some(self, _value: &T) -> Result where T: Serialize, { - Err(SerializerError::UnserializableType { name: "Option" }) + Err(SerializerError::UnserializableType { type_name: "Option" }) } fn serialize_unit(self) -> Result { - Err(SerializerError::UnserializableType { name: "()" }) + Err(SerializerError::UnserializableType { type_name: "()" }) } fn serialize_unit_struct(self, _name: &'static str) -> Result { - Err(SerializerError::UnserializableType { name: "unit struct" }) + Err(SerializerError::UnserializableType { type_name: "unit struct" }) } fn serialize_unit_variant( @@ -67,7 +97,7 @@ impl ser::Serializer for ExtractString { _variant: &'static str ) -> Result { - Err(SerializerError::UnserializableType { name: "unit variant" }) + Err(SerializerError::UnserializableType { type_name: "unit variant" }) } fn serialize_newtype_struct( @@ -89,15 +119,15 @@ impl ser::Serializer for ExtractString { ) -> Result where T: Serialize, { - Err(SerializerError::UnserializableType { name: "newtype variant" }) + Err(SerializerError::UnserializableType { type_name: "newtype variant" }) } fn serialize_seq(self, _len: Option) -> Result { - Err(SerializerError::UnserializableType { name: "sequence" }) + Err(SerializerError::UnserializableType { type_name: "sequence" }) } fn serialize_tuple(self, _len: usize) -> Result { - Err(SerializerError::UnserializableType { name: "tuple" }) + Err(SerializerError::UnserializableType { type_name: "tuple" }) } fn serialize_tuple_struct( @@ -106,7 +136,7 @@ impl ser::Serializer for ExtractString { _len: usize ) -> Result { - Err(SerializerError::UnserializableType { name: "tuple struct" }) + Err(SerializerError::UnserializableType { type_name: "tuple struct" }) } fn serialize_tuple_variant( @@ -117,11 +147,11 @@ impl ser::Serializer for ExtractString { _len: usize ) -> Result { - Err(SerializerError::UnserializableType { name: "tuple variant" }) + Err(SerializerError::UnserializableType { type_name: "tuple variant" }) } fn serialize_map(self, _len: Option) -> Result { - Err(SerializerError::UnserializableType { name: "map" }) + Err(SerializerError::UnserializableType { type_name: "map" }) } fn serialize_struct( @@ -130,7 +160,7 @@ impl ser::Serializer for ExtractString { _len: usize ) -> Result { - Err(SerializerError::UnserializableType { name: "struct" }) + Err(SerializerError::UnserializableType { type_name: "struct" }) } fn serialize_struct_variant( @@ -141,6 +171,6 @@ impl ser::Serializer for ExtractString { _len: usize ) -> Result { - Err(SerializerError::UnserializableType { name: "struct variant" }) + Err(SerializerError::UnserializableType { type_name: "struct variant" }) } } diff --git a/meilidb-data/src/serde/extract_document_id.rs b/meilidb-data/src/serde/extract_document_id.rs index 5310da538..d7c6bb195 100644 --- a/meilidb-data/src/serde/extract_document_id.rs +++ b/meilidb-data/src/serde/extract_document_id.rs @@ -5,7 +5,7 @@ use meilidb_core::DocumentId; use serde::Serialize; use serde::ser; -use super::{SerializerError, ExtractString}; +use super::{SerializerError, ConvertToString}; pub fn extract_document_id( identifier: &str, @@ -57,29 +57,29 @@ impl<'a> ser::Serializer for ExtractDocumentId<'a> { } fn serialize_str(self, value: &str) -> Result { - Err(SerializerError::UnserializableType { name: "str" }) + Err(SerializerError::UnserializableType { type_name: "str" }) } fn serialize_bytes(self, _v: &[u8]) -> Result { - Err(SerializerError::UnserializableType { name: "&[u8]" }) + Err(SerializerError::UnserializableType { type_name: "&[u8]" }) } fn serialize_none(self) -> Result { - Err(SerializerError::UnserializableType { name: "Option" }) + Err(SerializerError::UnserializableType { type_name: "Option" }) } fn serialize_some(self, _value: &T) -> Result where T: Serialize, { - Err(SerializerError::UnserializableType { name: "Option" }) + Err(SerializerError::UnserializableType { type_name: "Option" }) } fn serialize_unit(self) -> Result { - Err(SerializerError::UnserializableType { name: "()" }) + Err(SerializerError::UnserializableType { type_name: "()" }) } fn serialize_unit_struct(self, _name: &'static str) -> Result { - Err(SerializerError::UnserializableType { name: "unit struct" }) + Err(SerializerError::UnserializableType { type_name: "unit struct" }) } fn serialize_unit_variant( @@ -89,7 +89,7 @@ impl<'a> ser::Serializer for ExtractDocumentId<'a> { _variant: &'static str ) -> Result { - Err(SerializerError::UnserializableType { name: "unit variant" }) + Err(SerializerError::UnserializableType { type_name: "unit variant" }) } fn serialize_newtype_struct( @@ -111,15 +111,15 @@ impl<'a> ser::Serializer for ExtractDocumentId<'a> { ) -> Result where T: Serialize, { - Err(SerializerError::UnserializableType { name: "newtype variant" }) + Err(SerializerError::UnserializableType { type_name: "newtype variant" }) } fn serialize_seq(self, _len: Option) -> Result { - Err(SerializerError::UnserializableType { name: "sequence" }) + Err(SerializerError::UnserializableType { type_name: "sequence" }) } fn serialize_tuple(self, _len: usize) -> Result { - Err(SerializerError::UnserializableType { name: "tuple" }) + Err(SerializerError::UnserializableType { type_name: "tuple" }) } fn serialize_tuple_struct( @@ -128,7 +128,7 @@ impl<'a> ser::Serializer for ExtractDocumentId<'a> { _len: usize ) -> Result { - Err(SerializerError::UnserializableType { name: "tuple struct" }) + Err(SerializerError::UnserializableType { type_name: "tuple struct" }) } fn serialize_tuple_variant( @@ -139,7 +139,7 @@ impl<'a> ser::Serializer for ExtractDocumentId<'a> { _len: usize ) -> Result { - Err(SerializerError::UnserializableType { name: "tuple variant" }) + Err(SerializerError::UnserializableType { type_name: "tuple variant" }) } fn serialize_map(self, _len: Option) -> Result { @@ -174,7 +174,7 @@ impl<'a> ser::Serializer for ExtractDocumentId<'a> { _len: usize ) -> Result { - Err(SerializerError::UnserializableType { name: "struct variant" }) + Err(SerializerError::UnserializableType { type_name: "struct variant" }) } } @@ -191,7 +191,7 @@ impl<'a> ser::SerializeMap for ExtractDocumentIdMapSerializer<'a> { fn serialize_key(&mut self, key: &T) -> Result<(), Self::Error> where T: Serialize, { - let key = key.serialize(ExtractString)?; + let key = key.serialize(ConvertToString)?; self.current_key_name = Some(key); Ok(()) } @@ -210,7 +210,7 @@ impl<'a> ser::SerializeMap for ExtractDocumentIdMapSerializer<'a> { ) -> Result<(), Self::Error> where K: Serialize, V: Serialize, { - let key = key.serialize(ExtractString)?; + let key = key.serialize(ConvertToString)?; if self.identifier == key { // TODO is it possible to have multiple ids? diff --git a/meilidb-data/src/serde/indexer.rs b/meilidb-data/src/serde/indexer.rs new file mode 100644 index 000000000..b8eb6c599 --- /dev/null +++ b/meilidb-data/src/serde/indexer.rs @@ -0,0 +1,233 @@ +use meilidb_core::DocumentId; +use serde::ser; +use serde::Serialize; + +use crate::database::RawIndex; +use crate::indexer::Indexer as RawIndexer; +use crate::schema::SchemaAttr; +use super::{SerializerError, ConvertToString}; + +pub struct Indexer<'a> { + pub attribute: SchemaAttr, + pub indexer: &'a mut RawIndexer, + pub document_id: DocumentId, +} + +impl<'a> ser::Serializer for Indexer<'a> { + type Ok = (); + type Error = SerializerError; + type SerializeSeq = SeqIndexer<'a>; + type SerializeTuple = ser::Impossible; + type SerializeTupleStruct = ser::Impossible; + type SerializeTupleVariant = ser::Impossible; + type SerializeMap = ser::Impossible; + type SerializeStruct = ser::Impossible; + type SerializeStructVariant = ser::Impossible; + + fn serialize_bool(self, value: bool) -> Result { + Err(SerializerError::UnindexableType { type_name: "boolean" }) + } + + fn serialize_char(self, value: char) -> Result { + let text = value.serialize(ConvertToString)?; + self.serialize_str(&text) + } + + fn serialize_i8(self, value: i8) -> Result { + let text = value.serialize(ConvertToString)?; + self.serialize_str(&text) + } + + fn serialize_i16(self, value: i16) -> Result { + let text = value.serialize(ConvertToString)?; + self.serialize_str(&text) + } + + fn serialize_i32(self, value: i32) -> Result { + let text = value.serialize(ConvertToString)?; + self.serialize_str(&text) + } + + fn serialize_i64(self, value: i64) -> Result { + let text = value.serialize(ConvertToString)?; + self.serialize_str(&text) + } + + fn serialize_u8(self, value: u8) -> Result { + let text = value.serialize(ConvertToString)?; + self.serialize_str(&text) + } + + fn serialize_u16(self, value: u16) -> Result { + let text = value.serialize(ConvertToString)?; + self.serialize_str(&text) + } + + fn serialize_u32(self, value: u32) -> Result { + let text = value.serialize(ConvertToString)?; + self.serialize_str(&text) + } + + fn serialize_u64(self, value: u64) -> Result { + let text = value.serialize(ConvertToString)?; + self.serialize_str(&text) + } + + fn serialize_f32(self, value: f32) -> Result { + let text = value.serialize(ConvertToString)?; + self.serialize_str(&text) + } + + fn serialize_f64(self, value: f64) -> Result { + let text = value.serialize(ConvertToString)?; + self.serialize_str(&text) + } + + fn serialize_str(self, text: &str) -> Result { + self.indexer.index_text(self.document_id, self.attribute, text); + Ok(()) + } + + fn serialize_bytes(self, _v: &[u8]) -> Result { + Err(SerializerError::UnindexableType { type_name: "&[u8]" }) + } + + fn serialize_none(self) -> Result { + Err(SerializerError::UnindexableType { type_name: "Option" }) + } + + fn serialize_some(self, value: &T) -> Result + where T: ser::Serialize, + { + let text = value.serialize(ConvertToString)?; + self.indexer.index_text(self.document_id, self.attribute, &text); + Ok(()) + } + + fn serialize_unit(self) -> Result { + Err(SerializerError::UnindexableType { type_name: "()" }) + } + + fn serialize_unit_struct(self, _name: &'static str) -> Result { + Err(SerializerError::UnindexableType { type_name: "unit struct" }) + } + + fn serialize_unit_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str + ) -> Result + { + Err(SerializerError::UnindexableType { type_name: "unit variant" }) + } + + fn serialize_newtype_struct( + self, + _name: &'static str, + value: &T + ) -> Result + where T: ser::Serialize, + { + value.serialize(self) + } + + fn serialize_newtype_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + _value: &T + ) -> Result + where T: ser::Serialize, + { + Err(SerializerError::UnindexableType { type_name: "newtype variant" }) + } + + fn serialize_seq(self, _len: Option) -> Result { + let indexer = SeqIndexer { + attribute: self.attribute, + document_id: self.document_id, + indexer: self.indexer, + texts: Vec::new(), + }; + + Ok(indexer) + } + + fn serialize_tuple(self, _len: usize) -> Result { + Err(SerializerError::UnindexableType { type_name: "tuple" }) + } + + fn serialize_tuple_struct( + self, + _name: &'static str, + _len: usize + ) -> Result + { + Err(SerializerError::UnindexableType { type_name: "tuple struct" }) + } + + fn serialize_tuple_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + _len: usize + ) -> Result + { + Err(SerializerError::UnindexableType { type_name: "tuple variant" }) + } + + fn serialize_map(self, _len: Option) -> Result { + Err(SerializerError::UnindexableType { type_name: "map" }) + } + + fn serialize_struct( + self, + _name: &'static str, + _len: usize + ) -> Result + { + Err(SerializerError::UnindexableType { type_name: "struct" }) + } + + fn serialize_struct_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + _len: usize + ) -> Result + { + Err(SerializerError::UnindexableType { type_name: "struct variant" }) + } +} + +pub struct SeqIndexer<'a> { + attribute: SchemaAttr, + document_id: DocumentId, + indexer: &'a mut RawIndexer, + texts: Vec, +} + +impl<'a> ser::SerializeSeq for SeqIndexer<'a> { + type Ok = (); + type Error = SerializerError; + + fn serialize_element(&mut self, value: &T) -> Result<(), Self::Error> + where T: ser::Serialize + { + let text = value.serialize(ConvertToString)?; + self.texts.push(text); + + Ok(()) + } + + fn end(mut self) -> Result { + let texts = self.texts.iter().map(String::as_str); + self.indexer.index_text_seq(self.document_id, self.attribute, texts); + + Ok(()) + } +} diff --git a/meilidb-data/src/serde/mod.rs b/meilidb-data/src/serde/mod.rs index cf85e60be..94e3172dd 100644 --- a/meilidb-data/src/serde/mod.rs +++ b/meilidb-data/src/serde/mod.rs @@ -2,21 +2,23 @@ macro_rules! forward_to_unserializable_type { ($($ty:ident => $se_method:ident,)*) => { $( fn $se_method(self, _v: $ty) -> Result { - Err(SerializerError::UnserializableType { name: "$ty" }) + Err(SerializerError::UnserializableType { type_name: "$ty" }) } )* } } mod deserializer; -mod serializer; -mod extract_string; mod extract_document_id; +mod convert_to_string; +mod indexer; +mod serializer; pub use self::deserializer::Deserializer; -pub use self::serializer::Serializer; -pub use self::extract_string::ExtractString; pub use self::extract_document_id::extract_document_id; +pub use self::convert_to_string::ConvertToString; +pub use self::indexer::Indexer; +pub use self::serializer::Serializer; use std::{fmt, error::Error}; use rmp_serde::encode::Error as RmpError; @@ -27,7 +29,8 @@ pub enum SerializerError { DocumentIdNotFound, RmpError(RmpError), SledError(sled::Error), - UnserializableType { name: &'static str }, + UnserializableType { type_name: &'static str }, + UnindexableType { type_name: &'static str }, Custom(String), } @@ -45,11 +48,13 @@ impl fmt::Display for SerializerError { } SerializerError::RmpError(e) => write!(f, "rmp serde related error: {}", e), SerializerError::SledError(e) => write!(f, "sled related error: {}", e), - SerializerError::UnserializableType { name } => { - write!(f, "Only struct and map types are considered valid documents and - can be serialized, not {} types directly.", name) + SerializerError::UnserializableType { type_name } => { + write!(f, "{} are not a serializable type", type_name) }, - SerializerError::Custom(s) => f.write_str(&s), + SerializerError::UnindexableType { type_name } => { + write!(f, "{} are not an indexable type", type_name) + }, + SerializerError::Custom(s) => f.write_str(s), } } } diff --git a/meilidb-data/src/serde/serializer.rs b/meilidb-data/src/serde/serializer.rs index 9be35c2dc..34adaa326 100644 --- a/meilidb-data/src/serde/serializer.rs +++ b/meilidb-data/src/serde/serializer.rs @@ -1,13 +1,15 @@ use meilidb_core::DocumentId; use serde::ser; -use crate::schema::Schema; use crate::database::RawIndex; -use super::{SerializerError, ExtractString}; +use crate::indexer::Indexer as RawIndexer; +use crate::schema::{Schema, SchemaAttr}; +use super::{SerializerError, ConvertToString, Indexer}; pub struct Serializer<'a> { pub schema: &'a Schema, pub index: &'a RawIndex, + pub indexer: &'a mut RawIndexer, pub document_id: DocumentId, } @@ -41,29 +43,29 @@ impl<'a> ser::Serializer for Serializer<'a> { } fn serialize_str(self, _v: &str) -> Result { - Err(SerializerError::UnserializableType { name: "str" }) + Err(SerializerError::UnserializableType { type_name: "str" }) } fn serialize_bytes(self, _v: &[u8]) -> Result { - Err(SerializerError::UnserializableType { name: "&[u8]" }) + Err(SerializerError::UnserializableType { type_name: "&[u8]" }) } fn serialize_none(self) -> Result { - Err(SerializerError::UnserializableType { name: "Option" }) + Err(SerializerError::UnserializableType { type_name: "Option" }) } fn serialize_some(self, _value: &T) -> Result where T: ser::Serialize, { - Err(SerializerError::UnserializableType { name: "Option" }) + Err(SerializerError::UnserializableType { type_name: "Option" }) } fn serialize_unit(self) -> Result { - Err(SerializerError::UnserializableType { name: "()" }) + Err(SerializerError::UnserializableType { type_name: "()" }) } fn serialize_unit_struct(self, _name: &'static str) -> Result { - Err(SerializerError::UnserializableType { name: "unit struct" }) + Err(SerializerError::UnserializableType { type_name: "unit struct" }) } fn serialize_unit_variant( @@ -73,7 +75,7 @@ impl<'a> ser::Serializer for Serializer<'a> { _variant: &'static str ) -> Result { - Err(SerializerError::UnserializableType { name: "unit variant" }) + Err(SerializerError::UnserializableType { type_name: "unit variant" }) } fn serialize_newtype_struct( @@ -95,15 +97,15 @@ impl<'a> ser::Serializer for Serializer<'a> { ) -> Result where T: ser::Serialize, { - Err(SerializerError::UnserializableType { name: "newtype variant" }) + Err(SerializerError::UnserializableType { type_name: "newtype variant" }) } fn serialize_seq(self, _len: Option) -> Result { - Err(SerializerError::UnserializableType { name: "sequence" }) + Err(SerializerError::UnserializableType { type_name: "sequence" }) } fn serialize_tuple(self, _len: usize) -> Result { - Err(SerializerError::UnserializableType { name: "tuple" }) + Err(SerializerError::UnserializableType { type_name: "tuple" }) } fn serialize_tuple_struct( @@ -112,7 +114,7 @@ impl<'a> ser::Serializer for Serializer<'a> { _len: usize ) -> Result { - Err(SerializerError::UnserializableType { name: "tuple struct" }) + Err(SerializerError::UnserializableType { type_name: "tuple struct" }) } fn serialize_tuple_variant( @@ -123,7 +125,7 @@ impl<'a> ser::Serializer for Serializer<'a> { _len: usize ) -> Result { - Err(SerializerError::UnserializableType { name: "tuple variant" }) + Err(SerializerError::UnserializableType { type_name: "tuple variant" }) } fn serialize_map(self, _len: Option) -> Result { @@ -131,6 +133,7 @@ impl<'a> ser::Serializer for Serializer<'a> { schema: self.schema, document_id: self.document_id, index: self.index, + indexer: self.indexer, current_key_name: None, }) } @@ -145,6 +148,7 @@ impl<'a> ser::Serializer for Serializer<'a> { schema: self.schema, document_id: self.document_id, index: self.index, + indexer: self.indexer, }) } @@ -156,7 +160,7 @@ impl<'a> ser::Serializer for Serializer<'a> { _len: usize ) -> Result { - Err(SerializerError::UnserializableType { name: "struct variant" }) + Err(SerializerError::UnserializableType { type_name: "struct variant" }) } } @@ -164,6 +168,7 @@ pub struct MapSerializer<'a> { pub schema: &'a Schema, pub document_id: DocumentId, pub index: &'a RawIndex, + pub indexer: &'a mut RawIndexer, pub current_key_name: Option, } @@ -174,7 +179,7 @@ impl<'a> ser::SerializeMap for MapSerializer<'a> { fn serialize_key(&mut self, key: &T) -> Result<(), Self::Error> where T: ser::Serialize, { - let key = key.serialize(ExtractString)?; + let key = key.serialize(ConvertToString)?; self.current_key_name = Some(key); Ok(()) } @@ -193,12 +198,13 @@ impl<'a> ser::SerializeMap for MapSerializer<'a> { ) -> Result<(), Self::Error> where K: ser::Serialize, V: ser::Serialize, { - let key = key.serialize(ExtractString)?; + let key = key.serialize(ConvertToString)?; serialize_value( self.schema, self.document_id, self.index, + self.indexer, &key, value, ) @@ -213,6 +219,7 @@ pub struct StructSerializer<'a> { pub schema: &'a Schema, pub document_id: DocumentId, pub index: &'a RawIndex, + pub indexer: &'a mut RawIndexer, } impl<'a> ser::SerializeStruct for StructSerializer<'a> { @@ -230,6 +237,7 @@ impl<'a> ser::SerializeStruct for StructSerializer<'a> { self.schema, self.document_id, self.index, + self.indexer, key, value, ) @@ -244,6 +252,7 @@ fn serialize_value( schema: &Schema, document_id: DocumentId, index: &RawIndex, + indexer: &mut RawIndexer, key: &str, value: &T, ) -> Result<(), SerializerError> @@ -256,6 +265,19 @@ where T: ser::Serialize, let value = rmp_serde::to_vec_named(value)?; index.set_document_attribute(document_id, attr, value)?; } + + if props.is_indexed() { + let indexer = Indexer { + attribute: attr, + indexer: indexer, + document_id: document_id, + }; + value.serialize(indexer)?; + } + + if props.is_ranked() { + unimplemented!() + } } Ok(())