summa_core/components/
segment_attributes.rs1use 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
33pub trait SegmentAttributes: Default + Serialize + DeserializeOwned + Send + Sync + Clone {
35 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}