use bloomfilter::Bloom;
use crate::registry::{
compile::{hash::package_id, model::RegistryModel, parse::PkgDefinition as PkgTomlDefinition},
schema::registry::BloomHeader,
};
pub const HASH_FUNCTIONS: u8 = 7;
const FALSE_POSITIVE_RATE: f64 = 0.01;
pub fn build_bloom(pkgs: &[&PkgTomlDefinition]) -> Option<Bloom<u64>> {
if pkgs.len() == 0 {
return None;
}
let mut bloom = Bloom::new_for_fp_rate(pkgs.len(), 0.01).expect("invalid bloom");
for pkg in pkgs {
bloom.set(&package_id(&pkg.metadata.name));
}
Some(bloom)
}
use flatbuffers::{FlatBufferBuilder, WIPOffset};
use crate::registry::schema::registry::{BloomFilter, BloomFilterArgs};
pub fn compile_bloom<'a>(
builder: &mut FlatBufferBuilder<'a>,
bloom: Bloom<u64>,
) -> WIPOffset<BloomFilter<'a>> {
let bits = builder.create_vector(bloom.as_slice());
let header = BloomHeader::new(HASH_FUNCTIONS, 0, 0);
BloomFilter::create(
builder,
&BloomFilterArgs {
header: Some(&header),
bits: Some(bits),
},
)
}