mirror of
https://github.com/meilisearch/meilisearch.git
synced 2024-11-27 04:25:06 +08:00
feat: Index words of structs, maps and tuples
This commit is contained in:
parent
645bab7748
commit
ad24ef8a25
@ -17,11 +17,11 @@ impl<'a> ser::Serializer for Indexer<'a> {
|
|||||||
type Ok = ();
|
type Ok = ();
|
||||||
type Error = SerializerError;
|
type Error = SerializerError;
|
||||||
type SerializeSeq = SeqIndexer<'a>;
|
type SerializeSeq = SeqIndexer<'a>;
|
||||||
type SerializeTuple = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeTuple = TupleIndexer<'a>;
|
||||||
type SerializeTupleStruct = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeTupleStruct = ser::Impossible<Self::Ok, Self::Error>;
|
||||||
type SerializeTupleVariant = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeTupleVariant = ser::Impossible<Self::Ok, Self::Error>;
|
||||||
type SerializeMap = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeMap = MapIndexer<'a>;
|
||||||
type SerializeStruct = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeStruct = StructSerializer<'a>;
|
||||||
type SerializeStructVariant = ser::Impossible<Self::Ok, Self::Error>;
|
type SerializeStructVariant = ser::Impossible<Self::Ok, Self::Error>;
|
||||||
|
|
||||||
fn serialize_bool(self, value: bool) -> Result<Self::Ok, Self::Error> {
|
fn serialize_bool(self, value: bool) -> Result<Self::Ok, Self::Error> {
|
||||||
@ -156,7 +156,14 @@ impl<'a> ser::Serializer for Indexer<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
|
fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
|
||||||
Err(SerializerError::UnindexableType { type_name: "tuple" })
|
let indexer = TupleIndexer {
|
||||||
|
attribute: self.attribute,
|
||||||
|
document_id: self.document_id,
|
||||||
|
indexer: self.indexer,
|
||||||
|
texts: Vec::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(indexer)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_tuple_struct(
|
fn serialize_tuple_struct(
|
||||||
@ -180,7 +187,14 @@ impl<'a> ser::Serializer for Indexer<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
|
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
|
||||||
Err(SerializerError::UnindexableType { type_name: "map" })
|
let indexer = MapIndexer {
|
||||||
|
attribute: self.attribute,
|
||||||
|
document_id: self.document_id,
|
||||||
|
indexer: self.indexer,
|
||||||
|
texts: Vec::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(indexer)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_struct(
|
fn serialize_struct(
|
||||||
@ -220,14 +234,104 @@ impl<'a> ser::SerializeSeq for SeqIndexer<'a> {
|
|||||||
{
|
{
|
||||||
let text = value.serialize(ConvertToString)?;
|
let text = value.serialize(ConvertToString)?;
|
||||||
self.texts.push(text);
|
self.texts.push(text);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn end(mut self) -> Result<Self::Ok, Self::Error> {
|
fn end(mut self) -> Result<Self::Ok, Self::Error> {
|
||||||
let texts = self.texts.iter().map(String::as_str);
|
let texts = self.texts.iter().map(String::as_str);
|
||||||
self.indexer.index_text_seq(self.document_id, self.attribute, texts);
|
self.indexer.index_text_seq(self.document_id, self.attribute, texts);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct MapIndexer<'a> {
|
||||||
|
attribute: SchemaAttr,
|
||||||
|
document_id: DocumentId,
|
||||||
|
indexer: &'a mut RawIndexer,
|
||||||
|
texts: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> ser::SerializeMap for MapIndexer<'a> {
|
||||||
|
type Ok = ();
|
||||||
|
type Error = SerializerError;
|
||||||
|
|
||||||
|
fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
|
||||||
|
where T: ser::Serialize,
|
||||||
|
{
|
||||||
|
let text = key.serialize(ConvertToString)?;
|
||||||
|
self.texts.push(text);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
|
||||||
|
where T: ser::Serialize,
|
||||||
|
{
|
||||||
|
let text = value.serialize(ConvertToString)?;
|
||||||
|
self.texts.push(text);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(self) -> Result<Self::Ok, Self::Error> {
|
||||||
|
let texts = self.texts.iter().map(String::as_str);
|
||||||
|
self.indexer.index_text_seq(self.document_id, self.attribute, texts);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct StructSerializer<'a> {
|
||||||
|
attribute: SchemaAttr,
|
||||||
|
document_id: DocumentId,
|
||||||
|
indexer: &'a mut RawIndexer,
|
||||||
|
texts: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> ser::SerializeStruct for StructSerializer<'a> {
|
||||||
|
type Ok = ();
|
||||||
|
type Error = SerializerError;
|
||||||
|
|
||||||
|
fn serialize_field<T: ?Sized>(
|
||||||
|
&mut self,
|
||||||
|
key: &'static str,
|
||||||
|
value: &T,
|
||||||
|
) -> Result<(), Self::Error>
|
||||||
|
where T: ser::Serialize,
|
||||||
|
{
|
||||||
|
let key_text = key.to_owned();
|
||||||
|
let value_text = value.serialize(ConvertToString)?;
|
||||||
|
self.texts.push(key_text);
|
||||||
|
self.texts.push(value_text);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(self) -> Result<Self::Ok, Self::Error> {
|
||||||
|
let texts = self.texts.iter().map(String::as_str);
|
||||||
|
self.indexer.index_text_seq(self.document_id, self.attribute, texts);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct TupleIndexer<'a> {
|
||||||
|
attribute: SchemaAttr,
|
||||||
|
document_id: DocumentId,
|
||||||
|
indexer: &'a mut RawIndexer,
|
||||||
|
texts: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> ser::SerializeTuple for TupleIndexer<'a> {
|
||||||
|
type Ok = ();
|
||||||
|
type Error = SerializerError;
|
||||||
|
|
||||||
|
fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
|
||||||
|
where T: Serialize
|
||||||
|
{
|
||||||
|
let text = value.serialize(ConvertToString)?;
|
||||||
|
self.texts.push(text);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn end(self) -> Result<Self::Ok, Self::Error> {
|
||||||
|
let texts = self.texts.iter().map(String::as_str);
|
||||||
|
self.indexer.index_text_seq(self.document_id, self.attribute, texts);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -165,11 +165,11 @@ impl<'a> ser::Serializer for Serializer<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct MapSerializer<'a> {
|
pub struct MapSerializer<'a> {
|
||||||
pub schema: &'a Schema,
|
schema: &'a Schema,
|
||||||
pub document_id: DocumentId,
|
document_id: DocumentId,
|
||||||
pub index: &'a RawIndex,
|
index: &'a RawIndex,
|
||||||
pub indexer: &'a mut RawIndexer,
|
indexer: &'a mut RawIndexer,
|
||||||
pub current_key_name: Option<String>,
|
current_key_name: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> ser::SerializeMap for MapSerializer<'a> {
|
impl<'a> ser::SerializeMap for MapSerializer<'a> {
|
||||||
@ -216,10 +216,10 @@ impl<'a> ser::SerializeMap for MapSerializer<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct StructSerializer<'a> {
|
pub struct StructSerializer<'a> {
|
||||||
pub schema: &'a Schema,
|
schema: &'a Schema,
|
||||||
pub document_id: DocumentId,
|
document_id: DocumentId,
|
||||||
pub index: &'a RawIndex,
|
index: &'a RawIndex,
|
||||||
pub indexer: &'a mut RawIndexer,
|
indexer: &'a mut RawIndexer,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> ser::SerializeStruct for StructSerializer<'a> {
|
impl<'a> ser::SerializeStruct for StructSerializer<'a> {
|
||||||
|
Loading…
Reference in New Issue
Block a user