use std::sync::Arc;
use arrow::array::{Int64Array, StringArray};
use arrow::datatypes::{DataType, Field, Schema};
use arrow::record_batch::RecordBatch;
use datum::Source;
use datum_sql::DatumSqlContext;
#[tokio::test]
async fn projection_filter_runs_over_datum_source() {
let schema = Arc::new(Schema::new(vec![
Field::new("city", DataType::Utf8, false),
Field::new("temp", DataType::Int64, false),
Field::new("humidity", DataType::Int64, false),
]));
let batch = RecordBatch::try_new(
Arc::clone(&schema),
vec![
Arc::new(StringArray::from(vec!["sf", "nyc", "sea", "aus"])),
Arc::new(Int64Array::from(vec![67, 74, 58, 91])),
Arc::new(Int64Array::from(vec![72, 64, 80, 40])),
],
)
.expect("batch builds");
let context = DatumSqlContext::new();
context
.register_source("weather", schema, Source::from_iter([batch]))
.expect("source registers");
let batches = context
.execute("SELECT city, temp FROM weather WHERE temp >= 70")
.await
.expect("query executes");
assert_eq!(batches.len(), 1);
let output = &batches[0];
assert_eq!(output.num_columns(), 2);
assert_eq!(output.num_rows(), 2);
let city = output
.column(0)
.as_any()
.downcast_ref::<StringArray>()
.expect("city is utf8");
let temp = output
.column(1)
.as_any()
.downcast_ref::<Int64Array>()
.expect("temp is int64");
assert_eq!(city.value(0), "nyc");
assert_eq!(temp.value(0), 74);
assert_eq!(city.value(1), "aus");
assert_eq!(temp.value(1), 91);
}