mirror of
https://github.com/quickwit-oss/tantivy.git
synced 2026-10-25 13:12:53 +00:00
replace ReferenceValue with Self in Value (#2210)
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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>;
|
||||
|
||||
Reference in New Issue
Block a user