@@ -20,124 +20,39 @@ use common_arrow::arrow::buffer::Buffer;
2020use common_exception:: ErrorCode ;
2121use common_exception:: Result ;
2222
23+ use crate :: filter_helper:: FilterHelpers ;
2324use crate :: types:: array:: ArrayColumnBuilder ;
2425use crate :: types:: nullable:: NullableColumn ;
2526use crate :: types:: number:: NumberColumn ;
26- use crate :: types:: number:: NumberScalar ;
2727use crate :: types:: string:: StringColumnBuilder ;
2828use crate :: types:: AnyType ;
29- use crate :: types:: ArgType ;
3029use crate :: types:: ArrayType ;
3130use crate :: types:: BooleanType ;
3231use crate :: types:: StringType ;
3332use crate :: types:: ValueType ;
3433use crate :: types:: VariantType ;
35- use crate :: with_number_mapped_type;
3634use crate :: with_number_type;
3735use crate :: BlockEntry ;
3836use crate :: Column ;
3937use crate :: ColumnBuilder ;
4038use crate :: DataBlock ;
41- use crate :: Scalar ;
4239use crate :: TypeDeserializer ;
4340use crate :: Value ;
4441
4542impl DataBlock {
46- // check if the predicate has any valid row
47- pub fn filter_exists ( predicate : & Value < AnyType > ) -> Result < bool > {
48- let predicate = Self :: cast_to_nonull_boolean ( predicate) . ok_or_else ( || {
49- ErrorCode :: BadDataValueType ( format ! (
50- "Filter predict column does not support type '{:?}'" ,
51- predicate
52- ) )
53- } ) ?;
54- match predicate {
55- Value :: Scalar ( s) => Ok ( s) ,
56- Value :: Column ( bitmap) => Ok ( bitmap. len ( ) != bitmap. unset_bits ( ) ) ,
57- }
58- }
59-
6043 pub fn filter ( self , predicate : & Value < AnyType > ) -> Result < DataBlock > {
6144 if self . num_rows ( ) == 0 {
6245 return Ok ( self ) ;
6346 }
6447
65- let predicate = Self :: cast_to_nonull_boolean ( predicate) . ok_or_else ( || {
48+ let predicate = FilterHelpers :: cast_to_nonull_boolean ( predicate) . ok_or_else ( || {
6649 ErrorCode :: BadDataValueType ( format ! (
6750 "Filter predict column does not support type '{:?}'" ,
6851 predicate
6952 ) )
7053 } ) ?;
7154
72- match predicate {
73- Value :: Scalar ( s) => {
74- if s {
75- Ok ( self )
76- } else {
77- Ok ( self . slice ( 0 ..0 ) )
78- }
79- }
80- Value :: Column ( bitmap) => Self :: filter_with_bitmap ( self , & bitmap) ,
81- }
82- }
83-
84- // Must be numeric, boolean, or string value type
85- pub fn cast_to_nonull_boolean ( predicate : & Value < AnyType > ) -> Option < Value < BooleanType > > {
86- match predicate {
87- Value :: Scalar ( s) => Self :: cast_scalar_to_boolean ( s) . map ( Value :: Scalar ) ,
88- Value :: Column ( c) => Self :: cast_column_to_boolean ( c) . map ( Value :: Column ) ,
89- }
90- }
91-
92- fn cast_scalar_to_boolean ( s : & Scalar ) -> Option < bool > {
93- match s {
94- Scalar :: Number ( num) => with_number_mapped_type ! ( |SRC_TYPE | match num {
95- NumberScalar :: SRC_TYPE ( value) => Some ( value != & SRC_TYPE :: default ( ) ) ,
96- } ) ,
97- Scalar :: Boolean ( value) => Some ( * value) ,
98- Scalar :: String ( value) => Some ( !value. is_empty ( ) ) ,
99- Scalar :: Timestamp ( value) => Some ( * value != 0 ) ,
100- Scalar :: Date ( value) => Some ( * value != 0 ) ,
101- Scalar :: Null => Some ( false ) ,
102- _ => None ,
103- }
104- }
105-
106- fn cast_column_to_boolean ( c : & Column ) -> Option < Bitmap > {
107- match c {
108- Column :: Number ( num) => with_number_mapped_type ! ( |SRC_TYPE | match num {
109- NumberColumn :: SRC_TYPE ( value) => Some ( BooleanType :: column_from_iter(
110- value. iter( ) . map( |v| v != & SRC_TYPE :: default ( ) ) ,
111- & [ ] ,
112- ) ) ,
113- } ) ,
114- Column :: Boolean ( value) => Some ( value. clone ( ) ) ,
115- Column :: String ( value) => Some ( BooleanType :: column_from_iter (
116- value. iter ( ) . map ( |s| !s. is_empty ( ) ) ,
117- & [ ] ,
118- ) ) ,
119- Column :: Timestamp ( value) => Some ( BooleanType :: column_from_iter (
120- value. iter ( ) . map ( |v| * v != 0 ) ,
121- & [ ] ,
122- ) ) ,
123- Column :: Date ( value) => Some ( BooleanType :: column_from_iter (
124- value. iter ( ) . map ( |v| * v != 0 ) ,
125- & [ ] ,
126- ) ) ,
127- Column :: Null { len } => Some ( MutableBitmap :: from_len_zeroed ( * len) . into ( ) ) ,
128- Column :: Nullable ( c) => {
129- let inner = Self :: cast_column_to_boolean ( & c. column ) ?;
130- Some ( ( & inner) & ( & c. validity ) )
131- }
132- _ => None ,
133- }
134- }
135-
136- pub fn try_as_const_bool ( value : & Value < BooleanType > ) -> Result < Option < bool > > {
137- match value {
138- Value :: Scalar ( v) => Ok ( Some ( * v) ) ,
139- _ => Ok ( None ) ,
140- }
55+ self . filter_boolean_value ( predicate)
14156 }
14257
14358 pub fn filter_with_bitmap ( block : DataBlock , bitmap : & Bitmap ) -> Result < DataBlock > {
@@ -169,6 +84,19 @@ impl DataBlock {
16984 }
17085 }
17186 }
87+
88+ pub fn filter_boolean_value ( self , filter : Value < BooleanType > ) -> Result < DataBlock > {
89+ match filter {
90+ Value :: Scalar ( s) => {
91+ if s {
92+ Ok ( self )
93+ } else {
94+ Ok ( self . slice ( 0 ..0 ) )
95+ }
96+ }
97+ Value :: Column ( bitmap) => Self :: filter_with_bitmap ( self , & bitmap) ,
98+ }
99+ }
172100}
173101
174102impl Column {
0 commit comments