Skip to content

Commit 2c2fbea

Browse files
committed
clippy, fmt, test typo
Added tests for naive filter Fixed the NaiveFilterOperand from_str constructor
1 parent 164de42 commit 2c2fbea

File tree

15 files changed

+212
-131
lines changed

15 files changed

+212
-131
lines changed

benches/filters.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::fs::File;
22
use std::io::{self, BufRead, BufReader};
33

4-
use criterion::{black_box, Criterion, criterion_group, criterion_main};
4+
use criterion::{black_box, criterion_group, criterion_main, Criterion};
55
use serde_json::Value;
66

77
use kafka_delta_ingest::{Filter, FilterEngine, FilterError, FilterFactory};
@@ -25,33 +25,32 @@ fn filtering(filter: &Box<dyn Filter>, values: &Vec<Value>) {
2525
for v in values.into_iter() {
2626
match filter.filter(v) {
2727
Ok(_) => {}
28-
Err(e) => {
29-
match e {
30-
FilterError::FilterSkipMessage => {}
31-
_ => panic!("something wrong"),
32-
}
33-
}
28+
Err(e) => match e {
29+
FilterError::FilterSkipMessage => {}
30+
_ => panic!("something wrong"),
31+
},
3432
};
3533
}
3634
}
3735

3836
fn naive_filter_benchmark(c: &mut Criterion) {
3937
let values = read_json_file(SOURCE_PATH).unwrap();
40-
let filter = FilterFactory::try_build(&FilterEngine::Naive, &vec!("method=='GET'".to_string())).expect("wrong");
38+
let filter = FilterFactory::try_build(&FilterEngine::Naive, &vec!["method=='GET'".to_string()])
39+
.expect("wrong");
4140
c.bench_function("naive_filter_benchmark", |b| {
4241
b.iter(|| filtering(&filter, black_box(&values)))
4342
});
4443
}
4544

46-
4745
fn jmespath_filter_benchmark(c: &mut Criterion) {
4846
let values = read_json_file(SOURCE_PATH).unwrap();
49-
let filter = FilterFactory::try_build(&FilterEngine::Jmespath, &vec!("method=='GET'".to_string())).expect("wrong");
47+
let filter =
48+
FilterFactory::try_build(&FilterEngine::Jmespath, &vec!["method=='GET'".to_string()])
49+
.expect("wrong");
5050
c.bench_function("jmespath_filter_benchmark", |b| {
5151
b.iter(|| filtering(&filter, black_box(&values)))
5252
});
5353
}
5454

55-
5655
criterion_group!(benches, naive_filter_benchmark, jmespath_filter_benchmark);
5756
criterion_main!(benches);

src/filters/error.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use jmespatch::JmespathError;
2-
use serde_json;
32

43
use crate::filters::naive_filter::error::NaiveFilterError;
54

@@ -37,11 +36,11 @@ pub enum FilterError {
3736
source: serde_json::Error,
3837
},
3938

40-
/// Not found filter engine
41-
#[error("Not found filter engine: {reason}")]
39+
/// Filter engine not found
40+
#[error("Filter engine not found: {name}")]
4241
NotFound {
43-
///
44-
reason: String
42+
/// Wrong name
43+
name: String,
4544
},
4645

4746
/// Error returned for skipping message

src/filters/filter.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ use crate::filters::FilterError;
55
/// Trait for implementing a filter mechanism
66
pub trait Filter: Send {
77
/// Constructor
8-
fn from_filters(filters: &Vec<String>) -> Result<Self, FilterError> where Self: Sized;
8+
fn from_filters(filters: &[String]) -> Result<Self, FilterError>
9+
where
10+
Self: Sized;
911

1012
/// A function that filters a message. If any of the filters fail, it throws an error;
1113
/// if all filters pass, it returns nothing.
1214
fn filter(&self, message: &Value) -> Result<(), FilterError>;
13-
}
15+
}

src/filters/filter_factory.rs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,26 @@ pub enum FilterEngine {
66
/// Filter for simple comparisons that works a little faster
77
Naive,
88
/// Filter for complex comparisons
9-
Jmespath
9+
Jmespath,
1010
}
1111

1212
/// Factory for creating and managing filters
1313
pub struct FilterFactory {}
1414
impl FilterFactory {
1515
/// Factory for creating filter instances
1616
pub fn try_build(
17-
filter_engine: &FilterEngine, filters: &Vec<String>
17+
filter_engine: &FilterEngine,
18+
filters: &[String],
1819
) -> Result<Box<dyn Filter>, FilterError> {
1920
match filter_engine {
20-
FilterEngine::Naive => {
21-
match NaiveFilter::from_filters(filters) {
22-
Ok(f) => {Ok(Box::new(f))}
23-
Err(e) => {Err(e)}
24-
}
25-
}
26-
FilterEngine::Jmespath => {
27-
match JmespathFilter::from_filters(filters) {
28-
Ok(f) => {Ok(Box::new(f))}
29-
Err(e) => {Err(e)}
30-
}
31-
}
21+
FilterEngine::Naive => match NaiveFilter::from_filters(filters) {
22+
Ok(f) => Ok(Box::new(f)),
23+
Err(e) => Err(e),
24+
},
25+
FilterEngine::Jmespath => match JmespathFilter::from_filters(filters) {
26+
Ok(f) => Ok(Box::new(f)),
27+
Err(e) => Err(e),
28+
},
3229
}
3330
}
34-
}
31+
}

src/filters/jmespath_filter/custom_functions.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use std::convert::TryFrom;
22
use std::sync::Arc;
33

4-
use jmespatch::{Context, ErrorReason, JmespathError, Rcvar, Variable};
54
use jmespatch::functions::{ArgumentType, CustomFunction, Signature};
5+
use jmespatch::{Context, ErrorReason, JmespathError, Rcvar, Variable};
66

77
/// Custom function to compare two string values in a case-insensitive manner
88
fn eq_ignore_case(args: &[Rcvar], context: &mut Context) -> Result<Rcvar, JmespathError> {
@@ -38,4 +38,4 @@ pub fn create_eq_ignore_case_function() -> CustomFunction {
3838
Signature::new(vec![ArgumentType::String, ArgumentType::String], None),
3939
Box::new(eq_ignore_case),
4040
)
41-
}
41+
}

src/filters/jmespath_filter/filter.rs

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use jmespatch::{Expression, Runtime};
22
use serde_json::Value;
33

44
use crate::filters::filter::Filter;
5-
use crate::filters::FilterError;
65
use crate::filters::jmespath_filter::custom_functions::create_eq_ignore_case_function;
6+
use crate::filters::FilterError;
77

88
lazy_static! {
99
static ref FILTER_RUNTIME: Runtime = {
@@ -14,7 +14,6 @@ lazy_static! {
1414
};
1515
}
1616

17-
1817
/// Implementation of the [Filter] trait for complex checks, such as checking for
1918
/// the presence of a key in an object or comparing the second value in an array
2019
/// or check array length.
@@ -24,7 +23,7 @@ pub struct JmespathFilter {
2423
}
2524

2625
impl Filter for JmespathFilter {
27-
fn from_filters(filters: &Vec<String>) -> Result<Self, FilterError> {
26+
fn from_filters(filters: &[String]) -> Result<Self, FilterError> {
2827
let filters = filters
2928
.iter()
3029
.map(|f| {
@@ -48,18 +47,17 @@ impl Filter for JmespathFilter {
4847
match filter.search(message) {
4948
Err(e) => return Err(FilterError::JmespathError { source: e }),
5049
Ok(v) => {
51-
if v.as_boolean().unwrap() == false {
50+
if !v.as_boolean().unwrap() {
5251
return Err(FilterError::FilterSkipMessage);
5352
}
5453
}
5554
};
5655
}
5756

58-
return Ok(());
57+
Ok(())
5958
}
6059
}
6160

62-
6361
#[cfg(test)]
6462
mod tests {
6563
use std::fs::File;
@@ -89,22 +87,22 @@ mod tests {
8987

9088
for v in values.into_iter() {
9189
match filter.filter(&v) {
92-
Ok(_) => { passed_messages += 1 }
93-
Err(FilterError::FilterSkipMessage) => {
94-
filtered_messages += 1
95-
}
96-
Err(e) => panic!("{}", e)
90+
Ok(_) => passed_messages += 1,
91+
Err(FilterError::FilterSkipMessage) => filtered_messages += 1,
92+
Err(e) => panic!("{}", e),
9793
}
9894
}
9995

100-
return (passed_messages, filtered_messages)
96+
return (passed_messages, filtered_messages);
10197
}
10298
#[test]
10399
fn equal() {
104100
let values = read_json_file(SOURCE_PATH).unwrap();
105-
let filter = match JmespathFilter::from_filters(&vec!["session_id=='a8a3d0e3-7b4e-4f17-b264-76cb792bdb96'".to_string()]) {
101+
let filter = match JmespathFilter::from_filters(&vec![
102+
"session_id=='a8a3d0e3-7b4e-4f17-b264-76cb792bdb96'".to_string(),
103+
]) {
106104
Ok(f) => f,
107-
Err(e) => panic!("{}", e)
105+
Err(e) => panic!("{}", e),
108106
};
109107

110108
let (passed_messages, filtered_messages) = run_filter(&filter, &values);
@@ -115,9 +113,11 @@ mod tests {
115113
#[test]
116114
fn eq_ignore_case() {
117115
let values = read_json_file(SOURCE_PATH).unwrap();
118-
let filter = match JmespathFilter::from_filters(&vec!["eq_ignore_case(method, 'get')".to_string()]) {
116+
let filter = match JmespathFilter::from_filters(&vec![
117+
"eq_ignore_case(method, 'get')".to_string()
118+
]) {
119119
Ok(f) => f,
120-
Err(e) => panic!("{}", e)
120+
Err(e) => panic!("{}", e),
121121
};
122122

123123
let (passed_messages, filtered_messages) = run_filter(&filter, &values);
@@ -129,9 +129,11 @@ mod tests {
129129
#[test]
130130
fn or_condition() {
131131
let values = read_json_file(SOURCE_PATH).unwrap();
132-
let filter = match JmespathFilter::from_filters(&vec!["(status == `404` || method == 'GET')".to_string()]) {
132+
let filter = match JmespathFilter::from_filters(&vec![
133+
"(status == `404` || method == 'GET')".to_string(),
134+
]) {
133135
Ok(f) => f,
134-
Err(e) => panic!("{}", e)
136+
Err(e) => panic!("{}", e),
135137
};
136138

137139
let (passed_messages, filtered_messages) = run_filter(&filter, &values);
@@ -158,14 +160,16 @@ mod tests {
158160
.iter()
159161
.map(|line| serde_json::from_str::<Value>(&line).unwrap())
160162
.collect();
161-
let filter = match JmespathFilter::from_filters(&vec!["!contains(keys(@), 'status') || (status == '1' && age >= `26`)".to_string()]) {
163+
let filter = match JmespathFilter::from_filters(&vec![
164+
"!contains(keys(@), 'status') || (status == '1' && age >= `26`)".to_string(),
165+
]) {
162166
Ok(f) => f,
163-
Err(e) => panic!("{}", e)
167+
Err(e) => panic!("{}", e),
164168
};
165169

166170
let (passed_messages, filtered_messages) = run_filter(&filter, &values);
167171

168172
assert_eq!(7, passed_messages);
169173
assert_eq!(3, filtered_messages);
170174
}
171-
}
175+
}

src/filters/jmespath_filter/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
pub(super) mod filter;
21
mod custom_functions;
2+
pub(super) mod filter;

src/filters/mod.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ pub use filter_factory::{FilterEngine, FilterFactory};
44
pub(crate) use jmespath_filter::filter::JmespathFilter;
55
pub(crate) use naive_filter::filter::NaiveFilter;
66

7-
mod naive_filter;
8-
mod jmespath_filter;
97
mod error;
108
mod filter;
119
mod filter_factory;
12-
10+
mod jmespath_filter;
11+
mod naive_filter;

src/filters/naive_filter/error.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use serde_json;
2-
31
#[derive(thiserror::Error, Debug)]
42
pub enum NaiveFilterError {
53
/// Error from [`serde_json`]
@@ -9,7 +7,7 @@ pub enum NaiveFilterError {
97
#[from]
108
source: serde_json::Error,
119
},
12-
10+
1311
/// Error occurs when trying to execute a filter
1412
#[error("NaiveFilter execution error: {reason}")]
1513
RuntimeError { reason: String },

0 commit comments

Comments
 (0)