use std::rc::Rc;
#[macro_use]
extern crate criterion;
use criterion::Criterion;
extern crate datafusion;
use datafusion::rel::*;
use datafusion::exec::*;
extern crate serde_json;
fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("filter_primitive", move |b| {
let ctx = ExecutionContext::local("test/data".to_string());
let schema = Schema::new(vec![
Field::new("city", DataType::String, false),
Field::new("lat", DataType::Double, false),
Field::new("lng", DataType::Double, false)]);
let n = 1000;
let batch : Box<Batch> = Box::new(ColumnBatch { columns: vec![
Rc::new(ColumnData::String((0 .. n).map(|_| "city_name".to_string()).collect())),
Rc::new(ColumnData::Double((0 .. n).map(|_| 50.0).collect())),
Rc::new(ColumnData::Double((0 .. n).map(|_| 0.0).collect()))
]});
let filter_expr = Expr::BinaryExpr {
left: Box::new(Expr::Column(1)),
op: Operator::Gt,
right: Box::new(Expr::Literal(Value::Double(52.0)))
};
let ctx = ExecutionContext::local("test/data".to_string());
let compiled_filter_expr = &compile_expr(&ctx, &filter_expr).unwrap();
let batch_ref: &Box<Batch> = &batch;
let col_count = batch.col_count();
b.iter(move || {
let filter_eval: Rc<ColumnData> = (compiled_filter_expr)(batch_ref.as_ref());
let filtered_columns: Vec<Rc<ColumnData>> = (0..col_count)
.map(|column_index| { Rc::new(batch_ref.column(column_index).filter(&filter_eval)) })
.collect();
let filtered_batch: Box<Batch> = Box::new(ColumnBatch { columns: filtered_columns });
})
});
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);