@@ -31,8 +31,6 @@ use arrow_schema::{ArrowError, DataType, FieldRef, UnionMode};
31
31
32
32
use num:: { One , Zero } ;
33
33
34
- use crate :: filter:: { filter_primitive, FilterBuilder } ;
35
-
36
34
/// Take elements by index from [Array], creating a new [Array] from those indexes.
37
35
///
38
36
/// ```text
@@ -251,13 +249,12 @@ fn take_impl<IndexType: ArrowPrimitiveType>(
251
249
let children = fields. iter( )
252
250
. map( |( field_type_id, _) | {
253
251
let mask = BooleanArray :: from_unary( & type_ids, |value_type_id| value_type_id == field_type_id) ;
254
- let predicate = FilterBuilder :: new( & mask) . build( ) ;
255
252
256
- let indices = filter_primitive ( & offsets, & predicate ) ;
253
+ let indices = crate :: filter :: filter ( & offsets, & mask ) ? ;
257
254
258
255
let values = values. child( field_type_id) ;
259
256
260
- take_impl( values, & indices)
257
+ take_impl( values, indices. as_primitive :: < Int32Type > ( ) )
261
258
} )
262
259
. collect:: <Result <_, _>>( ) ?;
263
260
@@ -885,7 +882,7 @@ mod tests {
885
882
use super :: * ;
886
883
use arrow_array:: builder:: * ;
887
884
use arrow_buffer:: { IntervalDayTime , IntervalMonthDayNano } ;
888
- use arrow_schema:: { Field , Fields , TimeUnit } ;
885
+ use arrow_schema:: { Field , Fields , TimeUnit , UnionFields } ;
889
886
890
887
fn test_take_decimal_arrays (
891
888
data : Vec < Option < i128 > > ,
@@ -2308,4 +2305,22 @@ mod tests {
2308
2305
take( & union , & indices, None ) . unwrap( ) . to_data( )
2309
2306
) ;
2310
2307
}
2308
+
2309
+ #[ test]
2310
+ fn test_take_union_dense_all_match_issue_6206 ( ) {
2311
+ let fields = UnionFields :: new ( vec ! [ 0 ] , vec ! [ Field :: new( "a" , DataType :: Int64 , false ) ] ) ;
2312
+ let ints = Arc :: new ( Int64Array :: from ( vec ! [ 1 , 2 , 3 , 4 , 5 ] ) ) ;
2313
+
2314
+ let array = UnionArray :: try_new (
2315
+ fields,
2316
+ ScalarBuffer :: from ( vec ! [ 0_i8 , 0 , 0 , 0 , 0 ] ) ,
2317
+ Some ( ScalarBuffer :: from_iter ( 0_i32 ..5 ) ) ,
2318
+ vec ! [ ints] ,
2319
+ )
2320
+ . unwrap ( ) ;
2321
+
2322
+ let indicies = Int64Array :: from ( vec ! [ 0 , 2 , 4 ] ) ;
2323
+ let array = take ( & array, & indicies, None ) . unwrap ( ) ;
2324
+ assert_eq ! ( array. len( ) , 3 ) ;
2325
+ }
2311
2326
}
0 commit comments