use minarrow::{Array, Field, FieldArray, IntegerArray, MaskedArray, StringArray, Table};
use minarrow::ffi::arrow_dtype::ArrowType;
use minarrow_pyo3::{PyArray, PyRecordBatch};
use pyo3::prelude::*;
fn main() -> PyResult<()> {
pyo3::prepare_freethreaded_python();
Python::with_gil(|py| {
println!("=== MinArrow <-> PyArrow Roundtrip Example ===\n");
test_integer_array_roundtrip(py)?;
test_string_array_roundtrip(py)?;
test_table_roundtrip(py)?;
println!("\n=== All tests passed! ===");
Ok(())
})
}
fn test_integer_array_roundtrip(py: Python<'_>) -> PyResult<()> {
println!("Test 1: Integer Array Roundtrip");
println!("---------------------------------");
let mut arr = IntegerArray::<i32>::default();
arr.push(1);
arr.push(2);
arr.push(3);
arr.push(4);
arr.push(5);
let array = Array::from_int32(arr);
let original_len = array.len();
println!(" Created MinArrow i32 array with {} elements: [1, 2, 3, 4, 5]", original_len);
let py_array = PyArray::from(array);
let py_arrow_array = py_array.into_pyobject(py)?;
println!(" Converted to PyArrow array");
let py_repr: String = py_arrow_array.call_method0("__repr__")?.extract()?;
println!(" PyArrow repr: {}", py_repr.lines().take(3).collect::<Vec<_>>().join(" "));
let roundtrip: PyArray = py_arrow_array.extract()?;
let roundtrip_len = roundtrip.inner().len();
println!(" Converted back to MinArrow array with {} elements", roundtrip_len);
assert_eq!(original_len, roundtrip_len, "Array length mismatch!");
println!(" ✓ Roundtrip successful!\n");
Ok(())
}
fn test_string_array_roundtrip(py: Python<'_>) -> PyResult<()> {
println!("Test 2: String Array Roundtrip");
println!("-------------------------------");
let mut arr = StringArray::<u32>::default();
arr.push_str("hello");
arr.push_str("world");
arr.push_str("from");
arr.push_str("minarrow");
let array = Array::from_string32(arr);
let original_len = array.len();
println!(" Created MinArrow string array with {} elements", original_len);
let py_array = PyArray::from(array);
let py_arrow_array = py_array.into_pyobject(py)?;
println!(" Converted to PyArrow array");
let py_repr: String = py_arrow_array.call_method0("__repr__")?.extract()?;
println!(" PyArrow repr: {}", py_repr.lines().take(3).collect::<Vec<_>>().join(" "));
let roundtrip: PyArray = py_arrow_array.extract()?;
let roundtrip_len = roundtrip.inner().len();
println!(" Converted back to MinArrow array with {} elements", roundtrip_len);
assert_eq!(original_len, roundtrip_len, "Array length mismatch!");
println!(" ✓ Roundtrip successful!\n");
Ok(())
}
fn test_table_roundtrip(py: Python<'_>) -> PyResult<()> {
println!("Test 3: Table/RecordBatch Roundtrip");
println!("------------------------------------");
let mut int_arr = IntegerArray::<i64>::default();
int_arr.push(100);
int_arr.push(200);
int_arr.push(300);
let int_array = Array::from_int64(int_arr);
let mut str_arr = StringArray::<u32>::default();
str_arr.push_str("alpha");
str_arr.push_str("beta");
str_arr.push_str("gamma");
let str_array = Array::from_string32(str_arr);
let field1 = Field::new("id", ArrowType::Int64, false, None);
let field2 = Field::new("name", ArrowType::String, false, None);
let fa1 = FieldArray::new(field1, int_array);
let fa2 = FieldArray::new(field2, str_array);
let table = Table::new("test_table".to_string(), Some(vec![fa1, fa2]));
let original_rows = table.n_rows();
let original_cols = table.n_cols();
println!(" Created MinArrow Table with {} rows x {} columns", original_rows, original_cols);
let py_batch = PyRecordBatch::from(table);
let py_arrow_batch = py_batch.into_pyobject(py)?;
println!(" Converted to PyArrow RecordBatch");
let num_rows: usize = py_arrow_batch.getattr("num_rows")?.extract()?;
let num_cols: usize = py_arrow_batch.getattr("num_columns")?.extract()?;
println!(" PyArrow RecordBatch: {} rows x {} columns", num_rows, num_cols);
let roundtrip: PyRecordBatch = py_arrow_batch.extract()?;
let roundtrip_rows = roundtrip.inner().n_rows();
let roundtrip_cols = roundtrip.inner().n_cols();
println!(" Converted back to MinArrow Table: {} rows x {} columns", roundtrip_rows, roundtrip_cols);
assert_eq!(original_rows, roundtrip_rows, "Row count mismatch!");
assert_eq!(original_cols, roundtrip_cols, "Column count mismatch!");
println!(" ✓ Roundtrip successful!");
Ok(())
}