datum-sql 0.10.3

DataFusion and Arrow SQL front end for Datum streams
Documentation
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);
}