// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). // Copyright (c) 2012 The LevelDB Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. See the AUTHORS file for names of contributors. #pragma once #include #include #include #include "rocksdb/filter_policy.h" namespace rocksdb { class Slice; // Exposes any extra information needed for testing built-in // FilterBitsBuilders class BuiltinFilterBitsBuilder : public FilterBitsBuilder { public: // Calculate number of bytes needed for a new filter, including // metadata. Passing the result to CalculateNumEntry should // return >= the num_entry passed in. virtual uint32_t CalculateSpace(const int num_entry) = 0; }; // RocksDB built-in filter policy for Bloom or Bloom-like filters. // This class is considered internal API and subject to change. // See NewBloomFilterPolicy. class BloomFilterPolicy : public FilterPolicy { public: // An internal marker for which Bloom filter implementation to use. // This makes it easier for tests to track or to walk over the built-in // set of Bloom filter policies. The only variance in BloomFilterPolicy // by implementation is in GetFilterBitsBuilder(), so an enum is practical // here vs. subclasses. enum Impl { // Implementation of Bloom filter for full and partitioned filters. // Set to 0 in case of value confusion with bool use_block_based_builder kFull = 0, // Deprecated block-based Bloom filter implementation. // Set to 1 in case of value confusion with bool use_block_based_builder kBlock = 1, }; static const std::vector kAllImpls; explicit BloomFilterPolicy(int bits_per_key, Impl impl); ~BloomFilterPolicy() override; const char* Name() const override; // Deprecated block-based filter only void CreateFilter(const Slice* keys, int n, std::string* dst) const override; // Deprecated block-based filter only bool KeyMayMatch(const Slice& key, const Slice& bloom_filter) const override; FilterBitsBuilder* GetFilterBitsBuilder() const override; // Read metadata to determine what kind of FilterBitsReader is needed // and return a new one. This must successfully process any filter data // generated by a built-in FilterBitsBuilder, regardless of the impl // chosen for this BloomFilterPolicy. Not compatible with CreateFilter. FilterBitsReader* GetFilterBitsReader(const Slice& contents) const override; private: int bits_per_key_; int num_probes_; // Selected implementation for building new SST filters Impl impl_; }; } // namespace rocksdb