diff --git a/src/core/json_utils.rs b/src/core/json_utils.rs index ba7d8f707..79dfd2570 100644 --- a/src/core/json_utils.rs +++ b/src/core/json_utils.rs @@ -117,14 +117,14 @@ fn index_json_object<'a, V: Value<'a>>( fn index_json_value<'a, V: Value<'a>>( doc: DocId, - json_value: ReferenceValue<'a, V>, + json_value: V, text_analyzer: &mut TextAnalyzer, json_term_writer: &mut JsonTermWriter, postings_writer: &mut dyn PostingsWriter, ctx: &mut IndexingContext, positions_per_path: &mut IndexingPositionsPerPath, ) { - match json_value { + match json_value.as_value() { ReferenceValue::Null => {} ReferenceValue::Str(val) => { let mut token_stream = text_analyzer.token_stream(val); @@ -174,7 +174,7 @@ fn index_json_value<'a, V: Value<'a>>( } ReferenceValue::Array(elements) => { for val in elements { - index_json_value::( + index_json_value( doc, val, text_analyzer, diff --git a/src/fastfield/writer.rs b/src/fastfield/writer.rs index 6450b0be0..ad61cdf4b 100644 --- a/src/fastfield/writer.rs +++ b/src/fastfield/writer.rs @@ -123,7 +123,7 @@ impl FastFieldsWriter { for (field, value) in doc.iter_fields_and_values() { let value_access = value as D::Value<'_>; - self.add_doc_value(doc_id, field, value_access.as_value())?; + self.add_doc_value(doc_id, field, value_access)?; } self.num_docs += 1; Ok(()) @@ -133,14 +133,14 @@ impl FastFieldsWriter { &mut self, doc_id: DocId, field: Field, - value: ReferenceValue<'a, V>, + value: V, ) -> crate::Result<()> { let field_name = match &self.fast_field_names[field.field_id() as usize] { None => return Ok(()), Some(name) => name, }; - match value { + match value.as_value() { ReferenceValue::Null => {} ReferenceValue::Str(val) => { if let Some(tokenizer) = &mut self.per_field_tokenizer[field.field_id() as usize] { @@ -284,7 +284,7 @@ fn record_json_obj_to_columnar_writer<'a, V: Value<'a>>( fn record_json_value_to_columnar_writer<'a, V: Value<'a>>( doc: DocId, - json_val: ReferenceValue<'a, V>, + json_val: V, expand_dots: bool, mut remaining_depth_limit: usize, json_path_writer: &mut String, @@ -296,7 +296,7 @@ fn record_json_value_to_columnar_writer<'a, V: Value<'a>>( } remaining_depth_limit -= 1; - match json_val { + match json_val.as_value() { ReferenceValue::Null => {} // TODO: Handle null ReferenceValue::Str(val) => { if let Some(text_analyzer) = tokenizer.as_mut() { @@ -351,7 +351,7 @@ fn record_json_value_to_columnar_writer<'a, V: Value<'a>>( } ReferenceValue::Array(elements) => { for el in elements { - record_json_value_to_columnar_writer::( + record_json_value_to_columnar_writer( doc, el, expand_dots, @@ -382,7 +382,6 @@ mod tests { use super::record_json_value_to_columnar_writer; use crate::fastfield::writer::JSON_DEPTH_LIMIT; - use crate::schema::document::Value; use crate::DocId; fn test_columnar_from_jsons_aux( @@ -394,7 +393,7 @@ mod tests { for (doc, json_doc) in json_docs.iter().enumerate() { record_json_value_to_columnar_writer( doc as u32, - json_doc.as_value(), + json_doc, expand_dots, JSON_DEPTH_LIMIT, &mut json_path, diff --git a/src/schema/document/de.rs b/src/schema/document/de.rs index d9992c5a7..a1e5972df 100644 --- a/src/schema/document/de.rs +++ b/src/schema/document/de.rs @@ -789,7 +789,7 @@ mod tests { use tokenizer_api::Token; use super::*; - use crate::schema::document::existing_type_impls::{JsonArrayIter, JsonObjectIter}; + use crate::schema::document::existing_type_impls::JsonObjectIter; use crate::schema::document::se::BinaryValueSerializer; use crate::schema::document::ReferenceValue; @@ -861,7 +861,7 @@ mod tests { #[test] fn test_array_serialize() { let elements = vec![serde_json::Value::Null, serde_json::Value::Null]; - let result = serialize_value(ReferenceValue::Array(JsonArrayIter(elements.iter()))); + let result = serialize_value(ReferenceValue::Array(elements.iter())); let value = deserialize_value(result); assert_eq!( value, @@ -875,7 +875,7 @@ mod tests { serde_json::Value::String("Hello, world".into()), serde_json::Value::String("Some demo".into()), ]; - let result = serialize_value(ReferenceValue::Array(JsonArrayIter(elements.iter()))); + let result = serialize_value(ReferenceValue::Array(elements.iter())); let value = deserialize_value(result); assert_eq!( value, @@ -886,7 +886,7 @@ mod tests { ); let elements = vec![]; - let result = serialize_value(ReferenceValue::Array(JsonArrayIter(elements.iter()))); + let result = serialize_value(ReferenceValue::Array(elements.iter())); let value = deserialize_value(result); assert_eq!(value, crate::schema::OwnedValue::Array(vec![])); @@ -895,7 +895,7 @@ mod tests { serde_json::Value::String("Hello, world".into()), serde_json::Value::Number(12345.into()), ]; - let result = serialize_value(ReferenceValue::Array(JsonArrayIter(elements.iter()))); + let result = serialize_value(ReferenceValue::Array(elements.iter())); let value = deserialize_value(result); assert_eq!( value, diff --git a/src/schema/document/existing_type_impls.rs b/src/schema/document/existing_type_impls.rs index 0122207b8..9fb2743e0 100644 --- a/src/schema/document/existing_type_impls.rs +++ b/src/schema/document/existing_type_impls.rs @@ -16,8 +16,7 @@ use crate::schema::Field; // Serde compatibility support. impl<'a> Value<'a> for &'a serde_json::Value { - type ChildValue = Self; - type ArrayIter = JsonArrayIter<'a>; + type ArrayIter = std::slice::Iter<'a, serde_json::Value>; type ObjectIter = JsonObjectIter<'a>; fn as_value(&self) -> ReferenceValue<'a, Self> { @@ -36,9 +35,7 @@ impl<'a> Value<'a> for &'a serde_json::Value { } } serde_json::Value::String(val) => ReferenceValue::Str(val), - serde_json::Value::Array(elements) => { - ReferenceValue::Array(JsonArrayIter(elements.iter())) - } + serde_json::Value::Array(elements) => ReferenceValue::Array(elements.iter()), serde_json::Value::Object(object) => { ReferenceValue::Object(JsonObjectIter(object.iter())) } @@ -110,27 +107,15 @@ impl ValueDeserialize for serde_json::Value { } } -/// A wrapper struct for an interator producing [Value]s. -pub struct JsonArrayIter<'a>(pub(crate) std::slice::Iter<'a, serde_json::Value>); - -impl<'a> Iterator for JsonArrayIter<'a> { - type Item = ReferenceValue<'a, &'a serde_json::Value>; - - fn next(&mut self) -> Option { - let value = self.0.next()?; - Some(value.as_value()) - } -} - /// A wrapper struct for an interator producing [Value]s. pub struct JsonObjectIter<'a>(pub(crate) serde_json::map::Iter<'a>); impl<'a> Iterator for JsonObjectIter<'a> { - type Item = (&'a str, ReferenceValue<'a, &'a serde_json::Value>); + type Item = (&'a str, &'a serde_json::Value); fn next(&mut self) -> Option { let (key, value) = self.0.next()?; - Some((key, value.as_value())) + Some((key, value)) } } diff --git a/src/schema/document/mod.rs b/src/schema/document/mod.rs index 3ce6581d1..a39251a33 100644 --- a/src/schema/document/mod.rs +++ b/src/schema/document/mod.rs @@ -130,13 +130,12 @@ //! } //! //! impl<'a> Value<'a> for MyCustomValue<'a> { -//! type ChildValue = Self; //! // We don't need to worry about these types here as we're not //! // working with nested types, but if we wanted to we would //! // define our two iterator types, a sequence of ReferenceValues //! // for the array iterator and a sequence of key-value pairs for objects. -//! type ArrayIter = std::iter::Empty>; -//! type ObjectIter = std::iter::Empty<(&'a str, ReferenceValue<'a, Self>)>; +//! type ArrayIter = std::iter::Empty; +//! type ObjectIter = std::iter::Empty<(&'a str, Self)>; //! //! // The ReferenceValue which Tantivy can use. //! fn as_value(&self) -> ReferenceValue<'a, Self> { diff --git a/src/schema/document/owned_value.rs b/src/schema/document/owned_value.rs index a15946209..1fb89b368 100644 --- a/src/schema/document/owned_value.rs +++ b/src/schema/document/owned_value.rs @@ -57,8 +57,7 @@ impl AsRef for OwnedValue { } impl<'a> Value<'a> for &'a OwnedValue { - type ChildValue = Self; - type ArrayIter = ArrayIter<'a>; + type ArrayIter = std::slice::Iter<'a, OwnedValue>; type ObjectIter = ObjectMapIter<'a>; fn as_value(&self) -> ReferenceValue<'a, Self> { @@ -74,7 +73,7 @@ impl<'a> Value<'a> for &'a OwnedValue { OwnedValue::Facet(val) => ReferenceValue::Facet(val), OwnedValue::Bytes(val) => ReferenceValue::Bytes(val), OwnedValue::IpAddr(val) => ReferenceValue::IpAddr(*val), - OwnedValue::Array(array) => ReferenceValue::Array(ArrayIter(array.iter())), + OwnedValue::Array(array) => ReferenceValue::Array(array.iter()), OwnedValue::Object(object) => ReferenceValue::Object(ObjectMapIter(object.iter())), } } @@ -262,7 +261,7 @@ impl<'de> serde::Deserialize<'de> for OwnedValue { } } -impl<'a, V: Value<'a> + ?Sized> From> for OwnedValue { +impl<'a, V: Value<'a>> From> for OwnedValue { fn from(val: ReferenceValue<'a, V>) -> OwnedValue { match val { ReferenceValue::Null => OwnedValue::Null, @@ -276,10 +275,13 @@ impl<'a, V: Value<'a> + ?Sized> From> for OwnedValue { ReferenceValue::IpAddr(val) => OwnedValue::IpAddr(val), ReferenceValue::Bool(val) => OwnedValue::Bool(val), ReferenceValue::PreTokStr(val) => OwnedValue::PreTokStr(val.clone()), - ReferenceValue::Array(val) => OwnedValue::Array(val.map(|v| v.into()).collect()), - ReferenceValue::Object(val) => { - OwnedValue::Object(val.map(|(k, v)| (k.to_string(), v.into())).collect()) + ReferenceValue::Array(val) => { + OwnedValue::Array(val.map(|v| v.as_value().into()).collect()) } + ReferenceValue::Object(val) => OwnedValue::Object( + val.map(|(k, v)| (k.to_string(), v.as_value().into())) + .collect(), + ), } } } @@ -422,27 +424,15 @@ impl From> for OwnedValue { } } -/// A wrapper type for iterating over a serde_json array producing reference values. -pub struct ArrayIter<'a>(std::slice::Iter<'a, OwnedValue>); - -impl<'a> Iterator for ArrayIter<'a> { - type Item = ReferenceValue<'a, &'a OwnedValue>; - - fn next(&mut self) -> Option { - let value = self.0.next()?; - Some(value.as_value()) - } -} - /// A wrapper type for iterating over a serde_json object producing reference values. pub struct ObjectMapIter<'a>(btree_map::Iter<'a, String, OwnedValue>); impl<'a> Iterator for ObjectMapIter<'a> { - type Item = (&'a str, ReferenceValue<'a, &'a OwnedValue>); + type Item = (&'a str, &'a OwnedValue); fn next(&mut self) -> Option { let (key, value) = self.0.next()?; - Some((key.as_str(), value.as_value())) + Some((key.as_str(), value)) } } diff --git a/src/schema/document/se.rs b/src/schema/document/se.rs index f07ee641b..5c0e3b85b 100644 --- a/src/schema/document/se.rs +++ b/src/schema/document/se.rs @@ -148,12 +148,12 @@ where W: Write // Somewhat unfortunate that we do this here however, writing the // length at the end of the complicates things quite considerably. - let elements: Vec> = elements.collect(); + let elements: Vec = elements.collect(); let mut serializer = BinaryArraySerializer::begin(elements.len(), self.writer)?; for value in elements { - serializer.serialize_value(value)?; + serializer.serialize_value(value.as_value())?; } serializer.end() @@ -163,12 +163,12 @@ where W: Write // Somewhat unfortunate that we do this here however, writing the // length at the end of the complicates things quite considerably. - let entries: Vec<(&str, ReferenceValue<'_, V::ChildValue>)> = object.collect(); + let entries: Vec<(&str, V)> = object.collect(); let mut serializer = BinaryObjectSerializer::begin(entries.len(), self.writer)?; for (key, value) in entries { - serializer.serialize_entry(key, value)?; + serializer.serialize_entry(key, value.as_value())?; } serializer.end() @@ -308,7 +308,7 @@ mod tests { use tokenizer_api::Token; use super::*; - use crate::schema::document::existing_type_impls::{JsonArrayIter, JsonObjectIter}; + use crate::schema::document::existing_type_impls::JsonObjectIter; use crate::schema::{Facet, Field, FAST, STORED, TEXT}; use crate::tokenizer::PreTokenizedString; @@ -451,7 +451,7 @@ mod tests { #[test] fn test_array_serialize() { let elements = vec![serde_json::Value::Null, serde_json::Value::Null]; - let result = serialize_value(ReferenceValue::Array(JsonArrayIter(elements.iter()))); + let result = serialize_value(ReferenceValue::Array(elements.iter())); let expected = binary_repr!( collection type_codes::ARRAY_CODE, length elements.len(), @@ -467,7 +467,7 @@ mod tests { serde_json::Value::String("Hello, world".into()), serde_json::Value::String("Some demo".into()), ]; - let result = serialize_value(ReferenceValue::Array(JsonArrayIter(elements.iter()))); + let result = serialize_value(ReferenceValue::Array(elements.iter())); let expected = binary_repr!( collection type_codes::ARRAY_CODE, length elements.len(), @@ -480,7 +480,7 @@ mod tests { ); let elements = vec![]; - let result = serialize_value(ReferenceValue::Array(JsonArrayIter(elements.iter()))); + let result = serialize_value(ReferenceValue::Array(elements.iter())); let expected = binary_repr!( collection type_codes::ARRAY_CODE, length elements.len(), @@ -495,7 +495,7 @@ mod tests { serde_json::Value::String("Hello, world".into()), serde_json::Value::Number(12345.into()), ]; - let result = serialize_value(ReferenceValue::Array(JsonArrayIter(elements.iter()))); + let result = serialize_value(ReferenceValue::Array(elements.iter())); let expected = binary_repr!( collection type_codes::ARRAY_CODE, length elements.len(), diff --git a/src/schema/document/value.rs b/src/schema/document/value.rs index 954ca0b66..45d085f58 100644 --- a/src/schema/document/value.rs +++ b/src/schema/document/value.rs @@ -9,12 +9,11 @@ use crate::tokenizer::PreTokenizedString; /// A single field value. pub trait Value<'a>: Send + Sync + Debug { /// The child value type returned by this doc value. - type ChildValue: Value<'a>; /// The iterator for walking through the elements within the array. - type ArrayIter: Iterator>; + type ArrayIter: Iterator; /// The visitor walking through the key-value pairs within /// the object. - type ObjectIter: Iterator)>; + type ObjectIter: Iterator; /// Returns the field value represented by an enum which borrows it's data. fn as_value(&self) -> ReferenceValue<'a, Self>;