use std::sync::Arc;
use datafusion::arrow::array::{
Array, ArrayRef, Float64Array, Int64Array, TimestampMicrosecondArray,
TimestampMillisecondArray, TimestampNanosecondArray, TimestampSecondArray,
};
use datafusion::common::Result as DfResult;
use datafusion::error::DataFusionError;
pub fn extract_f64_values(arr: &ArrayRef) -> DfResult<Vec<f64>> {
if let Some(a) = arr.as_any().downcast_ref::<Float64Array>() {
return Ok(a.values().iter().copied().collect());
}
if let Some(a) = arr.as_any().downcast_ref::<Int64Array>() {
return Ok(a.values().iter().map(|&v| v as f64).collect());
}
Err(DataFusionError::Internal(
"ts_*: expected Float64 or Int64 array".into(),
))
}
pub fn extract_timestamps_ns(arr: &ArrayRef) -> DfResult<Vec<i64>> {
if let Some(a) = arr.as_any().downcast_ref::<TimestampNanosecondArray>() {
return Ok(a.values().iter().copied().collect());
}
if let Some(a) = arr.as_any().downcast_ref::<TimestampMicrosecondArray>() {
return Ok(a.values().iter().map(|&v| v * 1_000).collect());
}
if let Some(a) = arr.as_any().downcast_ref::<TimestampMillisecondArray>() {
return Ok(a.values().iter().map(|&v| v * 1_000_000).collect());
}
if let Some(a) = arr.as_any().downcast_ref::<TimestampSecondArray>() {
return Ok(a.values().iter().map(|&v| v * 1_000_000_000).collect());
}
if let Some(a) = arr.as_any().downcast_ref::<Int64Array>() {
return Ok(a.values().iter().copied().collect());
}
Err(DataFusionError::Internal(
"ts_*: expected Timestamp or Int64 array for time column".into(),
))
}
pub fn option_f64_to_array(values: Vec<Option<f64>>) -> ArrayRef {
Arc::new(Float64Array::from(values))
}
pub fn f64_to_array(values: Vec<f64>) -> ArrayRef {
Arc::new(Float64Array::from(values))
}