lsm_tree/config/
filter.rs

1// Copyright (c) 2024-present, fjall-rs
2// This source code is licensed under both the Apache 2.0 and MIT License
3// (found in the LICENSE-* files in the repository)
4
5pub use crate::table::filter::BloomConstructionPolicy;
6
7/// Filter policy entry
8///
9/// Each level can be configured with a different filter type and bits per key
10#[derive(Copy, Debug, Clone, PartialEq)]
11pub enum FilterPolicyEntry {
12    /// Skip filter construction
13    None,
14
15    /// Standard bloom filter with K bits per key
16    Bloom(BloomConstructionPolicy),
17}
18
19/// Filter policy
20#[derive(Debug, Clone, PartialEq)]
21pub struct FilterPolicy(Vec<FilterPolicyEntry>);
22
23impl std::ops::Deref for FilterPolicy {
24    type Target = [FilterPolicyEntry];
25
26    fn deref(&self) -> &Self::Target {
27        &self.0
28    }
29}
30
31impl FilterPolicy {
32    pub(crate) fn get(&self, level: usize) -> FilterPolicyEntry {
33        self.0
34            .get(level)
35            .copied()
36            .unwrap_or_else(|| self.last().copied().expect("policy should not be empty"))
37    }
38
39    /// Disables all filters.
40    ///
41    /// **Not recommended unless you know what you are doing!**
42    #[must_use]
43    pub fn disabled() -> Self {
44        Self::all(FilterPolicyEntry::None)
45    }
46
47    /// Uses the same block size in every level.
48    #[must_use]
49    pub fn all(c: FilterPolicyEntry) -> Self {
50        Self(vec![c])
51    }
52
53    /// Constructs a custom block size policy.
54    #[must_use]
55    pub fn new(policy: &[FilterPolicyEntry]) -> Self {
56        assert!(!policy.is_empty(), "compression policy may not be empty");
57        assert!(policy.len() <= 255, "compression policy is too large");
58        Self(policy.into())
59    }
60}