15
15
use std:: collections:: HashSet ;
16
16
17
17
use arrow_array:: RecordBatch ;
18
- use databend_common_catalog:: plan:: VirtualColumnInfo ;
18
+ use databend_common_catalog:: plan:: VirtualColumnField ;
19
19
use databend_common_exception:: Result ;
20
20
use databend_common_expression:: eval_function;
21
21
use databend_common_expression:: types:: DataType ;
@@ -132,12 +132,13 @@ impl VirtualColumnReader {
132
132
) )
133
133
}
134
134
135
+ /// Deserialize virtual column data into record batches, according to the `batch_size`.
135
136
pub fn try_create_paster (
136
137
& self ,
137
138
virtual_data : Option < VirtualBlockReadResult > ,
138
139
batch_size : usize ,
139
- ) -> Result < VirtualColumnDataModifier > {
140
- let chunks = if let Some ( virtual_data) = virtual_data {
140
+ ) -> Result < VirtualColumnDataPaster > {
141
+ let record_batches = if let Some ( virtual_data) = virtual_data {
141
142
let columns_chunks = virtual_data. data . columns_chunks ( ) ?;
142
143
let chunks = column_chunks_to_record_batch (
143
144
& self . virtual_column_info . schema ,
@@ -151,27 +152,31 @@ impl VirtualColumnReader {
151
152
None
152
153
} ;
153
154
154
- let func_ctx = self . ctx . get_function_context ( ) ?;
155
+ let function_context = self . ctx . get_function_context ( ) ?;
155
156
156
- Ok ( VirtualColumnDataModifier {
157
- record_batches : chunks,
158
- function_context : func_ctx,
157
+ // Unfortunately, Paster cannot hold references to the fields that being cloned,
158
+ // since the caller `DeserializeDataTransform` will take mutable reference of
159
+ // VirtualColumnReader indirectly.
160
+ Ok ( VirtualColumnDataPaster {
161
+ record_batches,
162
+ function_context,
159
163
next_record_batch_index : 0 ,
160
- virtual_column_info : self . virtual_column_info . clone ( ) ,
164
+ virtual_column_fields : self . virtual_column_info . virtual_column_fields . clone ( ) ,
161
165
source_schema : self . source_schema . clone ( ) ,
162
166
} )
163
167
}
164
168
}
165
169
166
- pub struct VirtualColumnDataModifier {
170
+ pub struct VirtualColumnDataPaster {
167
171
record_batches : Option < Vec < RecordBatch > > ,
168
172
next_record_batch_index : usize ,
169
173
function_context : FunctionContext ,
170
- virtual_column_info : VirtualColumnInfo ,
174
+ virtual_column_fields : Vec < VirtualColumnField > ,
171
175
source_schema : TableSchemaRef ,
172
176
}
173
177
174
- impl VirtualColumnDataModifier {
178
+ impl VirtualColumnDataPaster {
179
+ /// Paste virtual column to `data_block` if necessary
175
180
pub fn paste_virtual_column ( & mut self , mut data_block : DataBlock ) -> Result < DataBlock > {
176
181
let record_batch = if let Some ( record_batches) = & self . record_batches {
177
182
assert ! ( record_batches. len( ) > self . next_record_batch_index) ;
@@ -183,7 +188,7 @@ impl VirtualColumnDataModifier {
183
188
self . next_record_batch_index += 1 ;
184
189
185
190
let func_ctx = & self . function_context ;
186
- for virtual_column_field in self . virtual_column_info . virtual_column_fields . iter ( ) {
191
+ for virtual_column_field in self . virtual_column_fields . iter ( ) {
187
192
if let Some ( arrow_array) =
188
193
record_batch. and_then ( |r| r. column_by_name ( & virtual_column_field. name ) . cloned ( ) )
189
194
{
@@ -207,7 +212,7 @@ impl VirtualColumnDataModifier {
207
212
None ,
208
213
"get_by_keypath" ,
209
214
[ src_arg, path_arg] ,
210
- & func_ctx,
215
+ func_ctx,
211
216
data_block. num_rows ( ) ,
212
217
& BUILTIN_FUNCTIONS ,
213
218
) ?;
@@ -217,7 +222,7 @@ impl VirtualColumnDataModifier {
217
222
None ,
218
223
cast_func_name,
219
224
[ ( value, data_type) ] ,
220
- & func_ctx,
225
+ func_ctx,
221
226
data_block. num_rows ( ) ,
222
227
& BUILTIN_FUNCTIONS ,
223
228
) ?;
0 commit comments