Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
290 changes: 2 additions & 288 deletions src/cast_to_variant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -191,86 +191,13 @@ impl ScalarUDFImpl for CastToVariantUdf {

#[cfg(test)]
mod tests {

use arrow::array::{FixedSizeBinaryBuilder, Int32Array, StringArray, StringViewArray};
use arrow_schema::Fields;
use parquet_variant::Variant;
use parquet_variant_compute::{VariantArray, VariantType};

use crate::shared::{build_variant_array_from_json, build_variant_array_from_json_array};

use super::*;

#[test]
fn test_scalar_float64() {
let udf = CastToVariantUdf::default();

let arg_field = Arc::new(Field::new("input", DataType::Float64, true));
let return_field = Arc::new(Field::new(
"res",
udf.return_type(&[DataType::Float64]).unwrap(),
true,
));

let args = ScalarFunctionArgs {
args: vec![ColumnarValue::Scalar(ScalarValue::Float64(Some(3.25)))],
return_field,
arg_fields: vec![arg_field],
number_rows: Default::default(),
config_options: Default::default(),
};

let res = udf.invoke_with_args(args).unwrap();

let ColumnarValue::Scalar(ScalarValue::Struct(variant_array)) = res else {
panic!("expected struct scalar")
};

let variant_array = VariantArray::try_new(variant_array.as_ref()).unwrap();

assert_eq!(variant_array.value(0), Variant::Double(3.25));
}

#[test]
fn test_array_int32() {
let udf = CastToVariantUdf::default();

let arg_field = Arc::new(Field::new("input", DataType::Int32, true));
let return_field = Arc::new(Field::new(
"res",
udf.return_type(&[DataType::Int32]).unwrap(),
true,
));

let args = ScalarFunctionArgs {
args: vec![ColumnarValue::Array(Arc::new(Int32Array::from(vec![
Some(1),
None,
Some(-5),
])) as ArrayRef)],
return_field,
arg_fields: vec![arg_field],
number_rows: Default::default(),
config_options: Default::default(),
};

let res = udf.invoke_with_args(args).unwrap();

let ColumnarValue::Array(arr) = res else {
panic!("expected array output")
};

let variant_array = VariantArray::try_new(arr.as_ref()).unwrap();

assert_eq!(variant_array.value(0), Variant::Int32(1));
assert!(variant_array.is_null(1));
assert_eq!(variant_array.value(2), Variant::Int32(-5));
}
use arrow_schema::Fields;
use parquet_variant_compute::VariantType;

#[test]
fn test_return_field_extension_type() {
let udf = CastToVariantUdf::default();

let arg_field = Arc::new(Field::new("input", DataType::Utf8, true));

let return_field = udf
Expand All @@ -289,217 +216,4 @@ mod tests {
]))
);
}

#[test]
fn test_scalar_binary_views() {
let expected_variant_array = build_variant_array_from_json(&serde_json::json!({
"name": "norm",
}));

let (input_metadata, input_value) = {
let metadata = expected_variant_array.metadata_field().value(0);
let value = expected_variant_array.value_field().unwrap().value(0);

(metadata, value)
};

let udf = CastToVariantUdf::default();

let metadata_field = Arc::new(Field::new("metadata", DataType::BinaryView, true));
let variant_field = Arc::new(Field::new("value", DataType::BinaryView, true));

let return_field = Arc::new(Field::new(
"res",
udf.return_type(&[DataType::BinaryView, DataType::BinaryView])
.unwrap(),
true,
));

let args = ScalarFunctionArgs {
args: vec![
ColumnarValue::Scalar(ScalarValue::BinaryView(Some(input_metadata.to_vec()))),
ColumnarValue::Scalar(ScalarValue::BinaryView(Some(input_value.to_vec()))),
],
return_field,
arg_fields: vec![metadata_field, variant_field],
number_rows: Default::default(),
config_options: Default::default(),
};

let res = udf.invoke_with_args(args).unwrap();

let ColumnarValue::Scalar(ScalarValue::Struct(variant_array)) = res else {
panic!("expected scalar value struct array")
};

let variant_array = VariantArray::try_new(variant_array.as_ref()).unwrap();

assert_eq!(&variant_array, &expected_variant_array);
}

#[test]
fn test_array_string() {
let udf = CastToVariantUdf::default();

let arg_field = Arc::new(Field::new("input", DataType::Utf8, true));
let return_field = Arc::new(Field::new(
"res",
udf.return_type(&[DataType::Utf8]).unwrap(),
true,
));

let args = ScalarFunctionArgs {
args: vec![ColumnarValue::Array(Arc::new(StringArray::from(vec![
Some("abcdefghijklmnop"),
None,
Some("hello world"),
])) as ArrayRef)],
return_field,
arg_fields: vec![arg_field],
number_rows: Default::default(),
config_options: Default::default(),
};

let res = udf.invoke_with_args(args).unwrap();

let ColumnarValue::Array(arr) = res else {
panic!("expected array output")
};

let variant_array = VariantArray::try_new(arr.as_ref()).unwrap();

assert_eq!(variant_array.value(0), Variant::from("abcdefghijklmnop"));
assert!(variant_array.is_null(1));
assert_eq!(variant_array.value(2), Variant::from("hello world"));
}

#[test]
fn test_fixed_size_binary_uuid_like() {
let udf = CastToVariantUdf::default();

let arg_field = Arc::new(Field::new("input", DataType::FixedSizeBinary(16), true));
let return_field = Arc::new(Field::new(
"res",
udf.return_type(&[DataType::FixedSizeBinary(16)]).unwrap(),
true,
));

let mut builder = FixedSizeBinaryBuilder::with_capacity(3, 16);
builder.append_value([1u8; 16]).unwrap();
builder.append_null();
builder.append_value([2u8; 16]).unwrap();
let array = builder.finish();

let args = ScalarFunctionArgs {
args: vec![ColumnarValue::Array(Arc::new(array) as ArrayRef)],
return_field,
arg_fields: vec![arg_field],
number_rows: Default::default(),
config_options: Default::default(),
};

let res = udf.invoke_with_args(args).unwrap();

let ColumnarValue::Array(arr) = res else {
panic!("expected array output")
};

let variant_array = VariantArray::try_new(arr.as_ref()).unwrap();

assert_eq!(variant_array.value(0), Variant::Binary(&[1u8; 16]));
assert!(variant_array.is_null(1));
assert_eq!(variant_array.value(2), Variant::Binary(&[2u8; 16]));
}

#[test]
fn test_array_binary_views() {
let expected_variant_array = build_variant_array_from_json_array(&[
Some(serde_json::json!({
"name": "norm",
})),
None,
None,
Some(serde_json::json!({
"id": 1,
"parent_id": 0,
"child_ids": [2, 3, 4, 5]
})),
]);

let (input_metadata_array, input_value_array) = {
let metadata = expected_variant_array.metadata_field().clone();
let value = expected_variant_array.value_field().unwrap().clone();

(metadata, value)
};

let udf = CastToVariantUdf::default();

let metadata_field = Arc::new(Field::new("metadata", DataType::BinaryView, true));
let variant_field = Arc::new(Field::new("value", DataType::BinaryView, true));

let return_field = Arc::new(Field::new(
"res",
udf.return_type(&[DataType::BinaryView, DataType::BinaryView])
.unwrap(),
true,
));

let args = ScalarFunctionArgs {
args: vec![
ColumnarValue::Array(Arc::new(input_metadata_array) as ArrayRef),
ColumnarValue::Array(Arc::new(input_value_array) as ArrayRef),
],
return_field,
arg_fields: vec![metadata_field, variant_field],
number_rows: Default::default(),
config_options: Default::default(),
};

let res = udf.invoke_with_args(args).unwrap();

let ColumnarValue::Array(variant_array) = res else {
panic!("expected scalar value struct array")
};

let variant_array = VariantArray::try_new(variant_array.as_ref()).unwrap();

assert_eq!(&variant_array, &expected_variant_array);
}

#[test]
fn test_array_string_view() {
let udf = CastToVariantUdf::default();

let arg_field = Arc::new(Field::new("input", DataType::Utf8View, true));
let return_field = Arc::new(Field::new(
"res",
udf.return_type(&[DataType::Utf8View]).unwrap(),
true,
));

let args = ScalarFunctionArgs {
args: vec![ColumnarValue::Array(Arc::new(StringViewArray::from(vec![
Some("short"),
None,
Some("another"),
])) as ArrayRef)],
return_field,
arg_fields: vec![arg_field],
number_rows: Default::default(),
config_options: Default::default(),
};

let res = udf.invoke_with_args(args).unwrap();

let ColumnarValue::Array(arr) = res else {
panic!("expected array output")
};

let variant_array = VariantArray::try_new(arr.as_ref()).unwrap();

assert_eq!(variant_array.value(0), Variant::from("short"));
assert!(variant_array.is_null(1));
assert_eq!(variant_array.value(2), Variant::from("another"));
}
}
2 changes: 1 addition & 1 deletion tests/sqllogictests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ async fn run_sqllogictests() -> Result<(), Box<dyn std::error::Error>> {
test_files.sort();

for test_file in test_files {
println!("Running test file: {:?}", test_file);
println!("Running test file: {test_file:?}");

let relative_path = test_file
.strip_prefix(&test_files_dir)
Expand Down
Loading