#![warn(missing_docs)]
#![deny(unsafe_code)]
#![allow(clippy::module_name_repetitions)]
pub mod aggregate;
pub mod convert;
pub mod dedup;
pub mod downsample;
pub mod encoded_pushdown;
pub mod error;
pub mod filter;
pub mod memory;
pub mod plan;
pub mod pruning;
pub mod window;
pub use aggregate::AggFn;
pub use aggregate::{AggResult, DecimalTrack, Num};
pub use convert::points_to_record_batch;
pub use encoded_pushdown::{ColumnPredicate, EncodedDomainEvaluator, RowGroupVerdict};
pub use error::QueryError;
pub use memory::MemoryTracker;
pub use plan::{FieldPredicate, QueryBuilder, QueryPlan, ZoneMapOp};
pub use window::WindowFn;
#[must_use]
pub fn column_type_to_arrow(ct: chronix_core::ColumnType) -> arrow::datatypes::DataType {
use arrow::datatypes::DataType;
use chronix_core::ColumnType;
match ct {
ColumnType::Timestamp | ColumnType::I64 => DataType::Int64,
ColumnType::U64 => DataType::UInt64,
ColumnType::F64 => DataType::Float64,
ColumnType::Bool => DataType::Boolean,
ColumnType::String => DataType::Utf8,
ColumnType::Decimal { scale } => DataType::Decimal128(
chronix_core::DECIMAL_PRECISION,
i8::try_from(scale).unwrap_or(0),
),
}
}
#[allow(clippy::cast_precision_loss)]
pub fn extract_f64(col: &dyn arrow::array::Array, index: usize) -> Option<f64> {
use arrow::array::{Decimal128Array, Float64Array, Int64Array, UInt64Array};
if col.is_null(index) {
return None;
}
col.as_any()
.downcast_ref::<Float64Array>()
.map(|a| a.value(index))
.or_else(|| {
col.as_any()
.downcast_ref::<Int64Array>()
.map(|a| a.value(index) as f64)
})
.or_else(|| {
col.as_any()
.downcast_ref::<UInt64Array>()
.map(|a| a.value(index) as f64)
})
.or_else(|| {
col.as_any().downcast_ref::<Decimal128Array>().map(|a| {
let scale = u32::try_from(a.scale()).unwrap_or(0);
a.value(index) as f64 / chronix_core::pow10(scale).unwrap_or(1) as f64
})
})
}