apache_datasketches/tuple/generic/
sketch.rs1use super::builder::resize_factor_multiplier;
2use super::summary::{erase, TupleSummary};
3use crate::error::SketchError;
4use crate::tuple::ResizeFactor;
5use apache_datasketches_sys::tuple_generic::ffi as sys;
6use cxx::UniquePtr;
7use std::marker::PhantomData;
8
9pub struct TupleSketch<S: TupleSummary> {
13 pub(crate) inner: UniquePtr<sys::TupleGenericSketchShim>,
14 pub(crate) _marker: PhantomData<fn() -> S>,
15}
16
17unsafe impl<S: TupleSummary> Send for TupleSketch<S> {}
20
21impl<S: TupleSummary> TupleSketch<S> {
22 pub(crate) fn from_parts(lg_k: u8, rf: ResizeFactor, p: f32) -> Result<Self, SketchError> {
23 let inner = sys::new_tuple_generic_sketch(lg_k, resize_factor_multiplier(rf), p)
24 .map_err(|e| SketchError::InvalidConfig(e.what().to_string()))?;
25 Ok(Self {
26 inner,
27 _marker: PhantomData,
28 })
29 }
30
31 pub fn update_u64(&mut self, key: u64, value: &S::Update) {
35 let summary = erase(S::create(value));
36 self.inner.pin_mut().update_u64(key, &summary);
37 }
38
39 pub fn update_i64(&mut self, key: i64, value: &S::Update) {
41 let summary = erase(S::create(value));
42 self.inner.pin_mut().update_i64(key, &summary);
43 }
44
45 pub fn update_u32(&mut self, key: u32, value: &S::Update) {
47 let summary = erase(S::create(value));
48 self.inner.pin_mut().update_u32(key, &summary);
49 }
50
51 pub fn update_i32(&mut self, key: i32, value: &S::Update) {
53 let summary = erase(S::create(value));
54 self.inner.pin_mut().update_i32(key, &summary);
55 }
56
57 pub fn update_u16(&mut self, key: u16, value: &S::Update) {
59 let summary = erase(S::create(value));
60 self.inner.pin_mut().update_u16(key, &summary);
61 }
62
63 pub fn update_i16(&mut self, key: i16, value: &S::Update) {
65 let summary = erase(S::create(value));
66 self.inner.pin_mut().update_i16(key, &summary);
67 }
68
69 pub fn update_u8(&mut self, key: u8, value: &S::Update) {
71 let summary = erase(S::create(value));
72 self.inner.pin_mut().update_u8(key, &summary);
73 }
74
75 pub fn update_i8(&mut self, key: i8, value: &S::Update) {
77 let summary = erase(S::create(value));
78 self.inner.pin_mut().update_i8(key, &summary);
79 }
80
81 pub fn update_f64(&mut self, key: f64, value: &S::Update) {
83 let summary = erase(S::create(value));
84 self.inner.pin_mut().update_f64(key, &summary);
85 }
86
87 pub fn update_str(&mut self, key: &str, value: &S::Update) {
89 let summary = erase(S::create(value));
90 self.inner.pin_mut().update_str(key, &summary);
91 }
92
93 pub fn update_bytes(&mut self, key: &[u8], value: &S::Update) {
95 let summary = erase(S::create(value));
96 self.inner.pin_mut().update_bytes(key, &summary);
97 }
98
99 pub fn trim(&mut self) {
102 self.inner.pin_mut().trim();
103 }
104
105 pub fn reset(&mut self) {
107 self.inner.pin_mut().reset();
108 }
109
110 pub fn get_estimate(&self) -> f64 {
112 self.inner.get_estimate()
113 }
114
115 pub fn get_lower_bound(&self, num_std_dev: u8) -> Result<f64, SketchError> {
118 self.inner
119 .get_lower_bound(num_std_dev)
120 .map_err(|e| SketchError::InvalidConfig(e.what().to_string()))
121 }
122
123 pub fn get_upper_bound(&self, num_std_dev: u8) -> Result<f64, SketchError> {
126 self.inner
127 .get_upper_bound(num_std_dev)
128 .map_err(|e| SketchError::InvalidConfig(e.what().to_string()))
129 }
130
131 pub fn is_empty(&self) -> bool {
133 self.inner.is_empty()
134 }
135
136 pub fn is_estimation_mode(&self) -> bool {
138 self.inner.is_estimation_mode()
139 }
140
141 pub fn is_ordered(&self) -> bool {
143 self.inner.is_ordered()
144 }
145
146 pub fn get_theta(&self) -> f64 {
148 self.inner.get_theta()
149 }
150
151 pub fn get_num_retained(&self) -> u32 {
153 self.inner.get_num_retained()
154 }
155
156 pub fn compact(&self, ordered: bool) -> super::CompactTupleSketch<S> {
160 super::CompactTupleSketch::from_shim(self.inner.compact(ordered))
161 }
162}