Skip to content

Commit 0e4d4d1

Browse files
Update README and address all clippy warnings
1 parent 398ea3d commit 0e4d4d1

File tree

4 files changed

+55
-38
lines changed

4 files changed

+55
-38
lines changed

Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ bloomfilter = "1.0.13"
1616
lazy_static = "1.4.0"
1717
libc = "0.2"
1818

19+
[build-dependencies]
20+
clippy = { version = "*", optional = true }
21+
1922
[lib]
2023
crate-type = ["cdylib"]
2124
name = "valkey_bloom"

README.md

+19-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,30 @@
11
# valkey-bloom
22

3-
Tested on Linux so far.
3+
Valkey-Bloom is a Rust Valkey-Module which brings a native and space efficient probabilistic Module data type to Valkey. With this, users can create filters (space-efficient probabilistic Module data type) to add elements, perform “check” operation to test whether an element exists, auto scale their filters, perform RDB Save and load operations, etc.
44

5+
Valkey-Bloom is built using bloomfilter::Bloom (https://crates.io/crates/bloomfilter which has a BSD-2-Clause license).
6+
7+
It is compatible with the BloomFilter (BF.*) command APIs of the ReBloom Module from Redis Ltd.
8+
9+
The following commands are supported.
10+
```
11+
BF.EXISTS
12+
BF.ADD
13+
BF.MEXISTS
14+
BF.MADD
15+
BF.CARD
16+
BF.RESERVE
17+
BF.INFO
18+
BF.INSERT
19+
```
20+
21+
Build instructions for Linux.
522
```
623
curl https://sh.rustup.rs -sSf | sh
724
sudo yum install clang
825
git clone https://github.com/KarthikSubbarao/valkey-bloom.git
926
cd valkey-bloom
10-
cargo build --all --all-targets --release
27+
cargo build --features clippy --all --all-targets --release
1128
find . -name "libvalkey_bloom.so"
1229
valkey-server --loadmodule ./target/release/libvalkey_bloom.so
1330
```

src/commands/bloom.rs

+29-32
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::commands::bloom_util::{BloomFilterType, ERROR};
99
// TODO: Replace string literals in error messages with static
1010
// TODO: Check all int / usize casting.
1111

12-
pub fn bloom_filter_add_value(ctx: &Context, input_args: &Vec<RedisString>, multi: bool) -> RedisResult {
12+
pub fn bloom_filter_add_value(ctx: &Context, input_args: &[RedisString], multi: bool) -> RedisResult {
1313
let argc = input_args.len();
1414
if (!multi && argc != 3) || argc < 3 {
1515
return Err(RedisError::WrongArity);
@@ -29,13 +29,12 @@ pub fn bloom_filter_add_value(ctx: &Context, input_args: &Vec<RedisString>, mult
2929
match value {
3030
Some(bf) => {
3131
if !multi {
32-
let item = &input_args[curr_cmd_idx];
32+
let item = input_args[curr_cmd_idx].as_slice();
3333
return Ok(RedisValue::Integer(bf.add_item(item)));
3434
}
3535
let mut result = Vec::new();
36-
for idx in curr_cmd_idx..argc {
37-
let item = &input_args[idx];
38-
result.push(RedisValue::Integer(bf.add_item(item)));
36+
for item in input_args.iter().take(argc).skip(curr_cmd_idx) {
37+
result.push(RedisValue::Integer(bf.add_item(item.as_slice())));
3938
}
4039
Ok(RedisValue::Array(result))
4140
}
@@ -49,14 +48,13 @@ pub fn bloom_filter_add_value(ctx: &Context, input_args: &Vec<RedisString>, mult
4948
let result = match multi {
5049
true => {
5150
let mut result = Vec::new();
52-
for idx in curr_cmd_idx..argc {
53-
let item = &input_args[idx];
54-
result.push(RedisValue::Integer(bf.add_item(item)));
51+
for item in input_args.iter().take(argc).skip(curr_cmd_idx) {
52+
result.push(RedisValue::Integer(bf.add_item(item.as_slice())));
5553
}
5654
Ok(RedisValue::Array(result))
5755
}
5856
false => {
59-
let item = &input_args[curr_cmd_idx];
57+
let item = input_args[curr_cmd_idx].as_slice();
6058
Ok(RedisValue::Integer(bf.add_item(item)))
6159
}
6260
};
@@ -70,7 +68,7 @@ pub fn bloom_filter_add_value(ctx: &Context, input_args: &Vec<RedisString>, mult
7068
}
7169
}
7270

73-
pub fn bloom_filter_exists(ctx: &Context, input_args: &Vec<RedisString>, multi: bool) -> RedisResult {
71+
pub fn bloom_filter_exists(ctx: &Context, input_args: &[RedisString], multi: bool) -> RedisResult {
7472
let argc = input_args.len();
7573
if (!multi && argc != 3) || argc < 3 {
7674
return Err(RedisError::WrongArity);
@@ -88,12 +86,12 @@ pub fn bloom_filter_exists(ctx: &Context, input_args: &Vec<RedisString>, multi:
8886
}
8987
};
9088
if !multi {
91-
let item = &input_args[curr_cmd_idx];
89+
let item = input_args[curr_cmd_idx].as_slice();
9290
return Ok(bloom_filter_item_exists(value, item));
9391
}
9492
let mut result = Vec::new();
9593
while curr_cmd_idx < argc {
96-
let item = &input_args[curr_cmd_idx];
94+
let item = input_args[curr_cmd_idx].as_slice();
9795
result.push(bloom_filter_item_exists(value, item));
9896
curr_cmd_idx += 1;
9997
}
@@ -112,7 +110,7 @@ fn bloom_filter_item_exists(value: Option<&BloomFilterType>, item: &[u8]) -> Red
112110
RedisValue::Integer(0)
113111
}
114112

115-
pub fn bloom_filter_card(ctx: &Context, input_args: &Vec<RedisString>) -> RedisResult {
113+
pub fn bloom_filter_card(ctx: &Context, input_args: &[RedisString]) -> RedisResult {
116114
let argc = input_args.len();
117115
if argc != 2 {
118116
return Err(RedisError::WrongArity);
@@ -133,7 +131,7 @@ pub fn bloom_filter_card(ctx: &Context, input_args: &Vec<RedisString>) -> RedisR
133131
}
134132
}
135133

136-
pub fn bloom_filter_reserve(ctx: &Context, input_args: &Vec<RedisString>) -> RedisResult {
134+
pub fn bloom_filter_reserve(ctx: &Context, input_args: &[RedisString]) -> RedisResult {
137135
let argc = input_args.len();
138136
if !(4..=6).contains(&argc) {
139137
return Err(RedisError::WrongArity);
@@ -202,7 +200,7 @@ pub fn bloom_filter_reserve(ctx: &Context, input_args: &Vec<RedisString>) -> Red
202200
}
203201
}
204202

205-
pub fn bloom_filter_insert(ctx: &Context, input_args: &Vec<RedisString>) -> RedisResult {
203+
pub fn bloom_filter_insert(ctx: &Context, input_args: &[RedisString]) -> RedisResult {
206204
let argc = input_args.len();
207205
// At the very least, we need: BF.INSERT <key> ITEM <item>
208206
if argc < 4 {
@@ -276,9 +274,8 @@ pub fn bloom_filter_insert(ctx: &Context, input_args: &Vec<RedisString>) -> Redi
276274
let mut result = Vec::new();
277275
match value {
278276
Some(bf) => {
279-
for i in idx..argc {
280-
let item = &input_args[i];
281-
result.push(RedisValue::Integer(bf.add_item(item)));
277+
for item in input_args.iter().take(argc).skip(idx) {
278+
result.push(RedisValue::Integer(bf.add_item(item.as_slice())));
282279
}
283280
Ok(RedisValue::Array(result))
284281
}
@@ -287,9 +284,8 @@ pub fn bloom_filter_insert(ctx: &Context, input_args: &Vec<RedisString>) -> Redi
287284
return Err(RedisError::Str("ERR not found"));
288285
}
289286
let mut bf = BloomFilterType::new_reserved(fp_rate, capacity, expansion);
290-
for i in idx..argc {
291-
let item = &input_args[i];
292-
result.push(RedisValue::Integer(bf.add_item(item)));
287+
for item in input_args.iter().take(argc).skip(idx) {
288+
result.push(RedisValue::Integer(bf.add_item(item.as_slice())));
293289
}
294290
match filter_key.set_value(&BLOOM_FILTER_TYPE, bf) {
295291
Ok(_) => {
@@ -303,7 +299,7 @@ pub fn bloom_filter_insert(ctx: &Context, input_args: &Vec<RedisString>) -> Redi
303299
}
304300
}
305301

306-
pub fn bloom_filter_info(ctx: &Context, input_args: &Vec<RedisString>) -> RedisResult {
302+
pub fn bloom_filter_info(ctx: &Context, input_args: &[RedisString]) -> RedisResult {
307303
let argc = input_args.len();
308304
if !(2..=3).contains(&argc) {
309305
return Err(RedisError::WrongArity);
@@ -346,16 +342,17 @@ pub fn bloom_filter_info(ctx: &Context, input_args: &Vec<RedisString>) -> RedisR
346342
}
347343
}
348344
Some(val) if argc == 2 => {
349-
let mut result = Vec::new();
350-
result.push(RedisValue::SimpleStringStatic("Capacity"));
351-
result.push(RedisValue::Integer(val.capacity()));
352-
result.push(RedisValue::SimpleStringStatic("Size"));
353-
result.push(RedisValue::Integer(val.get_memory_usage() as i64));
354-
result.push(RedisValue::SimpleStringStatic("Number of filters"));
355-
result.push(RedisValue::Integer(val.filters.len() as i64));
356-
result.push(RedisValue::SimpleStringStatic("Number of items inserted"));
357-
result.push(RedisValue::Integer(val.cardinality()));
358-
result.push(RedisValue::SimpleStringStatic("Expansion rate"));
345+
let mut result = vec![
346+
RedisValue::SimpleStringStatic("Capacity"),
347+
RedisValue::Integer(val.capacity()),
348+
RedisValue::SimpleStringStatic("Size"),
349+
RedisValue::Integer(val.get_memory_usage() as i64),
350+
RedisValue::SimpleStringStatic("Number of filters"),
351+
RedisValue::Integer(val.filters.len() as i64),
352+
RedisValue::SimpleStringStatic("Number of items inserted"),
353+
RedisValue::Integer(val.cardinality()),
354+
RedisValue::SimpleStringStatic("Expansion rate"),
355+
];
359356
if val.expansion == 0 {
360357
result.push(RedisValue::Integer(-1));
361358
} else {

src/commands/bloom_util.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use bloomfilter::Bloom;
1+
use bloomfilter;
22

33
pub const ERROR: &str = "ERROR";
44

@@ -88,15 +88,15 @@ impl BloomFilterType {
8888

8989
// Structure representing a single bloom filter. 200 Bytes.
9090
pub struct BloomFilter {
91-
pub bloom: Bloom<[u8]>,
91+
pub bloom: bloomfilter::Bloom<[u8]>,
9292
pub num_items: u32,
9393
pub capacity: u32,
9494
}
9595

9696
impl BloomFilter {
9797
pub fn new(fp_rate: f32, capacity: u32) -> BloomFilter {
9898
// Instantiate empty bloom filter.
99-
let bloom = Bloom::new_for_fp_rate(
99+
let bloom = bloomfilter::Bloom::new_for_fp_rate(
100100
capacity as usize,
101101
fp_rate as f64,
102102
);
@@ -108,7 +108,7 @@ impl BloomFilter {
108108
}
109109

110110
pub fn from_existing(bitmap: &[u8], number_of_bits: u64, number_of_hash_functions: u32, sip_keys: [(u64, u64); 2], num_items: u32, capacity: u32) -> BloomFilter {
111-
let bloom = Bloom::from_existing(
111+
let bloom = bloomfilter::Bloom::from_existing(
112112
bitmap,
113113
number_of_bits,
114114
number_of_hash_functions,

0 commit comments

Comments
 (0)