summa_core/components/
segment_attributes.rs

1use std::marker::PhantomData;
2
3use serde::de::DeserializeOwned;
4use serde::{Deserialize, Serialize};
5use tantivy::index::SegmentAttributesMerger;
6
7use crate::utils::current_time;
8
9#[derive(Clone, Debug, Serialize, Deserialize)]
10pub struct SummaSegmentAttributes {
11    pub is_frozen: bool,
12    pub created_at: Option<u64>,
13}
14
15impl Default for SummaSegmentAttributes {
16    fn default() -> Self {
17        SummaSegmentAttributes {
18            is_frozen: false,
19            created_at: Some(current_time()),
20        }
21    }
22}
23
24impl SummaSegmentAttributes {
25    pub fn frozen() -> Self {
26        SummaSegmentAttributes {
27            is_frozen: true,
28            created_at: Some(current_time()),
29        }
30    }
31}
32
33/// SegmentAttributes implementation owns custom segment attributes and its merging behavior
34pub trait SegmentAttributes: Default + Serialize + DeserializeOwned + Send + Sync + Clone {
35    /// Must be implemented for defining how to merge `SegmentAttributes` from
36    /// different segments
37    fn merge(segments_attributes: Vec<Self>) -> Self;
38}
39
40#[derive(Clone)]
41pub struct SegmentAttributesMergerImpl<S: SegmentAttributes> {
42    _phantom: PhantomData<S>,
43}
44
45impl<S: SegmentAttributes> SegmentAttributesMergerImpl<S> {
46    pub fn new() -> SegmentAttributesMergerImpl<S> {
47        SegmentAttributesMergerImpl { _phantom: PhantomData }
48    }
49}
50
51impl<S: SegmentAttributes + 'static> SegmentAttributesMerger for SegmentAttributesMergerImpl<S> {
52    fn merge_json(&self, segment_attributes_json: Vec<&serde_json::Value>) -> serde_json::Value {
53        let segment_attributes: Vec<_> = segment_attributes_json.into_iter().flat_map(|v| serde_json::from_value(v.clone())).collect();
54        serde_json::to_value(S::merge(segment_attributes)).expect("not serializable")
55    }
56
57    fn default(&self) -> serde_json::Value {
58        serde_json::to_value(S::default()).expect("not serializable")
59    }
60}
61
62impl SegmentAttributes for SummaSegmentAttributes {
63    fn merge(segments_attributes: Vec<Self>) -> Self {
64        SummaSegmentAttributes {
65            is_frozen: segments_attributes.into_iter().map(|v| v.is_frozen).reduce(|a, b| a && b).unwrap_or(false),
66            created_at: Some(current_time()),
67        }
68    }
69}