(
l: &GenericListArray<OffsetSize>,
r: &GenericListArray<OffsetSize>,
field: Arc<Field>,
set_op: SetOp,
)
| 330 | } |
| 331 | |
| 332 | fn generic_set_lists<OffsetSize: OffsetSizeTrait>( |
| 333 | l: &GenericListArray<OffsetSize>, |
| 334 | r: &GenericListArray<OffsetSize>, |
| 335 | field: Arc<Field>, |
| 336 | set_op: SetOp, |
| 337 | ) -> Result<ArrayRef> { |
| 338 | if l.is_empty() || l.value_type().is_null() { |
| 339 | let field = Arc::new(Field::new_list_field(r.value_type(), true)); |
| 340 | return general_array_distinct::<OffsetSize>(r, &field); |
| 341 | } else if r.is_empty() || r.value_type().is_null() { |
| 342 | let field = Arc::new(Field::new_list_field(l.value_type(), true)); |
| 343 | return general_array_distinct::<OffsetSize>(l, &field); |
| 344 | } |
| 345 | |
| 346 | assert_eq_or_internal_err!( |
| 347 | l.value_type(), |
| 348 | r.value_type(), |
| 349 | "{set_op:?} is not implemented for '{l:?}' and '{r:?}'" |
| 350 | ); |
| 351 | |
| 352 | let converter = RowConverter::new(vec![SortField::new(l.value_type())])?; |
| 353 | |
| 354 | // Only convert the visible portion of the values array. For sliced |
| 355 | // ListArrays, values() returns the full underlying array but only |
| 356 | // elements between the first and last offset are referenced. |
| 357 | let l_first = l.offsets()[0].as_usize(); |
| 358 | let l_len = l.offsets()[l.len()].as_usize() - l_first; |
| 359 | let rows_l = converter.convert_columns(&[l.values().slice(l_first, l_len)])?; |
| 360 | |
| 361 | let r_first = r.offsets()[0].as_usize(); |
| 362 | let r_len = r.offsets()[r.len()].as_usize() - r_first; |
| 363 | let rows_r = converter.convert_columns(&[r.values().slice(r_first, r_len)])?; |
| 364 | |
| 365 | // Combine the *sliced* value arrays so 0-based indices from the row |
| 366 | // converter map directly into the concatenated array. |
| 367 | let l_values = l.values().slice(l_first, l_len); |
| 368 | let r_values = r.values().slice(r_first, r_len); |
| 369 | let combined_values = concat(&[l_values.as_ref(), r_values.as_ref()])?; |
| 370 | let r_offset = l_len; |
| 371 | |
| 372 | match set_op { |
| 373 | SetOp::Union => generic_set_loop::<OffsetSize, true>( |
| 374 | l, |
| 375 | r, |
| 376 | &rows_l, |
| 377 | &rows_r, |
| 378 | field, |
| 379 | &combined_values, |
| 380 | r_offset, |
| 381 | ), |
| 382 | SetOp::Intersect => generic_set_loop::<OffsetSize, false>( |
| 383 | l, |
| 384 | r, |
| 385 | &rows_l, |
| 386 | &rows_r, |
| 387 | field, |
| 388 | &combined_values, |
| 389 | r_offset, |
nothing calls this directly
no test coverage detected
searching dependent graphs…