Skip to main content

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        #[expect(clippy::expect_used, reason = "policy is expected not to be empty")]
34        self.0
35            .get(level)
36            .copied()
37            .unwrap_or_else(|| self.last().copied().expect("policy should not be empty"))
38    }
39
40    /// Disables all filters.
41    ///
42    /// **Not recommended unless you know what you are doing!**
43    #[must_use]
44    pub fn disabled() -> Self {
45        Self::all(FilterPolicyEntry::None)
46    }
47
48    /// Uses the same block size in every level.
49    #[must_use]
50    pub fn all(c: FilterPolicyEntry) -> Self {
51        Self(vec![c])
52    }
53
54    /// Constructs a custom block size policy.
55    ///
56    /// # Panics
57    ///
58    /// Panics if the policy is empty or contains more than 255 elements.
59    #[must_use]
60    pub fn new(policy: impl Into<Vec<FilterPolicyEntry>>) -> Self {
61        let policy = policy.into();
62        assert!(!policy.is_empty(), "compression policy may not be empty");
63        assert!(policy.len() <= 255, "compression policy is too large");
64        Self(policy)
65    }
66}