Skip to content

Commit add6944

Browse files
authored
feat: exploit PiecewiseSequence for faster take (#8802)
1. Extension pushes take down into its children. This ensures extension types benefit from the other PiecewiseSequence optimizations. 2. Ensure `List(List(...(List(Primitive))).take(indices)` keeps broadening the slices all the way down to the Primitive array. 3. Implement list view rebuild using PiecewiseSequence, since rebuild is just take anyway! --------- Signed-off-by: Daniel King <dan@spiraldb.com>
1 parent 2ea51cb commit add6944

5 files changed

Lines changed: 1085 additions & 82 deletions

File tree

vortex-array/src/arrays/extension/compute/rules.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use crate::arrays::ConstantArray;
1111
use crate::arrays::Extension;
1212
use crate::arrays::ExtensionArray;
1313
use crate::arrays::Filter;
14+
use crate::arrays::dict::TakeReduceAdaptor;
1415
use crate::arrays::extension::ExtensionArrayExt;
1516
use crate::arrays::filter::FilterReduceAdaptor;
1617
use crate::arrays::slice::SliceReduceAdaptor;
@@ -50,6 +51,7 @@ pub(crate) const PARENT_RULES: ParentRuleSet<Extension> = ParentRuleSet::new(&[
5051
ParentRuleSet::lift(&FilterReduceAdaptor(Extension)),
5152
ParentRuleSet::lift(&MaskReduceAdaptor(Extension)),
5253
ParentRuleSet::lift(&SliceReduceAdaptor(Extension)),
54+
ParentRuleSet::lift(&TakeReduceAdaptor(Extension)),
5355
]);
5456

5557
/// Push filter operations into the storage array of an extension array.

vortex-array/src/arrays/extension/compute/take.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,24 @@ use crate::array::ArrayView;
1010
use crate::arrays::Extension;
1111
use crate::arrays::ExtensionArray;
1212
use crate::arrays::dict::TakeExecute;
13+
use crate::arrays::dict::TakeReduce;
1314
use crate::arrays::extension::ExtensionArrayExt;
1415

16+
impl TakeReduce for Extension {
17+
fn take(array: ArrayView<'_, Extension>, indices: &ArrayRef) -> VortexResult<Option<ArrayRef>> {
18+
let taken_storage = array.storage_array().take(indices.clone())?;
19+
Ok(Some(
20+
ExtensionArray::new(
21+
array
22+
.ext_dtype()
23+
.with_nullability(taken_storage.dtype().nullability()),
24+
taken_storage,
25+
)
26+
.into_array(),
27+
))
28+
}
29+
}
30+
1531
impl TakeExecute for Extension {
1632
fn take(
1733
array: ArrayView<'_, Extension>,

0 commit comments

Comments
 (0)