micromegas-analytics 0.11.0

analytics module of micromegas
Documentation
use anyhow::Result;
use chrono::{DateTime, Utc};
use datafusion::prelude::*;
use datafusion::{
    arrow::array::TimestampNanosecondArray,
    functions_aggregate::min_max::{max, min},
};

use super::typed_column::typed_column;

pub async fn min_max_time_dataframe(
    df: DataFrame,
    min_time_column_name: &str,
    max_time_column_name: &str,
) -> Result<(DateTime<Utc>, DateTime<Utc>)> {
    let df = df.aggregate(
        vec![],
        vec![
            min(col(min_time_column_name)),
            max(col(max_time_column_name)),
        ],
    )?;
    let minmax = df.collect().await?;
    if minmax.len() != 1 {
        anyhow::bail!("expected minmax to be size 1");
    }
    let minmax = &minmax[0];
    let min_column: &TimestampNanosecondArray = typed_column(minmax, 0)?;
    let max_column: &TimestampNanosecondArray = typed_column(minmax, 1)?;
    if min_column.is_empty() || max_column.is_empty() {
        anyhow::bail!("expected minmax to be size 1");
    }
    Ok((
        DateTime::from_timestamp_nanos(min_column.value(0)),
        DateTime::from_timestamp_nanos(max_column.value(0)),
    ))
}