mirror of
https://github.com/quickwit-oss/tantivy.git
synced 2026-01-04 16:22:55 +00:00
Compare commits
2 Commits
test_parse
...
expdonotme
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a7bde6644 | ||
|
|
659567b4f3 |
@@ -1,15 +1,16 @@
|
|||||||
use std::collections::{BTreeMap, HashMap, HashSet};
|
use std::collections::{BTreeMap, HashMap, HashSet};
|
||||||
use std::net::Ipv6Addr;
|
use std::net::Ipv6Addr;
|
||||||
|
|
||||||
use common::DateTime;
|
use common::{BinarySerializable, DateTime, VInt};
|
||||||
use serde_json::Map;
|
use serde_json::Map;
|
||||||
|
|
||||||
|
use crate::schema::document::se::BinaryValueSerializer;
|
||||||
use crate::schema::document::{
|
use crate::schema::document::{
|
||||||
DeserializeError, Document, DocumentDeserialize, DocumentDeserializer,
|
BinaryDocumentDeserializer, BinaryDocumentSerializer, DeserializeError, Document, DocumentDeserialize, DocumentDeserializer, ReferenceValue, ReferenceValueLeaf
|
||||||
};
|
};
|
||||||
use crate::schema::field_type::ValueParsingError;
|
use crate::schema::field_type::ValueParsingError;
|
||||||
use crate::schema::field_value::FieldValueIter;
|
use crate::schema::field_value::FieldValueIter;
|
||||||
use crate::schema::{Facet, Field, FieldValue, NamedFieldDocument, OwnedValue, Schema};
|
use crate::schema::{Facet, Field, FieldValue, NamedFieldDocument, OwnedValue, Schema, Value};
|
||||||
use crate::tokenizer::PreTokenizedString;
|
use crate::tokenizer::PreTokenizedString;
|
||||||
|
|
||||||
/// TantivyDocument provides a default implementation of the `Document` trait.
|
/// TantivyDocument provides a default implementation of the `Document` trait.
|
||||||
@@ -85,6 +86,36 @@ impl IntoIterator for TantivyDocument {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl TantivyDocument {
|
impl TantivyDocument {
|
||||||
|
|
||||||
|
pub fn to_bytes(&self, buffer: &mut Vec<u8>) -> std::io::Result<()> {
|
||||||
|
buffer.clear();
|
||||||
|
let num_field_values = self.field_values.len();
|
||||||
|
|
||||||
|
VInt(num_field_values as u64).serialize(buffer)?;
|
||||||
|
for (field, value_access) in self.iter_fields_and_values() {
|
||||||
|
field.serialize(buffer)?;
|
||||||
|
let mut serializer = BinaryValueSerializer::new(buffer);
|
||||||
|
match value_access.as_value() {
|
||||||
|
ReferenceValue::Leaf(ReferenceValueLeaf::PreTokStr(pre_tokenized_text)) => {
|
||||||
|
serializer.serialize_value(ReferenceValue::Leaf::<&'_ OwnedValue>(
|
||||||
|
ReferenceValueLeaf::Str(&pre_tokenized_text.text),
|
||||||
|
))?;
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
serializer.serialize_value(value_access.as_value())?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn from_bytes(&self, mut payload: &[u8]) -> Self {
|
||||||
|
let deserializer = BinaryDocumentDeserializer::from_reader(&mut payload).unwrap();
|
||||||
|
Self::deserialize(deserializer).unwrap()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a new, empty document object
|
/// Creates a new, empty document object
|
||||||
pub fn new() -> TantivyDocument {
|
pub fn new() -> TantivyDocument {
|
||||||
TantivyDocument::default()
|
TantivyDocument::default()
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use std::collections::{btree_map, BTreeMap};
|
use std::collections::BTreeMap;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::net::Ipv6Addr;
|
use std::net::Ipv6Addr;
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ pub enum OwnedValue {
|
|||||||
/// A set of values.
|
/// A set of values.
|
||||||
Array(Vec<Self>),
|
Array(Vec<Self>),
|
||||||
/// Dynamic object value.
|
/// Dynamic object value.
|
||||||
Object(BTreeMap<String, Self>),
|
Object(Vec<(String, Self)>),
|
||||||
/// IpV6 Address. Internally there is no IpV4, it needs to be converted to `Ipv6Addr`.
|
/// IpV6 Address. Internally there is no IpV4, it needs to be converted to `Ipv6Addr`.
|
||||||
IpAddr(Ipv6Addr),
|
IpAddr(Ipv6Addr),
|
||||||
}
|
}
|
||||||
@@ -148,10 +148,10 @@ impl ValueDeserialize for OwnedValue {
|
|||||||
|
|
||||||
fn visit_object<'de, A>(&self, mut access: A) -> Result<Self::Value, DeserializeError>
|
fn visit_object<'de, A>(&self, mut access: A) -> Result<Self::Value, DeserializeError>
|
||||||
where A: ObjectAccess<'de> {
|
where A: ObjectAccess<'de> {
|
||||||
let mut elements = BTreeMap::new();
|
let mut elements = Vec::with_capacity(access.size_hint());
|
||||||
|
|
||||||
while let Some((key, value)) = access.next_entry()? {
|
while let Some((key, value)) = access.next_entry()? {
|
||||||
elements.insert(key, value);
|
elements.push((key, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(OwnedValue::Object(elements))
|
Ok(OwnedValue::Object(elements))
|
||||||
@@ -248,12 +248,13 @@ impl<'de> serde::Deserialize<'de> for OwnedValue {
|
|||||||
|
|
||||||
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
|
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
|
||||||
where A: MapAccess<'de> {
|
where A: MapAccess<'de> {
|
||||||
let mut object = BTreeMap::new();
|
let mut object =
|
||||||
|
map.size_hint()
|
||||||
|
.map(Vec::with_capacity)
|
||||||
|
.unwrap_or_default();
|
||||||
while let Some((key, value)) = map.next_entry()? {
|
while let Some((key, value)) = map.next_entry()? {
|
||||||
object.insert(key, value);
|
object.push((key, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(OwnedValue::Object(object))
|
Ok(OwnedValue::Object(object))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -363,7 +364,8 @@ impl From<PreTokenizedString> for OwnedValue {
|
|||||||
|
|
||||||
impl From<BTreeMap<String, OwnedValue>> for OwnedValue {
|
impl From<BTreeMap<String, OwnedValue>> for OwnedValue {
|
||||||
fn from(object: BTreeMap<String, OwnedValue>) -> OwnedValue {
|
fn from(object: BTreeMap<String, OwnedValue>) -> OwnedValue {
|
||||||
OwnedValue::Object(object)
|
let key_values = object.into_iter().collect();
|
||||||
|
OwnedValue::Object(key_values)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -417,18 +419,15 @@ impl From<serde_json::Value> for OwnedValue {
|
|||||||
|
|
||||||
impl From<serde_json::Map<String, serde_json::Value>> for OwnedValue {
|
impl From<serde_json::Map<String, serde_json::Value>> for OwnedValue {
|
||||||
fn from(map: serde_json::Map<String, serde_json::Value>) -> Self {
|
fn from(map: serde_json::Map<String, serde_json::Value>) -> Self {
|
||||||
let mut object = BTreeMap::new();
|
let object: Vec<(String, OwnedValue)> = map.into_iter()
|
||||||
|
.map(|(key, value)| (key, OwnedValue::from(value)))
|
||||||
for (key, value) in map {
|
.collect();
|
||||||
object.insert(key, OwnedValue::from(value));
|
|
||||||
}
|
|
||||||
|
|
||||||
OwnedValue::Object(object)
|
OwnedValue::Object(object)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A wrapper type for iterating over a serde_json object producing reference values.
|
/// A wrapper type for iterating over a serde_json object producing reference values.
|
||||||
pub struct ObjectMapIter<'a>(btree_map::Iter<'a, String, OwnedValue>);
|
pub struct ObjectMapIter<'a>(std::slice::Iter<'a, (String, OwnedValue)>);
|
||||||
|
|
||||||
impl<'a> Iterator for ObjectMapIter<'a> {
|
impl<'a> Iterator for ObjectMapIter<'a> {
|
||||||
type Item = (&'a str, &'a OwnedValue);
|
type Item = (&'a str, &'a OwnedValue);
|
||||||
|
|||||||
Reference in New Issue
Block a user