@@ -36,6 +36,9 @@ pub struct AggregationWithAccessor {
36
36
pub ( crate ) accessor : Column < u64 > ,
37
37
pub ( crate ) str_dict_column : Option < StrColumn > ,
38
38
pub ( crate ) field_type : ColumnType ,
39
+ /// In case there are multiple types of fast fields, e.g. string and numeric.
40
+ /// Only used for term aggregations
41
+ pub ( crate ) accessor2 : Option < ( Column < u64 > , ColumnType ) > ,
39
42
pub ( crate ) sub_aggregation : AggregationsWithAccessor ,
40
43
pub ( crate ) limits : ResourceLimitGuard ,
41
44
pub ( crate ) column_block_accessor : ColumnBlockAccessor < u64 > ,
@@ -50,51 +53,51 @@ impl AggregationWithAccessor {
50
53
limits : AggregationLimits ,
51
54
) -> crate :: Result < AggregationWithAccessor > {
52
55
let mut str_dict_column = None ;
56
+ let mut accessor2 = None ;
53
57
use AggregationVariants :: * ;
54
58
let ( accessor, field_type) = match & agg. agg {
55
59
Range ( RangeAggregation {
56
60
field : field_name, ..
57
- } ) => get_ff_reader_and_validate (
58
- reader,
59
- field_name,
60
- Some ( get_numeric_or_date_column_types ( ) ) ,
61
- ) ?,
61
+ } ) => get_ff_reader ( reader, field_name, Some ( get_numeric_or_date_column_types ( ) ) ) ?,
62
62
Histogram ( HistogramAggregation {
63
63
field : field_name, ..
64
- } ) => get_ff_reader_and_validate (
65
- reader,
66
- field_name,
67
- Some ( get_numeric_or_date_column_types ( ) ) ,
68
- ) ?,
64
+ } ) => get_ff_reader ( reader, field_name, Some ( get_numeric_or_date_column_types ( ) ) ) ?,
69
65
DateHistogram ( DateHistogramAggregationReq {
70
66
field : field_name, ..
71
- } ) => get_ff_reader_and_validate (
72
- reader,
73
- field_name,
74
- Some ( get_numeric_or_date_column_types ( ) ) ,
75
- ) ?,
67
+ } ) => get_ff_reader ( reader, field_name, Some ( get_numeric_or_date_column_types ( ) ) ) ?,
76
68
Terms ( TermsAggregation {
77
69
field : field_name, ..
78
70
} ) => {
79
71
str_dict_column = reader. fast_fields ( ) . str ( field_name) ?;
80
- get_ff_reader_and_validate ( reader, field_name, None ) ?
72
+ let allowed_column_types = [
73
+ ColumnType :: I64 ,
74
+ ColumnType :: U64 ,
75
+ ColumnType :: F64 ,
76
+ ColumnType :: Bytes ,
77
+ ColumnType :: Str ,
78
+ // ColumnType::Bool Unsupported
79
+ // ColumnType::IpAddr Unsupported
80
+ // ColumnType::DateTime Unsupported
81
+ ] ;
82
+ let mut columns =
83
+ get_all_ff_reader ( reader, field_name, Some ( & allowed_column_types) ) ?;
84
+ let first = columns. pop ( ) . unwrap ( ) ;
85
+ accessor2 = columns. pop ( ) ;
86
+ first
81
87
}
82
88
Average ( AverageAggregation { field : field_name } )
83
89
| Count ( CountAggregation { field : field_name } )
84
90
| Max ( MaxAggregation { field : field_name } )
85
91
| Min ( MinAggregation { field : field_name } )
86
92
| Stats ( StatsAggregation { field : field_name } )
87
93
| Sum ( SumAggregation { field : field_name } ) => {
88
- let ( accessor, field_type) = get_ff_reader_and_validate (
89
- reader,
90
- field_name,
91
- Some ( get_numeric_or_date_column_types ( ) ) ,
92
- ) ?;
94
+ let ( accessor, field_type) =
95
+ get_ff_reader ( reader, field_name, Some ( get_numeric_or_date_column_types ( ) ) ) ?;
93
96
94
97
( accessor, field_type)
95
98
}
96
99
Percentiles ( percentiles) => {
97
- let ( accessor, field_type) = get_ff_reader_and_validate (
100
+ let ( accessor, field_type) = get_ff_reader (
98
101
reader,
99
102
percentiles. field_name ( ) ,
100
103
Some ( get_numeric_or_date_column_types ( ) ) ,
@@ -105,6 +108,7 @@ impl AggregationWithAccessor {
105
108
let sub_aggregation = sub_aggregation. clone ( ) ;
106
109
Ok ( AggregationWithAccessor {
107
110
accessor,
111
+ accessor2,
108
112
field_type,
109
113
sub_aggregation : get_aggs_with_segment_accessor_and_validate (
110
114
& sub_aggregation,
@@ -150,8 +154,8 @@ pub(crate) fn get_aggs_with_segment_accessor_and_validate(
150
154
) )
151
155
}
152
156
153
- /// Get fast field reader with given cardinatility .
154
- fn get_ff_reader_and_validate (
157
+ /// Get fast field reader or empty as default .
158
+ fn get_ff_reader (
155
159
reader : & SegmentReader ,
156
160
field_name : & str ,
157
161
allowed_column_types : Option < & [ ColumnType ] > ,
@@ -167,3 +171,23 @@ fn get_ff_reader_and_validate(
167
171
} ) ;
168
172
Ok ( ff_field_with_type)
169
173
}
174
+
175
+ /// Get all fast field reader or empty as default.
176
+ ///
177
+ /// Is guaranteed to return at least one column.
178
+ fn get_all_ff_reader (
179
+ reader : & SegmentReader ,
180
+ field_name : & str ,
181
+ allowed_column_types : Option < & [ ColumnType ] > ,
182
+ ) -> crate :: Result < Vec < ( columnar:: Column < u64 > , ColumnType ) > > {
183
+ let ff_fields = reader. fast_fields ( ) ;
184
+ let mut ff_field_with_type =
185
+ ff_fields. u64_lenient_for_type_all ( allowed_column_types, field_name) ?;
186
+ if ff_field_with_type. is_empty ( ) {
187
+ ff_field_with_type. push ( (
188
+ Column :: build_empty_column ( reader. num_docs ( ) ) ,
189
+ ColumnType :: U64 ,
190
+ ) ) ;
191
+ }
192
+ Ok ( ff_field_with_type)
193
+ }
0 commit comments