use crate::common::counter::hardware_counter::HardwareCounterCell;
use crate::common::types::PointOffsetType;
use serde_json::Value;
use crate::segment::common::operation_error::OperationResult;
pub trait ValueIndexer {
type ValueType;
fn add_many(
&mut self,
id: PointOffsetType,
values: Vec<Self::ValueType>,
hw_counter: &HardwareCounterCell,
) -> OperationResult<()>;
fn get_value(value: &Value) -> Option<Self::ValueType>;
fn get_values(value: &Value) -> Vec<Self::ValueType> {
match value {
Value::Array(values) => values.iter().filter_map(|x| Self::get_value(x)).collect(),
Value::Null
| Value::Bool(_)
| Value::Number(_)
| Value::String(_)
| Value::Object(_) => Self::get_value(value).map(|x| vec![x]).unwrap_or_default(),
}
}
fn add_point(
&mut self,
id: PointOffsetType,
payload: &[&Value],
hw_counter: &HardwareCounterCell,
) -> OperationResult<()> {
self.remove_point(id)?;
let mut flatten_values: Vec<_> = vec![];
for value in payload {
match value {
Value::Array(values) => {
flatten_values.extend(values.iter().filter_map(|x| Self::get_value(x)));
}
Value::Null
| Value::Bool(_)
| Value::Number(_)
| Value::String(_)
| Value::Object(_) => {
if let Some(x) = Self::get_value(value) {
flatten_values.push(x);
}
}
}
}
self.add_many(id, flatten_values, hw_counter)
}
fn remove_point(&mut self, id: PointOffsetType) -> OperationResult<()>;
}