|
18 | 18 | use arrow::array::{
|
19 | 19 | make_array, Array, ArrayRef, BooleanArray, Decimal128Array, FixedSizeBinaryArray,
|
20 | 20 | FixedSizeBinaryBuilder, FixedSizeListBuilder, GenericBinaryArray, GenericStringArray,
|
21 |
| - Int32Array, Int32Builder, Int64Builder, ListArray, ListBuilder, NullArray, OffsetSizeTrait, |
22 |
| - StringArray, StringDictionaryBuilder, StructArray, UnionBuilder, |
| 21 | + Int32Array, Int32Builder, Int64Builder, ListArray, ListBuilder, ListViewBuilder, NullArray, |
| 22 | + OffsetSizeTrait, StringArray, StringDictionaryBuilder, StructArray, UnionBuilder, |
23 | 23 | };
|
24 | 24 | use arrow::datatypes::{Int16Type, Int32Type};
|
25 | 25 | use arrow_array::builder::{StringBuilder, StringViewBuilder, StructBuilder};
|
26 |
| -use arrow_array::{DictionaryArray, FixedSizeListArray, StringViewArray}; |
| 26 | +use arrow_array::{DictionaryArray, FixedSizeListArray, ListViewArray, StringViewArray}; |
27 | 27 | use arrow_buffer::{Buffer, ToByteSlice};
|
28 | 28 | use arrow_data::{ArrayData, ArrayDataBuilder};
|
29 | 29 | use arrow_schema::{DataType, Field, Fields};
|
@@ -1292,3 +1292,136 @@ fn test_list_excess_children_equal() {
|
1292 | 1292 | assert_eq!(b.value_offsets(), &[0, 0, 2]);
|
1293 | 1293 | assert_eq!(a, b);
|
1294 | 1294 | }
|
| 1295 | + |
| 1296 | +fn create_list_view_array<U: AsRef<[i32]>, T: AsRef<[Option<U>]>>(data: T) -> ListViewArray { |
| 1297 | + let mut builder = ListViewBuilder::new(Int32Builder::with_capacity(10)); |
| 1298 | + for d in data.as_ref() { |
| 1299 | + if let Some(v) = d { |
| 1300 | + builder.values().append_slice(v.as_ref()); |
| 1301 | + builder.append(true); |
| 1302 | + } else { |
| 1303 | + builder.append(false); |
| 1304 | + } |
| 1305 | + } |
| 1306 | + builder.finish() |
| 1307 | +} |
| 1308 | + |
| 1309 | +#[test] |
| 1310 | +fn test_list_view_equal() { |
| 1311 | + let a = create_list_view_array([Some(&[1, 2, 3]), Some(&[4, 5, 6])]); |
| 1312 | + let b = create_list_view_array([Some(&[1, 2, 3]), Some(&[4, 5, 6])]); |
| 1313 | + test_equal(&a, &b, true); |
| 1314 | + |
| 1315 | + let b = create_list_view_array([Some(&[1, 2, 3]), Some(&[4, 5, 7])]); |
| 1316 | + test_equal(&a, &b, false); |
| 1317 | +} |
| 1318 | + |
| 1319 | +#[test] |
| 1320 | +fn test_empty_offsets_list_view_equal() { |
| 1321 | + let empty: Vec<i32> = vec![]; |
| 1322 | + let values = Int32Array::from(empty); |
| 1323 | + let empty_offsets: [u8; 0] = []; |
| 1324 | + let empty_sizes: [u8; 0] = []; |
| 1325 | + let a: ListViewArray = ArrayDataBuilder::new(DataType::ListView(Arc::new( |
| 1326 | + Field::new_list_field(DataType::Int32, true), |
| 1327 | + ))) |
| 1328 | + .len(0) |
| 1329 | + .add_buffer(Buffer::from(&empty_offsets)) |
| 1330 | + .add_buffer(Buffer::from(&empty_sizes)) |
| 1331 | + .add_child_data(values.to_data()) |
| 1332 | + .null_bit_buffer(Some(Buffer::from(&empty_offsets))) |
| 1333 | + .build() |
| 1334 | + .unwrap() |
| 1335 | + .into(); |
| 1336 | + |
| 1337 | + let b: ListViewArray = ArrayDataBuilder::new(DataType::ListView(Arc::new( |
| 1338 | + Field::new_list_field(DataType::Int32, true), |
| 1339 | + ))) |
| 1340 | + .len(0) |
| 1341 | + .add_buffer(Buffer::from(&empty_offsets)) |
| 1342 | + .add_buffer(Buffer::from(&empty_sizes)) |
| 1343 | + .add_child_data(values.to_data()) |
| 1344 | + .null_bit_buffer(Some(Buffer::from(&empty_offsets))) |
| 1345 | + .build() |
| 1346 | + .unwrap() |
| 1347 | + .into(); |
| 1348 | + |
| 1349 | + test_equal(&a, &b, true); |
| 1350 | +} |
| 1351 | + |
| 1352 | +// Test the case where null_count > 0 |
| 1353 | +#[test] |
| 1354 | +fn test_list_view_null() { |
| 1355 | + let a = create_list_view_array([Some(&[1, 2]), None, None, Some(&[3, 4]), None, None]); |
| 1356 | + let b = create_list_view_array([Some(&[1, 2]), None, None, Some(&[3, 4]), None, None]); |
| 1357 | + test_equal(&a, &b, true); |
| 1358 | + |
| 1359 | + let b = create_list_view_array([ |
| 1360 | + Some(&[1, 2]), |
| 1361 | + None, |
| 1362 | + Some(&[5, 6]), |
| 1363 | + Some(&[3, 4]), |
| 1364 | + None, |
| 1365 | + None, |
| 1366 | + ]); |
| 1367 | + test_equal(&a, &b, false); |
| 1368 | + |
| 1369 | + let b = create_list_view_array([Some(&[1, 2]), None, None, Some(&[3, 5]), None, None]); |
| 1370 | + test_equal(&a, &b, false); |
| 1371 | + |
| 1372 | + // a list where the nullness of values is determined by the list's bitmap |
| 1373 | + let c_values = Int32Array::from(vec![1, 2, -1, -2, 3, 4, -3, -4]); |
| 1374 | + let c: ListViewArray = ArrayDataBuilder::new(DataType::ListView(Arc::new( |
| 1375 | + Field::new_list_field(DataType::Int32, true), |
| 1376 | + ))) |
| 1377 | + .len(8) |
| 1378 | + .add_buffer(Buffer::from([0i32, 2, 3, 4, 4, 1, 4, 4].to_byte_slice())) |
| 1379 | + .add_buffer(Buffer::from([3i32, 2, 1, 2, 1, 1, 1, 1].to_byte_slice())) |
| 1380 | + .add_child_data(c_values.into_data()) |
| 1381 | + .null_bit_buffer(Some(Buffer::from([0b0001001]))) |
| 1382 | + .build() |
| 1383 | + .unwrap() |
| 1384 | + .into(); |
| 1385 | + |
| 1386 | + let d_values = Int32Array::from(vec![ |
| 1387 | + Some(1), |
| 1388 | + Some(2), |
| 1389 | + Some(-1), |
| 1390 | + None, |
| 1391 | + Some(3), |
| 1392 | + Some(4), |
| 1393 | + None, |
| 1394 | + None, |
| 1395 | + ]); |
| 1396 | + let d: ListViewArray = ArrayDataBuilder::new(DataType::ListView(Arc::new( |
| 1397 | + Field::new_list_field(DataType::Int32, true), |
| 1398 | + ))) |
| 1399 | + .len(8) |
| 1400 | + .add_buffer(Buffer::from([0i32, 2, 3, 4, 4, 1, 4, 4].to_byte_slice())) |
| 1401 | + .add_buffer(Buffer::from([3i32, 2, 1, 2, 1, 1, 1, 1].to_byte_slice())) |
| 1402 | + .add_child_data(d_values.into_data()) |
| 1403 | + .null_bit_buffer(Some(Buffer::from([0b0001001]))) |
| 1404 | + .build() |
| 1405 | + .unwrap() |
| 1406 | + .into(); |
| 1407 | + test_equal(&c, &d, true); |
| 1408 | +} |
| 1409 | + |
| 1410 | +// Test the case where offset != 0 |
| 1411 | +#[test] |
| 1412 | +fn test_list_view_offsets() { |
| 1413 | + let a = create_list_view_array([Some(&[1, 2]), None, None, Some(&[3, 4]), None, None]); |
| 1414 | + let b = create_list_view_array([Some(&[1, 2]), None, None, Some(&[3, 5]), None, None]); |
| 1415 | + |
| 1416 | + let a_slice = a.slice(0, 3); |
| 1417 | + let b_slice = b.slice(0, 3); |
| 1418 | + test_equal(&a_slice, &b_slice, true); |
| 1419 | + |
| 1420 | + let a_slice = a.slice(0, 5); |
| 1421 | + let b_slice = b.slice(0, 5); |
| 1422 | + test_equal(&a_slice, &b_slice, false); |
| 1423 | + |
| 1424 | + let a_slice = a.slice(4, 1); |
| 1425 | + let b_slice = b.slice(4, 1); |
| 1426 | + test_equal(&a_slice, &b_slice, true); |
| 1427 | +} |
0 commit comments