diff --git a/src/schema/document/default_doc_type.rs b/src/schema/document/default_doc_type.rs index a680c3c88..4f8ff6302 100644 --- a/src/schema/document/default_doc_type.rs +++ b/src/schema/document/default_doc_type.rs @@ -195,17 +195,6 @@ impl TantivyDocument { Ok(document) } - /// Create a named document from the doc. - pub fn to_named_doc(&self, schema: &Schema) -> NamedFieldDocument { - let mut field_map = BTreeMap::new(); - for (field, field_values) in self.get_sorted_field_values() { - let field_name = schema.get_field_name(field); - let values: Vec = field_values.into_iter().cloned().collect(); - field_map.insert(field_name.to_string(), values); - } - NamedFieldDocument(field_map) - } - /// Encode the schema in JSON. /// /// Encoding a document cannot fail. diff --git a/src/schema/document/mod.rs b/src/schema/document/mod.rs index 42f72ec0b..f0cdde67c 100644 --- a/src/schema/document/mod.rs +++ b/src/schema/document/mod.rs @@ -158,6 +158,7 @@ mod default_doc_type; mod existing_type_impls; mod se; +use std::collections::BTreeMap; use std::fmt::Debug; use std::mem; use std::net::Ipv6Addr; @@ -220,6 +221,20 @@ pub trait Document: DocumentDeserialize + Send + Sync + 'static { grouped_field_values.push((current_field, current_group)); grouped_field_values } + + /// Create a named document from the doc. + fn to_named_doc(&self, schema: &Schema) -> NamedFieldDocument { + let mut field_map = BTreeMap::new(); + for (field, field_values) in self.get_sorted_field_values() { + let field_name = schema.get_field_name(field); + let values: Vec = field_values + .into_iter() + .map(|val| val.as_value().into()) + .collect(); + field_map.insert(field_name.to_string(), values); + } + NamedFieldDocument(field_map) + } } /// A single field value. diff --git a/src/schema/value.rs b/src/schema/value.rs index d0813c05d..48b978e4a 100644 --- a/src/schema/value.rs +++ b/src/schema/value.rs @@ -255,6 +255,28 @@ impl<'de> serde::Deserialize<'de> for OwnedValue { } } +impl<'a, V: Value<'a> + ?Sized> From> for OwnedValue { + fn from(val: ReferenceValue<'a, V>) -> OwnedValue { + match val { + ReferenceValue::Null => OwnedValue::Null, + ReferenceValue::Str(val) => OwnedValue::Str(val.to_string()), + ReferenceValue::U64(val) => OwnedValue::U64(val), + ReferenceValue::I64(val) => OwnedValue::I64(val), + ReferenceValue::F64(val) => OwnedValue::F64(val), + ReferenceValue::Date(val) => OwnedValue::Date(val), + ReferenceValue::Facet(val) => OwnedValue::Facet(val.clone()), + ReferenceValue::Bytes(val) => OwnedValue::Bytes(val.to_vec()), + 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()) + } + } + } +} + impl From for OwnedValue { fn from(s: String) -> OwnedValue { OwnedValue::Str(s)