This is an automated email from the ASF dual-hosted git repository.
Jefffrey pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/main by this push:
new 149b3ab23d [Variant] Simplify homogeneous VariantArray test fixtures
(#11272)
149b3ab23d is described below
commit 149b3ab23dc360e9452b2f854b01d2f5fed06f43
Author: Kosta Tarasov <[email protected]>
AuthorDate: Wed Sep 30 04:54:46 2026 -0400
[Variant] Simplify homogeneous VariantArray test fixtures (#11272)
# Which issue does this PR close?
Follow-up to #11053.
# Rationale for this change
#11053 allows `VariantArray` to collect `Option<T>` values directly when
`T` converts into `Variant`. Homogeneous test fixtures can now use
`VariantArray::from_iter([Some(42_i64), None])`, removing explicit
`Variant` conversions and row-by-row builder setup.
# What changes are included in this PR?
Simplify fixtures in the variant array iterator, extraction/conversion,
shredding, and unshredding tests. Preserve value types, row order, null
semantics, and existing assertions. Tests that exercise builders
themselves remain unchanged.
# Are these changes tested?
Existing tests cover the fixture changes:
- `cargo test -p parquet-variant-compute --lib` — 369 passed.
- `cargo clippy -p parquet-variant-compute --all-targets -- -D warnings`
— passed.
- `cargo fmt --all -- --check` — passed.
# Are there any user-facing changes?
No. This is a test-only cleanup; production code and public APIs are
unchanged.
---
parquet-variant-compute/src/shred_variant.rs | 6 +-
parquet-variant-compute/src/unshred_variant.rs | 29 +--
parquet-variant-compute/src/variant_array.rs | 20 +-
parquet-variant-compute/src/variant_get.rs | 300 +++++++++----------------
4 files changed, 122 insertions(+), 233 deletions(-)
diff --git a/parquet-variant-compute/src/shred_variant.rs
b/parquet-variant-compute/src/shred_variant.rs
index 2ad0342ed2..fa603d4f2e 100644
--- a/parquet-variant-compute/src/shred_variant.rs
+++ b/parquet-variant-compute/src/shred_variant.rs
@@ -1172,7 +1172,7 @@ mod tests {
fn test_already_shredded_input_error() {
// Create a VariantArray that already has typed_value_field
// First create a valid VariantArray, then extract its parts to
construct a shredded one
- let temp_array =
VariantArray::from_iter(vec![Some(Variant::from("test"))]);
+ let temp_array = VariantArray::from_iter([Some("test")]);
let metadata = temp_array.metadata_column().clone();
let value = temp_array.value_column().clone();
let typed_value = Arc::new(Int64Array::from(vec![42])) as ArrayRef;
@@ -1206,7 +1206,7 @@ mod tests {
fn test_invalid_fixed_size_binary_shredding() {
let mock_uuid_1 = Uuid::new_v4();
- let input = VariantArray::from_iter([Some(Variant::from(mock_uuid_1)),
None]);
+ let input = VariantArray::from_iter([Some(mock_uuid_1), None]);
// shred_variant only supports FixedSizeBinary(16). Any other length
will err.
let err = shred_variant(&input,
&DataType::FixedSizeBinary(17)).unwrap_err();
@@ -1498,7 +1498,7 @@ mod tests {
#[test]
fn test_invalid_shredded_types_rejected() {
- let input = VariantArray::from_iter([Variant::from(42)]);
+ let input = VariantArray::from_iter([Some(42)]);
let invalid_types = vec![
DataType::UInt8,
diff --git a/parquet-variant-compute/src/unshred_variant.rs
b/parquet-variant-compute/src/unshred_variant.rs
index 40a22a3f54..cc414dadc3 100644
--- a/parquet-variant-compute/src/unshred_variant.rs
+++ b/parquet-variant-compute/src/unshred_variant.rs
@@ -857,9 +857,7 @@ mod tests {
#[test]
fn test_shred_unshred_round_trip_annotates_value_non_nullable() {
- let mut builder = VariantArrayBuilder::new(1);
- builder.append_variant(Variant::from(42i64));
- let original = builder.build();
+ let original = VariantArray::from_iter([Some(42_i64)]);
assert!(!value_field_is_nullable(&original));
let shredded = shred_variant(&original, &DataType::Int64).unwrap();
@@ -892,10 +890,7 @@ mod tests {
#[test]
fn test_unshred_already_unshredded_reannotates_nullable_value() {
- let mut builder = VariantArrayBuilder::new(2);
- builder.append_variant(Variant::from(42i64));
- builder.append_null();
- let original = builder.build();
+ let original = VariantArray::from_iter([Some(42_i64), None]);
// same data, but with the out-of-spec nullable `value` annotation
let nullable_input = VariantArray::from_parts(
@@ -965,18 +960,14 @@ mod tests {
/// shape has its own expansion of `handle_unshredded_case`.
#[test]
fn test_unshred_missing_row_for_decimal_timestamp_object_list() {
- let mut builder = VariantArrayBuilder::new(2);
- builder.append_variant(Variant::from(VariantDecimal8::try_new(1234,
2).unwrap()));
- builder.append_null();
- assert_missing_row_unshreds_to_variant_null(&builder.build(),
&DataType::Decimal64(18, 2));
+ let decimals =
+ VariantArray::from_iter([Some(VariantDecimal8::try_new(1234,
2).unwrap()), None]);
+ assert_missing_row_unshreds_to_variant_null(&decimals,
&DataType::Decimal64(18, 2));
- let mut builder = VariantArrayBuilder::new(2);
- builder.append_variant(Variant::from(
- chrono::DateTime::from_timestamp(1, 0).unwrap(),
- ));
- builder.append_null();
+ let timestamps =
+ VariantArray::from_iter([Some(chrono::DateTime::from_timestamp(1,
0).unwrap()), None]);
assert_missing_row_unshreds_to_variant_null(
- &builder.build(),
+ ×tamps,
&DataType::Timestamp(TimeUnit::Microsecond, Some("UTC".into())),
);
@@ -1010,9 +1001,7 @@ mod tests {
#[test]
fn test_unshred_value_only_with_unmasked_nulls_materializes_variant_null()
{
- let mut builder = VariantArrayBuilder::new(1);
- builder.append_variant(Variant::from(42i64));
- let single = builder.build();
+ let single = VariantArray::from_iter([Some(42_i64)]);
let metadata_bytes =
single.metadata_column().as_binary_view().value(0);
let value_bytes = single.value_column().as_binary_view().value(0);
diff --git a/parquet-variant-compute/src/variant_array.rs
b/parquet-variant-compute/src/variant_array.rs
index d1ac09a364..46cb2abb4f 100644
--- a/parquet-variant-compute/src/variant_array.rs
+++ b/parquet-variant-compute/src/variant_array.rs
@@ -1826,15 +1826,7 @@ mod test {
#[test]
fn test_variant_array_iter_double_ended() {
- let mut b = VariantArrayBuilder::new(5);
-
- b.append_variant(Variant::from(0_i32));
- b.append_null();
- b.append_variant(Variant::from(2_i32));
- b.append_null();
- b.append_variant(Variant::from(4_i32));
-
- let array = b.build();
+ let array = VariantArray::from_iter([Some(0_i32), None, Some(2_i32),
None, Some(4_i32)]);
let mut iter = array.iter();
assert_eq!(iter.next(), Some(Some(Variant::from(0_i32))));
@@ -1850,15 +1842,7 @@ mod test {
#[test]
fn test_variant_array_iter_reverse() {
- let mut b = VariantArrayBuilder::new(5);
-
- b.append_variant(Variant::from("a"));
- b.append_null();
- b.append_variant(Variant::from("aaa"));
- b.append_null();
- b.append_variant(Variant::from("aaaaa"));
-
- let array = b.build();
+ let array = VariantArray::from_iter([Some("a"), None, Some("aaa"),
None, Some("aaaaa")]);
let result: Vec<_> = array.iter().rev().collect();
assert_eq!(
diff --git a/parquet-variant-compute/src/variant_get.rs
b/parquet-variant-compute/src/variant_get.rs
index 63af0dad08..96d634d516 100644
--- a/parquet-variant-compute/src/variant_get.rs
+++ b/parquet-variant-compute/src/variant_get.rs
@@ -3023,9 +3023,7 @@ mod test {
#[test]
fn test_error_message_boolean_type_display() {
- let mut builder = VariantArrayBuilder::new(1);
- builder.append_variant(Variant::from("abcd"));
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef =
ArrayRef::from(VariantArray::from_iter([Some("abcd")]));
// Request Boolean with strict casting to force an error
let options = GetOptions {
@@ -3044,9 +3042,7 @@ mod test {
#[test]
fn test_error_message_numeric_type_display() {
- let mut builder = VariantArrayBuilder::new(1);
- builder.append_variant(Variant::from("abcd"));
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef =
ArrayRef::from(VariantArray::from_iter([Some("abcd")]));
// Request Float32 with strict casting to force an error
let options = GetOptions {
@@ -3065,9 +3061,7 @@ mod test {
#[test]
fn test_error_message_temporal_type_display() {
- let mut builder = VariantArrayBuilder::new(1);
- builder.append_variant(Variant::BooleanFalse);
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef =
ArrayRef::from(VariantArray::from_iter([Some(false)]));
// Request Timestamp with strict casting to force an error
let options = GetOptions {
@@ -3939,15 +3933,15 @@ mod test {
#[test]
fn get_decimal32_scale_down_rounding() {
- let mut builder = crate::VariantArrayBuilder::new(7);
- builder.append_variant(VariantDecimal4::try_new(1235,
0).unwrap().into());
- builder.append_variant(VariantDecimal4::try_new(1245,
0).unwrap().into());
- builder.append_variant(VariantDecimal4::try_new(-1235,
0).unwrap().into());
- builder.append_variant(VariantDecimal4::try_new(-1245,
0).unwrap().into());
- builder.append_variant(VariantDecimal4::try_new(1235,
2).unwrap().into()); // 12.35 rounded down to 10 for scale -1
- builder.append_variant(VariantDecimal4::try_new(1235,
3).unwrap().into()); // 1.235 rounded down to 0 for scale -1
- builder.append_variant(VariantDecimal4::try_new(5235,
3).unwrap().into()); // 5.235 rounded up to 10 for scale -1
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+ Some(VariantDecimal4::try_new(1235, 0).unwrap()),
+ Some(VariantDecimal4::try_new(1245, 0).unwrap()),
+ Some(VariantDecimal4::try_new(-1235, 0).unwrap()),
+ Some(VariantDecimal4::try_new(-1245, 0).unwrap()),
+ Some(VariantDecimal4::try_new(1235, 2).unwrap()), // 12.35 rounded
down to 10 for scale -1
+ Some(VariantDecimal4::try_new(1235, 3).unwrap()), // 1.235 rounded
down to 0 for scale -1
+ Some(VariantDecimal4::try_new(5235, 3).unwrap()), // 5.235 rounded
up to 10 for scale -1
+ ]));
let field = Field::new("result", DataType::Decimal32(9, -1), true);
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(field)));
@@ -3968,18 +3962,10 @@ mod test {
#[test]
fn get_decimal32_large_scale_reduction() {
- let mut builder = crate::VariantArrayBuilder::new(2);
- builder.append_variant(
- VariantDecimal4::try_new(-VariantDecimal4::MAX_UNSCALED_VALUE, 0)
- .unwrap()
- .into(),
- );
- builder.append_variant(
- VariantDecimal4::try_new(VariantDecimal4::MAX_UNSCALED_VALUE, 0)
- .unwrap()
- .into(),
- );
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+
Some(VariantDecimal4::try_new(-VariantDecimal4::MAX_UNSCALED_VALUE,
0).unwrap()),
+ Some(VariantDecimal4::try_new(VariantDecimal4::MAX_UNSCALED_VALUE,
0).unwrap()),
+ ]));
let field = Field::new("result", DataType::Decimal32(9, -9), true);
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(field)));
@@ -4007,18 +3993,11 @@ mod test {
#[test]
fn get_decimal32_precision_overflow_safe() {
// Exceed Decimal32 after scaling and rounding
- let mut builder = crate::VariantArrayBuilder::new(2);
- builder.append_variant(
- VariantDecimal4::try_new(VariantDecimal4::MAX_UNSCALED_VALUE, 0)
- .unwrap()
- .into(),
- );
- builder.append_variant(
- VariantDecimal4::try_new(VariantDecimal4::MAX_UNSCALED_VALUE, 9)
- .unwrap()
- .into(),
- ); // integer value round up overflows
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+ Some(VariantDecimal4::try_new(VariantDecimal4::MAX_UNSCALED_VALUE,
0).unwrap()),
+ // integer value round up overflows
+ Some(VariantDecimal4::try_new(VariantDecimal4::MAX_UNSCALED_VALUE,
9).unwrap()),
+ ]));
let field = Field::new("result", DataType::Decimal32(2, 2), true);
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(field)));
@@ -4031,13 +4010,9 @@ mod test {
#[test]
fn get_decimal32_precision_overflow_unsafe_errors() {
- let mut builder = crate::VariantArrayBuilder::new(1);
- builder.append_variant(
- VariantDecimal4::try_new(VariantDecimal4::MAX_UNSCALED_VALUE, 0)
- .unwrap()
- .into(),
- );
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef =
ArrayRef::from(VariantArray::from_iter([Some(
+ VariantDecimal4::try_new(VariantDecimal4::MAX_UNSCALED_VALUE,
0).unwrap(),
+ )]));
let field = Field::new("result", DataType::Decimal32(9, 2), true);
let cast_options = CastOptions {
@@ -4089,15 +4064,15 @@ mod test {
#[test]
fn get_decimal64_scale_down_rounding() {
- let mut builder = crate::VariantArrayBuilder::new(7);
- builder.append_variant(VariantDecimal8::try_new(1235,
0).unwrap().into());
- builder.append_variant(VariantDecimal8::try_new(1245,
0).unwrap().into());
- builder.append_variant(VariantDecimal8::try_new(-1235,
0).unwrap().into());
- builder.append_variant(VariantDecimal8::try_new(-1245,
0).unwrap().into());
- builder.append_variant(VariantDecimal8::try_new(1235,
2).unwrap().into()); // 12.35 rounded down to 10 for scale -1
- builder.append_variant(VariantDecimal8::try_new(1235,
3).unwrap().into()); // 1.235 rounded down to 0 for scale -1
- builder.append_variant(VariantDecimal8::try_new(5235,
3).unwrap().into()); // 5.235 rounded up to 10 for scale -1
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+ Some(VariantDecimal8::try_new(1235, 0).unwrap()),
+ Some(VariantDecimal8::try_new(1245, 0).unwrap()),
+ Some(VariantDecimal8::try_new(-1235, 0).unwrap()),
+ Some(VariantDecimal8::try_new(-1245, 0).unwrap()),
+ Some(VariantDecimal8::try_new(1235, 2).unwrap()), // 12.35 rounded
down to 10 for scale -1
+ Some(VariantDecimal8::try_new(1235, 3).unwrap()), // 1.235 rounded
down to 0 for scale -1
+ Some(VariantDecimal8::try_new(5235, 3).unwrap()), // 5.235 rounded
up to 10 for scale -1
+ ]));
let field = Field::new("result", DataType::Decimal64(18, -1), true);
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(field)));
@@ -4118,18 +4093,10 @@ mod test {
#[test]
fn get_decimal64_large_scale_reduction() {
- let mut builder = crate::VariantArrayBuilder::new(2);
- builder.append_variant(
- VariantDecimal8::try_new(-VariantDecimal8::MAX_UNSCALED_VALUE, 0)
- .unwrap()
- .into(),
- );
- builder.append_variant(
- VariantDecimal8::try_new(VariantDecimal8::MAX_UNSCALED_VALUE, 0)
- .unwrap()
- .into(),
- );
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+
Some(VariantDecimal8::try_new(-VariantDecimal8::MAX_UNSCALED_VALUE,
0).unwrap()),
+ Some(VariantDecimal8::try_new(VariantDecimal8::MAX_UNSCALED_VALUE,
0).unwrap()),
+ ]));
let field = Field::new("result", DataType::Decimal64(18, -18), true);
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(field)));
@@ -4157,18 +4124,11 @@ mod test {
#[test]
fn get_decimal64_precision_overflow_safe() {
// Exceed Decimal64 after scaling and rounding
- let mut builder = crate::VariantArrayBuilder::new(2);
- builder.append_variant(
- VariantDecimal8::try_new(VariantDecimal8::MAX_UNSCALED_VALUE, 0)
- .unwrap()
- .into(),
- );
- builder.append_variant(
- VariantDecimal8::try_new(VariantDecimal8::MAX_UNSCALED_VALUE, 18)
- .unwrap()
- .into(),
- ); // integer value round up overflows
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+ Some(VariantDecimal8::try_new(VariantDecimal8::MAX_UNSCALED_VALUE,
0).unwrap()),
+ // integer value round up overflows
+ Some(VariantDecimal8::try_new(VariantDecimal8::MAX_UNSCALED_VALUE,
18).unwrap()),
+ ]));
let field = Field::new("result", DataType::Decimal64(2, 2), true);
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(field)));
@@ -4181,13 +4141,9 @@ mod test {
#[test]
fn get_decimal64_precision_overflow_unsafe_errors() {
- let mut builder = crate::VariantArrayBuilder::new(1);
- builder.append_variant(
- VariantDecimal8::try_new(VariantDecimal8::MAX_UNSCALED_VALUE, 0)
- .unwrap()
- .into(),
- );
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef =
ArrayRef::from(VariantArray::from_iter([Some(
+ VariantDecimal8::try_new(VariantDecimal8::MAX_UNSCALED_VALUE,
0).unwrap(),
+ )]));
let field = Field::new("result", DataType::Decimal64(18, 2), true);
let cast_options = CastOptions {
@@ -4208,12 +4164,12 @@ mod test {
#[test]
fn get_decimal128_rescaled_to_scale2() {
- let mut builder = crate::VariantArrayBuilder::new(4);
- builder.append_variant(VariantDecimal16::try_new(1234,
2).unwrap().into());
- builder.append_variant(VariantDecimal16::try_new(1234,
3).unwrap().into());
- builder.append_variant(VariantDecimal16::try_new(1234,
0).unwrap().into());
- builder.append_null();
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+ Some(VariantDecimal16::try_new(1234, 2).unwrap()),
+ Some(VariantDecimal16::try_new(1234, 3).unwrap()),
+ Some(VariantDecimal16::try_new(1234, 0).unwrap()),
+ None,
+ ]));
let field = Field::new("result", DataType::Decimal128(38, 2), true);
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(field)));
@@ -4230,15 +4186,15 @@ mod test {
#[test]
fn get_decimal128_scale_down_rounding() {
- let mut builder = crate::VariantArrayBuilder::new(7);
- builder.append_variant(VariantDecimal16::try_new(1235,
0).unwrap().into());
- builder.append_variant(VariantDecimal16::try_new(1245,
0).unwrap().into());
- builder.append_variant(VariantDecimal16::try_new(-1235,
0).unwrap().into());
- builder.append_variant(VariantDecimal16::try_new(-1245,
0).unwrap().into());
- builder.append_variant(VariantDecimal16::try_new(1235,
2).unwrap().into()); // 12.35 rounded down to 10 for scale -1
- builder.append_variant(VariantDecimal16::try_new(1235,
3).unwrap().into()); // 1.235 rounded down to 0 for scale -1
- builder.append_variant(VariantDecimal16::try_new(5235,
3).unwrap().into()); // 5.235 rounded up to 10 for scale -1
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+ Some(VariantDecimal16::try_new(1235, 0).unwrap()),
+ Some(VariantDecimal16::try_new(1245, 0).unwrap()),
+ Some(VariantDecimal16::try_new(-1235, 0).unwrap()),
+ Some(VariantDecimal16::try_new(-1245, 0).unwrap()),
+ Some(VariantDecimal16::try_new(1235, 2).unwrap()), // 12.35
rounded down to 10 for scale -1
+ Some(VariantDecimal16::try_new(1235, 3).unwrap()), // 1.235
rounded down to 0 for scale -1
+ Some(VariantDecimal16::try_new(5235, 3).unwrap()), // 5.235
rounded up to 10 for scale -1
+ ]));
let field = Field::new("result", DataType::Decimal128(38, -1), true);
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(field)));
@@ -4260,18 +4216,11 @@ mod test {
#[test]
fn get_decimal128_precision_overflow_safe() {
// Exceed Decimal128 after scaling and rounding
- let mut builder = crate::VariantArrayBuilder::new(2);
- builder.append_variant(
- VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE, 0)
- .unwrap()
- .into(),
- );
- builder.append_variant(
- VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE, 38)
- .unwrap()
- .into(),
- ); // integer value round up overflows
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+
Some(VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE,
0).unwrap()),
+ // integer value round up overflows
+
Some(VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE,
38).unwrap()),
+ ]));
let field = Field::new("result", DataType::Decimal128(2, 2), true);
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(field)));
@@ -4284,13 +4233,9 @@ mod test {
#[test]
fn get_decimal128_precision_overflow_unsafe_errors() {
- let mut builder = crate::VariantArrayBuilder::new(1);
- builder.append_variant(
- VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE, 0)
- .unwrap()
- .into(),
- );
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef =
ArrayRef::from(VariantArray::from_iter([Some(
+ VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE,
0).unwrap(),
+ )]));
let field = Field::new("result", DataType::Decimal128(38, 2), true);
let cast_options = CastOptions {
@@ -4310,12 +4255,12 @@ mod test {
#[test]
fn get_decimal256_rescaled_to_scale2() {
// Build unshredded variant values with different scales using
Decimal16 source
- let mut builder = crate::VariantArrayBuilder::new(4);
- builder.append_variant(VariantDecimal16::try_new(1234,
2).unwrap().into()); // 12.34
- builder.append_variant(VariantDecimal16::try_new(1234,
3).unwrap().into()); // 1.234
- builder.append_variant(VariantDecimal16::try_new(1234,
0).unwrap().into()); // 1234
- builder.append_null();
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+ Some(VariantDecimal16::try_new(1234, 2).unwrap()), // 12.34
+ Some(VariantDecimal16::try_new(1234, 3).unwrap()), // 1.234
+ Some(VariantDecimal16::try_new(1234, 0).unwrap()), // 1234
+ None,
+ ]));
let field = Field::new("result", DataType::Decimal256(76, 2), true);
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(field)));
@@ -4332,15 +4277,15 @@ mod test {
#[test]
fn get_decimal256_scale_down_rounding() {
- let mut builder = crate::VariantArrayBuilder::new(7);
- builder.append_variant(VariantDecimal16::try_new(1235,
0).unwrap().into());
- builder.append_variant(VariantDecimal16::try_new(1245,
0).unwrap().into());
- builder.append_variant(VariantDecimal16::try_new(-1235,
0).unwrap().into());
- builder.append_variant(VariantDecimal16::try_new(-1245,
0).unwrap().into());
- builder.append_variant(VariantDecimal16::try_new(1235,
2).unwrap().into()); // 12.35 rounded down to 10 for scale -1
- builder.append_variant(VariantDecimal16::try_new(1235,
3).unwrap().into()); // 1.235 rounded down to 0 for scale -1
- builder.append_variant(VariantDecimal16::try_new(5235,
3).unwrap().into()); // 5.235 rounded up to 10 for scale -1
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+ Some(VariantDecimal16::try_new(1235, 0).unwrap()),
+ Some(VariantDecimal16::try_new(1245, 0).unwrap()),
+ Some(VariantDecimal16::try_new(-1235, 0).unwrap()),
+ Some(VariantDecimal16::try_new(-1245, 0).unwrap()),
+ Some(VariantDecimal16::try_new(1235, 2).unwrap()), // 12.35
rounded down to 10 for scale -1
+ Some(VariantDecimal16::try_new(1235, 3).unwrap()), // 1.235
rounded down to 0 for scale -1
+ Some(VariantDecimal16::try_new(5235, 3).unwrap()), // 5.235
rounded up to 10 for scale -1
+ ]));
let field = Field::new("result", DataType::Decimal256(76, -1), true);
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(field)));
@@ -4362,18 +4307,10 @@ mod test {
#[test]
fn get_decimal256_precision_overflow_safe() {
// Exceed Decimal128 max precision (38) after scaling
- let mut builder = crate::VariantArrayBuilder::new(2);
- builder.append_variant(
- VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE, 1)
- .unwrap()
- .into(),
- );
- builder.append_variant(
- VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE, 0)
- .unwrap()
- .into(),
- );
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+
Some(VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE,
1).unwrap()),
+
Some(VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE,
0).unwrap()),
+ ]));
let field = Field::new("result", DataType::Decimal256(76, 39), true);
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(field)));
@@ -4394,18 +4331,10 @@ mod test {
#[test]
fn get_decimal256_precision_overflow_unsafe_errors() {
// Exceed Decimal128 max precision (38) after scaling
- let mut builder = crate::VariantArrayBuilder::new(2);
- builder.append_variant(
- VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE, 1)
- .unwrap()
- .into(),
- );
- builder.append_variant(
- VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE, 0)
- .unwrap()
- .into(),
- );
- let variant_array: ArrayRef = ArrayRef::from(builder.build());
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+
Some(VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE,
1).unwrap()),
+
Some(VariantDecimal16::try_new(VariantDecimal16::MAX_UNSCALED_VALUE,
0).unwrap()),
+ ]));
let field = Field::new("result", DataType::Decimal256(76, 39), true);
let cast_options = CastOptions {
@@ -4452,11 +4381,11 @@ mod test {
#[test]
fn get_variant_as_dictionary() {
- let variant_array: ArrayRef =
ArrayRef::from(VariantArray::from_iter(vec![
- Some(Variant::from("apple")),
- Some(Variant::from("banana")),
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+ Some("apple"),
+ Some("banana"),
None,
- Some(Variant::from("apple")),
+ Some("apple"),
]));
let data_type = DataType::Dictionary(Box::new(DataType::Int32),
Box::new(DataType::Utf8));
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(Field::new(
@@ -4475,12 +4404,8 @@ mod test {
#[test]
fn get_variant_as_numeric_dictionary() {
- let variant_array: ArrayRef =
ArrayRef::from(VariantArray::from_iter(vec![
- Some(Variant::from(42)),
- Some(Variant::from(7)),
- None,
- Some(Variant::from(42)),
- ]));
+ let variant_array: ArrayRef =
+ ArrayRef::from(VariantArray::from_iter([Some(42), Some(7), None,
Some(42)]));
let data_type = DataType::Dictionary(Box::new(DataType::Int16),
Box::new(DataType::Int32));
let options =
GetOptions::new().with_as_type(Some(FieldRef::from(Field::new(
"dict",
@@ -4498,12 +4423,12 @@ mod test {
#[test]
fn get_variant_as_run_end_encoded() {
- let variant_array: ArrayRef =
ArrayRef::from(VariantArray::from_iter(vec![
- Some(Variant::from("apple")),
- Some(Variant::from("apple")),
+ let variant_array: ArrayRef = ArrayRef::from(VariantArray::from_iter([
+ Some("apple"),
+ Some("apple"),
None,
- Some(Variant::from("banana")),
- Some(Variant::from("banana")),
+ Some("banana"),
+ Some("banana"),
]));
let run_ends = Arc::new(Field::new(
Field::REE_RUN_ENDS_FIELD_DEFAULT_NAME,
@@ -4695,12 +4620,8 @@ mod test {
}
fn invalid_time_variant_array() -> ArrayRef {
- let mut builder = VariantArrayBuilder::new(3);
// 86401000000 is invalid for Time64Microsecond (max is 86400000000)
- builder.append_variant(Variant::Int64(86401000000));
- builder.append_variant(Variant::Int64(86401000000));
- builder.append_variant(Variant::Int64(86401000000));
- Arc::new(builder.build().into_inner())
+ ArrayRef::from(VariantArray::from_iter([Some(86401000000_i64); 3]))
}
#[test]
@@ -5459,10 +5380,7 @@ mod test {
vec![Field::new("encoded", data_type.clone(), true)],
)
.unwrap();
- let mut builder = VariantArrayBuilder::new(2);
- builder.append_variant(Variant::from("apple"));
- builder.append_variant(Variant::from("banana"));
- let array = ArrayRef::from(builder.build());
+ let array = ArrayRef::from(VariantArray::from_iter([Some("apple"),
Some("banana")]));
let options =
union_get_options(&fields,
UnionMode::Dense).with_cast_options(CastOptions {
safe: false,
@@ -5524,9 +5442,9 @@ mod test {
],
)
.unwrap();
- let mut builder = VariantArrayBuilder::new(1);
- builder.append_variant(VariantDecimal4::try_new(12_345,
2).unwrap().into());
- let array = ArrayRef::from(builder.build());
+ let array = ArrayRef::from(VariantArray::from_iter([Some(
+ VariantDecimal4::try_new(12_345, 2).unwrap(),
+ )]));
for safe in [true, false] {
let options =
@@ -5725,9 +5643,7 @@ mod test {
#[test]
fn get_variant_as_union_empty_fields_errors() {
- let mut builder = VariantArrayBuilder::new(1);
- builder.append_variant(Variant::Int8(1));
- let array = ArrayRef::from(builder.build());
+ let array = ArrayRef::from(VariantArray::from_iter([Some(1_i8)]));
let err = variant_get(
&array,