12
12
// See the License for the specific language governing permissions and
13
13
// limitations under the License.
14
14
15
- use databend_common_exception:: ErrorCode ;
16
15
use databend_common_exception:: Result ;
17
16
use databend_common_expression:: row:: RowConverter as CommonConverter ;
18
17
use databend_common_expression:: types:: DataType ;
@@ -45,10 +44,10 @@ pub fn convert_rows(
45
44
schema : DataSchemaRef ,
46
45
sort_desc : & ' a [ SortColumnDescription ] ,
47
46
data : DataBlock ,
48
- result : Result < Column > ,
49
47
}
50
48
51
49
impl RowsTypeVisitor for ConvertRowsVisitor < ' _ > {
50
+ type Result = Result < Column > ;
52
51
fn schema ( & self ) -> DataSchemaRef {
53
52
self . schema . clone ( )
54
53
}
@@ -57,7 +56,7 @@ pub fn convert_rows(
57
56
self . sort_desc
58
57
}
59
58
60
- fn visit_type < R , C > ( & mut self )
59
+ fn visit_type < R , C > ( & mut self ) -> Self :: Result
61
60
where
62
61
R : Rows + ' static ,
63
62
C : RowConverter < R > + Send + ' static ,
@@ -68,65 +67,63 @@ pub fn convert_rows(
68
67
. map ( |desc| self . data . get_by_offset ( desc. offset ) . to_owned ( ) )
69
68
. collect :: < Vec < _ > > ( ) ;
70
69
71
- self . result = try {
72
- let converter = C :: create ( self . sort_desc , self . schema . clone ( ) ) ?;
73
- let rows = C :: convert ( & converter, & columns, self . data . num_rows ( ) ) ?;
74
- rows. to_column ( )
75
- }
70
+ let converter = C :: create ( self . sort_desc , self . schema . clone ( ) ) ?;
71
+ let rows = C :: convert ( & converter, & columns, self . data . num_rows ( ) ) ?;
72
+ Ok ( rows. to_column ( ) )
76
73
}
77
74
}
78
75
79
76
let mut visitor = ConvertRowsVisitor {
80
77
schema : schema. clone ( ) ,
81
78
sort_desc,
82
79
data,
83
- result : Err ( ErrorCode :: Internal ( "unreachable" ) ) ,
84
80
} ;
85
81
86
- select_row_type ( & mut visitor) ;
87
- visitor. result
82
+ select_row_type ( & mut visitor)
88
83
}
89
84
90
- pub fn select_row_type ( visitor : & mut impl RowsTypeVisitor ) {
91
- let sort_desc = visitor. sort_desc ( ) ;
92
- if sort_desc. len ( ) == 1 {
93
- let schema = visitor. schema ( ) ;
94
- let sort_type = schema. field ( sort_desc[ 0 ] . offset ) . data_type ( ) ;
95
- let asc = sort_desc[ 0 ] . asc ;
96
-
97
- match_template ! {
98
- T = [ Date => DateType , Timestamp => TimestampType , String => StringType ] ,
99
- match sort_type {
100
- DataType :: T => {
101
- if asc {
102
- visitor. visit_type:: <SimpleRowsAsc <T >, SimpleRowConverter <T >>( )
103
- } else {
104
- visitor. visit_type:: <SimpleRowsDesc <T >, SimpleRowConverter <T >>( )
105
- }
106
- } ,
107
- DataType :: Number ( num_ty) => with_number_mapped_type!( |NUM_TYPE | match num_ty {
108
- NumberDataType :: NUM_TYPE => {
85
+ pub fn select_row_type < V > ( visitor : & mut V ) -> V :: Result
86
+ where V : RowsTypeVisitor {
87
+ match & visitor. sort_desc ( ) {
88
+ & [ desc] => {
89
+ let schema = visitor. schema ( ) ;
90
+ let sort_type = schema. field ( desc. offset ) . data_type ( ) ;
91
+ let asc = desc. asc ;
92
+
93
+ match_template ! {
94
+ T = [ Date => DateType , Timestamp => TimestampType , String => StringType ] ,
95
+ match sort_type {
96
+ DataType :: T => {
109
97
if asc {
110
- visitor. visit_type:: <SimpleRowsAsc <NumberType < NUM_TYPE >> , SimpleRowConverter <NumberType < NUM_TYPE > >>( )
98
+ visitor. visit_type:: <SimpleRowsAsc <T > , SimpleRowConverter <T >>( )
111
99
} else {
112
- visitor. visit_type:: <SimpleRowsDesc <NumberType <NUM_TYPE >>, SimpleRowConverter <NumberType <NUM_TYPE >>>( )
100
+ visitor. visit_type:: <SimpleRowsDesc <T >, SimpleRowConverter <T >>( )
101
+ }
102
+ } ,
103
+ DataType :: Number ( num_ty) => with_number_mapped_type!( |NUM_TYPE | match num_ty {
104
+ NumberDataType :: NUM_TYPE => {
105
+ if asc {
106
+ visitor. visit_type:: <SimpleRowsAsc <NumberType <NUM_TYPE >>, SimpleRowConverter <NumberType <NUM_TYPE >>>( )
107
+ } else {
108
+ visitor. visit_type:: <SimpleRowsDesc <NumberType <NUM_TYPE >>, SimpleRowConverter <NumberType <NUM_TYPE >>>( )
109
+ }
113
110
}
111
+ } ) ,
112
+ _ => visitor. visit_type:: <CommonRows , CommonConverter >( )
114
113
}
115
- } ) ,
116
- _ => visitor. visit_type:: <CommonRows , CommonConverter >( )
117
114
}
118
115
}
119
- } else {
120
- visitor. visit_type :: < CommonRows , CommonConverter > ( )
116
+ _ => visitor. visit_type :: < CommonRows , CommonConverter > ( ) ,
121
117
}
122
118
}
123
119
124
120
pub trait RowsTypeVisitor {
121
+ type Result ;
125
122
fn schema ( & self ) -> DataSchemaRef ;
126
123
127
124
fn sort_desc ( & self ) -> & [ SortColumnDescription ] ;
128
125
129
- fn visit_type < R , C > ( & mut self )
126
+ fn visit_type < R , C > ( & mut self ) -> Self :: Result
130
127
where
131
128
R : Rows + ' static ,
132
129
C : RowConverter < R > + Send + ' static ;
@@ -136,10 +133,10 @@ pub fn order_field_type(schema: &DataSchema, desc: &[SortColumnDescription]) ->
136
133
struct OrderFieldTypeVisitor < ' a > {
137
134
schema : DataSchemaRef ,
138
135
sort_desc : & ' a [ SortColumnDescription ] ,
139
- result : Option < DataType > ,
140
136
}
141
137
142
138
impl RowsTypeVisitor for OrderFieldTypeVisitor < ' _ > {
139
+ type Result = DataType ;
143
140
fn schema ( & self ) -> DataSchemaRef {
144
141
self . schema . clone ( )
145
142
}
@@ -148,22 +145,20 @@ pub fn order_field_type(schema: &DataSchema, desc: &[SortColumnDescription]) ->
148
145
self . sort_desc
149
146
}
150
147
151
- fn visit_type < R , C > ( & mut self )
148
+ fn visit_type < R , C > ( & mut self ) -> Self :: Result
152
149
where
153
150
R : Rows + ' static ,
154
151
C : RowConverter < R > + Send + ' static ,
155
152
{
156
- self . result = Some ( R :: data_type ( ) ) ;
153
+ R :: data_type ( )
157
154
}
158
155
}
159
156
160
157
assert ! ( !desc. is_empty( ) ) ;
161
158
let mut visitor = OrderFieldTypeVisitor {
162
159
schema : schema. clone ( ) . into ( ) ,
163
160
sort_desc : desc,
164
- result : None ,
165
161
} ;
166
162
167
- select_row_type ( & mut visitor) ;
168
- visitor. result . unwrap ( )
163
+ select_row_type ( & mut visitor)
169
164
}
0 commit comments