alopex-dataframe 0.7.6

Polars-compatible DataFrame API for Alopex DB (v0.1)
Documentation
use std::sync::Arc;

use alopex_dataframe::expr::{col, lit};
use alopex_dataframe::{DataFrame, DataFrameError, Series};
use arrow::array::{ArrayRef, Int64Array};

fn df() -> DataFrame {
    let a: ArrayRef = Arc::new(Int64Array::from(vec![1_i64, 2, 3]));
    let b: ArrayRef = Arc::new(Int64Array::from(vec![10_i64, 20, 30]));
    DataFrame::new(vec![
        Series::from_arrow("a", vec![a]).unwrap(),
        Series::from_arrow("b", vec![b]).unwrap(),
    ])
    .unwrap()
}

#[cfg_attr(not(feature = "lane_ci"), ignore)]
#[test]
fn column_resolution_is_case_sensitive() {
    let df = df();
    let err = df.column("A").unwrap_err();
    assert!(matches!(err, DataFrameError::ColumnNotFound { .. }));
}

#[cfg_attr(not(feature = "lane_ci"), ignore)]
#[test]
fn select_preserves_input_expression_order() {
    let df = df();
    let out = df.select(vec![col("b"), col("a")]).unwrap();
    let names: Vec<_> = out
        .schema()
        .fields()
        .iter()
        .map(|f| f.name().clone())
        .collect();
    assert_eq!(names, vec!["b", "a"]);
}

#[cfg_attr(not(feature = "lane_ci"), ignore)]
#[test]
fn filter_has_expected_semantics() {
    let df = df();
    let out = df.filter(col("a").gt(lit(1_i64))).unwrap();
    assert_eq!(out.height(), 2);
    assert_eq!(out.schema().fields()[0].name(), "a");
    assert_eq!(out.schema().fields()[1].name(), "b");
}