replace ReferenceValue with Self in Value (#2210)

This commit is contained in:
PSeitz
2023-10-06 08:22:15 +02:00
committed by GitHub
parent 6097235eff
commit e246e5765d
8 changed files with 43 additions and 71 deletions
+3 -3
View File
@@ -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::<V::ChildValue>(
index_json_value(
doc,
val,
text_analyzer,
+7 -8
View File
@@ -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::<V::ChildValue>(
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,
+5 -5
View File
@@ -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,
+4 -19
View File
@@ -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<Self::Item> {
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<Self::Item> {
let (key, value) = self.0.next()?;
Some((key, value.as_value()))
Some((key, value))
}
}
+2 -3
View File
@@ -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<ReferenceValue<'a, Self>>;
//! type ObjectIter = std::iter::Empty<(&'a str, ReferenceValue<'a, Self>)>;
//! type ArrayIter = std::iter::Empty<Self>;
//! type ObjectIter = std::iter::Empty<(&'a str, Self)>;
//!
//! // The ReferenceValue which Tantivy can use.
//! fn as_value(&self) -> ReferenceValue<'a, Self> {
+11 -21
View File
@@ -57,8 +57,7 @@ impl AsRef<OwnedValue> 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<ReferenceValue<'a, V>> for OwnedValue {
impl<'a, V: Value<'a>> From<ReferenceValue<'a, V>> 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<ReferenceValue<'a, V>> 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<serde_json::Map<String, serde_json::Value>> 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<Self::Item> {
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<Self::Item> {
let (key, value) = self.0.next()?;
Some((key.as_str(), value.as_value()))
Some((key.as_str(), value))
}
}
+9 -9
View File
@@ -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<ReferenceValue<'_, V::ChildValue>> = elements.collect();
let elements: Vec<V> = 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(),
+2 -3
View File
@@ -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<Item = ReferenceValue<'a, Self::ChildValue>>;
type ArrayIter: Iterator<Item = Self>;
/// The visitor walking through the key-value pairs within
/// the object.
type ObjectIter: Iterator<Item = (&'a str, ReferenceValue<'a, Self::ChildValue>)>;
type ObjectIter: Iterator<Item = (&'a str, Self)>;
/// Returns the field value represented by an enum which borrows it's data.
fn as_value(&self) -> ReferenceValue<'a, Self>;