MCPcopy Create free account
hub / github.com/apache/datafusion / generic_set_lists

Function generic_set_lists

datafusion/functions-nested/src/set_ops.rs:332–392  ·  view source on GitHub ↗
(
    l: &GenericListArray<OffsetSize>,
    r: &GenericListArray<OffsetSize>,
    field: Arc<Field>,
    set_op: SetOp,
)

Source from the content-addressed store, hash-verified

330}
331
332fn 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,

Callers

nothing calls this directly

Calls 11

newFunction · 0.85
value_typeMethod · 0.80
offsetsMethod · 0.80
sliceMethod · 0.80
concatFunction · 0.50
is_emptyMethod · 0.45
is_nullMethod · 0.45
as_usizeMethod · 0.45
lenMethod · 0.45
valuesMethod · 0.45
as_refMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…