44use std:: ops:: { BitAnd , BitOr , Not } ;
55
66use vortex_buffer:: BitBuffer ;
7+ use vortex_error:: VortexExpect ;
78use vortex_mask:: Mask ;
89use vortex_vector:: { BoolVector , VectorOps } ;
910
@@ -15,56 +16,74 @@ impl LogicalAndKleene for &BoolVector {
1516 fn and_kleene ( self , rhs : Self ) -> Self :: Output {
1617 match ( self . validity ( ) , rhs. validity ( ) ) {
1718 ( Mask :: AllTrue ( _) , Mask :: AllTrue ( _) ) => {
18- BoolVector :: new ( self . bits ( ) . bitand ( rhs. bits ( ) ) , Mask :: new_true ( self . len ( ) ) )
19+ BoolVector :: try_new ( self . bits ( ) . bitand ( rhs. bits ( ) ) , Mask :: new_true ( self . len ( ) ) )
20+ . vortex_expect (
21+ "`BoolVector` bits and validity somehow did not have the same length" ,
22+ )
1923 }
2024 ( Mask :: AllTrue ( _) , Mask :: AllFalse ( _) ) => {
2125 // self valid, rhs all null
2226 // Result: false where self is false (valid), null where self is true
2327 let result_bits = BitBuffer :: new_unset ( self . len ( ) ) ;
2428 let validity = self . bits ( ) . not ( ) ; // valid where self is false
25- BoolVector :: new ( result_bits, Mask :: from ( validity) )
29+ BoolVector :: try_new ( result_bits, Mask :: from ( validity) ) . vortex_expect (
30+ "`BoolVector` bits and validity somehow did not have the same length" ,
31+ )
2632 }
2733 ( Mask :: AllFalse ( _) , Mask :: AllTrue ( _) ) => {
2834 // self all null, rhs valid
2935 // Result: false where rhs is false (valid), null where rhs is true
3036 let result_bits = BitBuffer :: new_unset ( self . len ( ) ) ;
3137 let validity = rhs. bits ( ) . not ( ) ; // valid where rhs is false
32- BoolVector :: new ( result_bits, Mask :: from ( validity) )
38+ BoolVector :: try_new ( result_bits, Mask :: from ( validity) ) . vortex_expect (
39+ "`BoolVector` bits and validity somehow did not have the same length" ,
40+ )
3341 }
3442 ( Mask :: AllFalse ( _) , Mask :: AllFalse ( _) ) => {
3543 // All values are null
36- BoolVector :: new (
44+ BoolVector :: try_new (
3745 BitBuffer :: new_unset ( self . len ( ) ) ,
3846 Mask :: new_false ( self . len ( ) ) ,
3947 )
48+ . vortex_expect (
49+ "`BoolVector` bits and validity somehow did not have the same length" ,
50+ )
4051 }
4152 ( Mask :: Values ( lv) , Mask :: AllTrue ( _) ) => {
4253 // self partial validity, rhs all valid
4354 // Result valid where self valid OR self is null but rhs is false
4455 let result_bits = self . bits ( ) . bitand ( rhs. bits ( ) ) ;
4556 let validity = lv. bit_buffer ( ) . bitor ( & rhs. bits ( ) . not ( ) ) ;
46- BoolVector :: new ( result_bits, Mask :: from ( validity) )
57+ BoolVector :: try_new ( result_bits, Mask :: from ( validity) ) . vortex_expect (
58+ "`BoolVector` bits and validity somehow did not have the same length" ,
59+ )
4760 }
4861 ( Mask :: AllTrue ( _) , Mask :: Values ( rv) ) => {
4962 // self all valid, rhs partial validity
5063 // Result valid where rhs valid OR rhs is null but self is false
5164 let result_bits = self . bits ( ) . bitand ( rhs. bits ( ) ) ;
5265 let validity = rv. bit_buffer ( ) . bitor ( & self . bits ( ) . not ( ) ) ;
53- BoolVector :: new ( result_bits, Mask :: from ( validity) )
66+ BoolVector :: try_new ( result_bits, Mask :: from ( validity) ) . vortex_expect (
67+ "`BoolVector` bits and validity somehow did not have the same length" ,
68+ )
5469 }
5570 ( Mask :: Values ( lv) , Mask :: AllFalse ( _) ) => {
5671 // self partial validity, rhs all null
5772 // Result: false where self is false (valid), null otherwise
5873 let result_bits = BitBuffer :: new_unset ( self . len ( ) ) ;
5974 let validity = lv. bit_buffer ( ) . bitand ( & self . bits ( ) . not ( ) ) ;
60- BoolVector :: new ( result_bits, Mask :: from ( validity) )
75+ BoolVector :: try_new ( result_bits, Mask :: from ( validity) ) . vortex_expect (
76+ "`BoolVector` bits and validity somehow did not have the same length" ,
77+ )
6178 }
6279 ( Mask :: AllFalse ( _) , Mask :: Values ( rv) ) => {
6380 // self all null, rhs partial validity
6481 // Result: false where rhs is false (valid), null otherwise
6582 let result_bits = BitBuffer :: new_unset ( self . len ( ) ) ;
6683 let validity = rv. bit_buffer ( ) . bitand ( & rhs. bits ( ) . not ( ) ) ;
67- BoolVector :: new ( result_bits, Mask :: from ( validity) )
84+ BoolVector :: try_new ( result_bits, Mask :: from ( validity) ) . vortex_expect (
85+ "`BoolVector` bits and validity somehow did not have the same length" ,
86+ )
6887 }
6988 ( Mask :: Values ( lv) , Mask :: Values ( rv) ) => {
7089 // Both have partial validity
@@ -88,7 +107,9 @@ impl LogicalAndKleene for &BoolVector {
88107 let validity = both_valid
89108 . bitor ( & self_null_rhs_false)
90109 . bitor ( & rhs_null_self_false) ;
91- BoolVector :: new ( result_bits, Mask :: from ( validity) )
110+ BoolVector :: try_new ( result_bits, Mask :: from ( validity) ) . vortex_expect (
111+ "`BoolVector` bits and validity somehow did not have the same length" ,
112+ )
92113 }
93114 }
94115 }
@@ -113,8 +134,8 @@ mod tests {
113134 #[ test]
114135 fn test_and_kleene_all_valid ( ) {
115136 // When both sides are all valid, behaves like regular AND
116- let left = BoolVector :: new ( bitbuffer ! [ 1 0 1 ] , Mask :: new_true ( 3 ) ) ;
117- let right = BoolVector :: new ( bitbuffer ! [ 1 1 0 ] , Mask :: new_true ( 3 ) ) ;
137+ let left = BoolVector :: try_new ( bitbuffer ! [ 1 0 1 ] , Mask :: new_true ( 3 ) ) . unwrap ( ) ;
138+ let right = BoolVector :: try_new ( bitbuffer ! [ 1 1 0 ] , Mask :: new_true ( 3 ) ) . unwrap ( ) ;
118139
119140 let result = left. and_kleene ( & right) ;
120141 assert_eq ! ( result. bits( ) , & bitbuffer![ 1 0 0 ] ) ;
@@ -124,8 +145,8 @@ mod tests {
124145 #[ test]
125146 fn test_and_kleene_all_null ( ) {
126147 // When both are null, result is all null
127- let left = BoolVector :: new ( bitbuffer ! [ 1 1 ] , Mask :: new_false ( 2 ) ) ;
128- let right = BoolVector :: new ( bitbuffer ! [ 1 1 ] , Mask :: new_false ( 2 ) ) ;
148+ let left = BoolVector :: try_new ( bitbuffer ! [ 1 1 ] , Mask :: new_false ( 2 ) ) . unwrap ( ) ;
149+ let right = BoolVector :: try_new ( bitbuffer ! [ 1 1 ] , Mask :: new_false ( 2 ) ) . unwrap ( ) ;
129150
130151 let result = left. and_kleene ( & right) ;
131152 assert_eq ! ( result. validity( ) , & Mask :: new_false( 2 ) ) ;
@@ -134,8 +155,8 @@ mod tests {
134155 #[ test]
135156 fn test_and_kleene_false_and_null ( ) {
136157 // false AND null = false (Kleene logic)
137- let left = BoolVector :: new ( bitbuffer ! [ 0 ] , Mask :: new_true ( 1 ) ) ;
138- let right = BoolVector :: new ( bitbuffer ! [ 1 ] , Mask :: new_false ( 1 ) ) ;
158+ let left = BoolVector :: try_new ( bitbuffer ! [ 0 ] , Mask :: new_true ( 1 ) ) . unwrap ( ) ;
159+ let right = BoolVector :: try_new ( bitbuffer ! [ 1 ] , Mask :: new_false ( 1 ) ) . unwrap ( ) ;
139160
140161 let result = left. and_kleene ( & right) ;
141162 assert_eq ! ( result. bits( ) , & bitbuffer![ 0 ] ) ;
0 commit comments