nodedb-lite 0.1.0

Embedded edge client for NodeDB — offline vector search, graph traversal, and CRDT sync
Documentation
//! Arrow schema construction for strict collections.

use std::sync::Arc;

use nodedb_types::columnar::{ColumnType, StrictSchema};

/// Convert an Arrow `DataType` from a `ColumnType` (for schema construction).
pub fn column_type_to_arrow(ct: &ColumnType) -> arrow::datatypes::DataType {
    match ct {
        ColumnType::Int64 => arrow::datatypes::DataType::Int64,
        ColumnType::Float64 => arrow::datatypes::DataType::Float64,
        ColumnType::String => arrow::datatypes::DataType::Utf8,
        ColumnType::Bool => arrow::datatypes::DataType::Boolean,
        ColumnType::Bytes | ColumnType::Geometry | ColumnType::Json => {
            arrow::datatypes::DataType::Binary
        }
        ColumnType::Timestamp | ColumnType::SystemTimestamp => {
            arrow::datatypes::DataType::Timestamp(arrow::datatypes::TimeUnit::Microsecond, None)
        }
        ColumnType::Decimal { .. } => arrow::datatypes::DataType::Utf8, // Lossless string representation
        ColumnType::Uuid => arrow::datatypes::DataType::Utf8,
        ColumnType::Ulid => arrow::datatypes::DataType::Utf8,
        ColumnType::Duration => arrow::datatypes::DataType::Int64,
        ColumnType::Regex => arrow::datatypes::DataType::Utf8,
        ColumnType::Array | ColumnType::Set | ColumnType::Range | ColumnType::Record => {
            arrow::datatypes::DataType::Binary
        }
        ColumnType::Vector(_) => arrow::datatypes::DataType::Binary, // Packed f32 bytes
        _ => arrow::datatypes::DataType::Binary,
    }
}

/// Build an Arrow schema from a StrictSchema (for DataFusion table registration).
pub fn strict_schema_to_arrow(schema: &StrictSchema) -> arrow::datatypes::SchemaRef {
    use arrow::datatypes::{Field, Schema};
    let fields: Vec<Field> = schema
        .columns
        .iter()
        .map(|col| {
            Field::new(
                &col.name,
                column_type_to_arrow(&col.column_type),
                col.nullable,
            )
        })
        .collect();
    Arc::new(Schema::new(fields))
}