use anyhow::{bail, Result};
use polars::prelude::*;
use crate::parser::Expr;
use super::*;
pub fn eval(args: &[Expr], ctx: &mut Context) -> Result<()> {
if let Some(mut df) = ctx.take_df() {
for arg in args {
let column = args::identifier(arg);
let schema = df
.collect_schema()
.map_err(|e| anyhow!("unnest error: {e}"))?;
match schema.get(&column) {
Some(DataType::List(_)) => {
df = df.explode(vec![col(column)]);
}
Some(DataType::Struct(_)) => {
df = df.unnest([column]);
}
Some(_) => bail!("unnest error: '{column}' is not a list or struct type"),
None => bail!("unnest error: unknown column '{column}'"),
}
}
ctx.set_df(df)?;
} else {
bail!("unnest error: missing input dataframe");
}
Ok(())
}