apache_datasketches/tuple/generic/
builder.rs1use super::{summary::TupleSummary, TupleSketch};
2use crate::error::SketchError;
3use crate::tuple::ResizeFactor;
4use std::marker::PhantomData;
5
6pub struct TupleSketchBuilder<S: TupleSummary> {
11 lg_k: u8,
12 resize_factor: ResizeFactor,
13 p: f32,
14 _marker: PhantomData<fn() -> S>,
15}
16
17impl<S: TupleSummary> std::fmt::Debug for TupleSketchBuilder<S> {
25 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
26 f.debug_struct("TupleSketchBuilder")
27 .field("lg_k", &self.lg_k)
28 .field("resize_factor", &self.resize_factor)
29 .field("p", &self.p)
30 .finish()
31 }
32}
33
34impl<S: TupleSummary> Clone for TupleSketchBuilder<S> {
35 fn clone(&self) -> Self {
36 *self
37 }
38}
39
40impl<S: TupleSummary> Copy for TupleSketchBuilder<S> {}
41
42impl<S: TupleSummary> Default for TupleSketchBuilder<S> {
43 fn default() -> Self {
44 Self {
45 lg_k: 12,
46 resize_factor: ResizeFactor::X8,
47 p: 1.0,
48 _marker: PhantomData,
49 }
50 }
51}
52
53impl<S: TupleSummary> TupleSketchBuilder<S> {
54 pub fn new() -> Self {
57 Self::default()
58 }
59
60 pub fn lg_k(mut self, lg_k: u8) -> Self {
62 self.lg_k = lg_k;
63 self
64 }
65
66 pub fn resize_factor(mut self, resize_factor: ResizeFactor) -> Self {
68 self.resize_factor = resize_factor;
69 self
70 }
71
72 pub fn p(mut self, p: f32) -> Self {
74 self.p = p;
75 self
76 }
77
78 pub fn build(self) -> Result<TupleSketch<S>, SketchError> {
81 TupleSketch::from_parts(self.lg_k, self.resize_factor, self.p)
82 }
83}
84
85pub(crate) fn resize_factor_multiplier(rf: ResizeFactor) -> u8 {
88 match rf {
89 ResizeFactor::X1 => 1,
90 ResizeFactor::X2 => 2,
91 ResizeFactor::X4 => 4,
92 ResizeFactor::X8 => 8,
93 }
94}