@@ -1521,4 +1521,143 @@ mod tests {
15211521
15221522 assert_eq ! ( & expected, & got) ;
15231523 }
1524+
1525+ fn test_filter_union_array ( array : UnionArray ) {
1526+ let filter_array = BooleanArray :: from ( vec ! [ true , false , false ] ) ;
1527+ let c = filter ( & array, & filter_array) . unwrap ( ) ;
1528+ let filtered = c. as_any ( ) . downcast_ref :: < UnionArray > ( ) . unwrap ( ) ;
1529+
1530+ let mut builder = UnionBuilder :: new_dense ( 1 ) ;
1531+ builder. append :: < Int32Type > ( "A" , 1 ) . unwrap ( ) ;
1532+ let expected_array = builder. build ( ) . unwrap ( ) ;
1533+
1534+ compare_union_arrays ( filtered, & expected_array) ;
1535+
1536+ let filter_array = BooleanArray :: from ( vec ! [ true , false , true ] ) ;
1537+ let c = filter ( & array, & filter_array) . unwrap ( ) ;
1538+ let filtered = c. as_any ( ) . downcast_ref :: < UnionArray > ( ) . unwrap ( ) ;
1539+
1540+ let mut builder = UnionBuilder :: new_dense ( 2 ) ;
1541+ builder. append :: < Int32Type > ( "A" , 1 ) . unwrap ( ) ;
1542+ builder. append :: < Int32Type > ( "A" , 34 ) . unwrap ( ) ;
1543+ let expected_array = builder. build ( ) . unwrap ( ) ;
1544+
1545+ compare_union_arrays ( filtered, & expected_array) ;
1546+
1547+ let filter_array = BooleanArray :: from ( vec ! [ true , true , false ] ) ;
1548+ let c = filter ( & array, & filter_array) . unwrap ( ) ;
1549+ let filtered = c. as_any ( ) . downcast_ref :: < UnionArray > ( ) . unwrap ( ) ;
1550+
1551+ let mut builder = UnionBuilder :: new_dense ( 2 ) ;
1552+ builder. append :: < Int32Type > ( "A" , 1 ) . unwrap ( ) ;
1553+ builder. append :: < Float64Type > ( "B" , 3.2 ) . unwrap ( ) ;
1554+ let expected_array = builder. build ( ) . unwrap ( ) ;
1555+
1556+ compare_union_arrays ( filtered, & expected_array) ;
1557+ }
1558+
1559+ #[ test]
1560+ fn test_filter_union_array_dense ( ) {
1561+ let mut builder = UnionBuilder :: new_dense ( 3 ) ;
1562+ builder. append :: < Int32Type > ( "A" , 1 ) . unwrap ( ) ;
1563+ builder. append :: < Float64Type > ( "B" , 3.2 ) . unwrap ( ) ;
1564+ builder. append :: < Int32Type > ( "A" , 34 ) . unwrap ( ) ;
1565+ let array = builder. build ( ) . unwrap ( ) ;
1566+
1567+ test_filter_union_array ( array) ;
1568+ }
1569+
1570+ #[ test]
1571+ fn test_filter_union_array_dense_with_nulls ( ) {
1572+ let mut builder = UnionBuilder :: new_dense ( 4 ) ;
1573+ builder. append :: < Int32Type > ( "A" , 1 ) . unwrap ( ) ;
1574+ builder. append :: < Float64Type > ( "B" , 3.2 ) . unwrap ( ) ;
1575+ builder. append_null ( ) . unwrap ( ) ;
1576+ builder. append :: < Int32Type > ( "A" , 34 ) . unwrap ( ) ;
1577+ let array = builder. build ( ) . unwrap ( ) ;
1578+
1579+ let filter_array = BooleanArray :: from ( vec ! [ true , false , true , false ] ) ;
1580+ let c = filter ( & array, & filter_array) . unwrap ( ) ;
1581+ let filtered = c. as_any ( ) . downcast_ref :: < UnionArray > ( ) . unwrap ( ) ;
1582+
1583+ let mut builder = UnionBuilder :: new_dense ( 1 ) ;
1584+ builder. append :: < Int32Type > ( "A" , 1 ) . unwrap ( ) ;
1585+ builder. append_null ( ) . unwrap ( ) ;
1586+ let expected_array = builder. build ( ) . unwrap ( ) ;
1587+
1588+ compare_union_arrays ( filtered, & expected_array) ;
1589+ }
1590+
1591+ #[ test]
1592+ fn test_filter_union_array_sparse ( ) {
1593+ let mut builder = UnionBuilder :: new_sparse ( 3 ) ;
1594+ builder. append :: < Int32Type > ( "A" , 1 ) . unwrap ( ) ;
1595+ builder. append :: < Float64Type > ( "B" , 3.2 ) . unwrap ( ) ;
1596+ builder. append :: < Int32Type > ( "A" , 34 ) . unwrap ( ) ;
1597+ let array = builder. build ( ) . unwrap ( ) ;
1598+
1599+ test_filter_union_array ( array) ;
1600+ }
1601+
1602+ #[ test]
1603+ fn test_filter_union_array_sparse_with_nulls ( ) {
1604+ let mut builder = UnionBuilder :: new_sparse ( 4 ) ;
1605+ builder. append :: < Int32Type > ( "A" , 1 ) . unwrap ( ) ;
1606+ builder. append :: < Float64Type > ( "B" , 3.2 ) . unwrap ( ) ;
1607+ builder. append_null ( ) . unwrap ( ) ;
1608+ builder. append :: < Int32Type > ( "A" , 34 ) . unwrap ( ) ;
1609+ let array = builder. build ( ) . unwrap ( ) ;
1610+
1611+ let filter_array = BooleanArray :: from ( vec ! [ true , false , true , false ] ) ;
1612+ let c = filter ( & array, & filter_array) . unwrap ( ) ;
1613+ let filtered = c. as_any ( ) . downcast_ref :: < UnionArray > ( ) . unwrap ( ) ;
1614+
1615+ let mut builder = UnionBuilder :: new_dense ( 1 ) ;
1616+ builder. append :: < Int32Type > ( "A" , 1 ) . unwrap ( ) ;
1617+ builder. append_null ( ) . unwrap ( ) ;
1618+ let expected_array = builder. build ( ) . unwrap ( ) ;
1619+
1620+ compare_union_arrays ( filtered, & expected_array) ;
1621+ }
1622+
1623+ fn compare_union_arrays ( union1 : & UnionArray , union2 : & UnionArray ) {
1624+ assert_eq ! ( union1. len( ) , union2. len( ) ) ;
1625+
1626+ for i in 0 ..union1. len ( ) {
1627+ let type_id = union1. type_id ( i) ;
1628+
1629+ let slot1 = union1. value ( i) ;
1630+ let slot2 = union2. value ( i) ;
1631+
1632+ assert_eq ! ( union1. is_null( i) , union2. is_null( i) ) ;
1633+
1634+ if !union1. is_null ( i) && !union2. is_null ( i) {
1635+ match type_id {
1636+ 0 => {
1637+ let slot1 = slot1. as_any ( ) . downcast_ref :: < Int32Array > ( ) . unwrap ( ) ;
1638+ assert_eq ! ( slot1. len( ) , 1 ) ;
1639+ let value1 = slot1. value ( 0 ) ;
1640+
1641+ let slot2 = slot2. as_any ( ) . downcast_ref :: < Int32Array > ( ) . unwrap ( ) ;
1642+ assert_eq ! ( slot2. len( ) , 1 ) ;
1643+ let value2 = slot2. value ( 0 ) ;
1644+ assert_eq ! ( value1, value2) ;
1645+ }
1646+ 1 => {
1647+ let slot1 =
1648+ slot1. as_any ( ) . downcast_ref :: < Float64Array > ( ) . unwrap ( ) ;
1649+ assert_eq ! ( slot1. len( ) , 1 ) ;
1650+ let value1 = slot1. value ( 0 ) ;
1651+
1652+ let slot2 =
1653+ slot2. as_any ( ) . downcast_ref :: < Float64Array > ( ) . unwrap ( ) ;
1654+ assert_eq ! ( slot2. len( ) , 1 ) ;
1655+ let value2 = slot2. value ( 0 ) ;
1656+ assert_eq ! ( value1, value2) ;
1657+ }
1658+ _ => unreachable ! ( ) ,
1659+ }
1660+ }
1661+ }
1662+ }
15241663}
0 commit comments