merge_n

Function merge_n 

Source
fn merge_n(
    values: &[ArrayData],
    indices: &[PartialResultIndex],
) -> Result<ArrayRef>
Expand description

Merges elements by index from a list of [ArrayData], creating a new [ColumnarValue] from those values.

Each element in indices is the index of an array in values. The indices array is processed sequentially. The first occurrence of index value n will be mapped to the first value of the array at index n. The second occurrence to the second value, and so on. An index value where PartialResultIndex::is_none is true is used to indicate null values.

§Implementation notes

This algorithm is similar in nature to both zip and interleave, but there are some important differences.

In contrast to zip, this function supports multiple input arrays. Instead of a boolean selection vector, an index array is to take values from the input arrays, and a special marker value is used to indicate null values.

In contrast to interleave, this function does not use pairs of indices. The values in indices serve the same purpose as the first value in the pairs passed to interleave. The index in the array is implicit and is derived from the number of times a particular array index occurs. The more constrained indexing mechanism used by this algorithm makes it easier to copy values in contiguous slices. In the example below, the two subsequent elements from array 2 can be copied in a single operation from the source array instead of copying them one by one. Long spans of null values are also especially cheap because they do not need to be represented in an input array.

§Safety

This function does not check that the number of occurrences of any particular array index matches the length of the corresponding input array. If an array contains more values than required, the spurious values will be ignored. If an array contains fewer values than necessary, this function will panic.

§Example

┌───────────┐  ┌─────────┐                             ┌─────────┐
│┌─────────┐│  │   None  │                             │   NULL  │
││    A    ││  ├─────────┤                             ├─────────┤
│└─────────┘│  │    1    │                             │    B    │
│┌─────────┐│  ├─────────┤                             ├─────────┤
││    B    ││  │    0    │    merge(values, indices)   │    A    │
│└─────────┘│  ├─────────┤  ─────────────────────────▶ ├─────────┤
│┌─────────┐│  │   None  │                             │   NULL  │
││    C    ││  ├─────────┤                             ├─────────┤
│├─────────┤│  │    2    │                             │    C    │
││    D    ││  ├─────────┤                             ├─────────┤
│└─────────┘│  │    2    │                             │    D    │
└───────────┘  └─────────┘                             └─────────┘
   values        indices                                  result