@@ -250,91 +250,178 @@ impl BlockPartitionStream {
250250}
251251
252252pub fn copy_column < I : Index > ( indices : & [ I ] , from : & Column , to : & mut ColumnBuilder ) {
253- match ( to, from) {
254- ( ColumnBuilder :: Nullable ( builder) , Column :: Null { .. } ) => {
255- builder. push_repeat_null ( indices. len ( ) ) ;
256- }
257- ( ColumnBuilder :: Array ( builder) , Column :: EmptyArray { .. } ) => {
258- for _ in 0 ..indices. len ( ) {
259- builder. commit_row ( ) ;
253+ match to {
254+ ColumnBuilder :: EmptyArray { len } => match from {
255+ Column :: EmptyArray { .. } => * len += indices. len ( ) ,
256+ Column :: Array ( column) => {
257+ let capacity = * len + column. len ( ) ;
258+ match ColumnBuilder :: with_capacity ( & from. data_type ( ) , capacity) {
259+ ColumnBuilder :: Array ( mut builder) => {
260+ builder. offsets . extend ( vec ! [ 0 ; * len] ) ;
261+ copy_array ( & mut builder, column, indices) ;
262+ * to = ColumnBuilder :: Array ( builder) ;
263+ }
264+ _ => unreachable ! (
265+ "ColumnBuilder::with_capacity for Array type should return ColumnBuilder::Array, \
266+ but got different variant. data_type: {}, capacity: {}",
267+ from. data_type( ) , capacity
268+ ) ,
269+ }
260270 }
261- }
262- ( ColumnBuilder :: Map ( builder) , Column :: EmptyMap { .. } ) => {
263- for _ in 0 ..indices. len ( ) {
264- builder. commit_row ( ) ;
271+ _ => unreachable ! (
272+ "EmptyArray builder can only copy from EmptyArray or Array, but got from type: {}" ,
273+ from. data_type( )
274+ ) ,
275+ } ,
276+ ColumnBuilder :: Array ( builder) => match from {
277+ Column :: EmptyArray { .. } => {
278+ for _ in 0 ..indices. len ( ) {
279+ builder. commit_row ( ) ;
280+ }
265281 }
266- }
267- ( ColumnBuilder :: Number ( builder) , Column :: Number ( number_column) ) => {
268- with_number_mapped_type ! ( |NUM_TYPE | match ( builder, number_column) {
269- ( NumberColumnBuilder :: NUM_TYPE ( b) , NumberColumn :: NUM_TYPE ( c) ) => {
270- copy_primitive_type( b, c, indices) ;
282+ Column :: Array ( column) => {
283+ copy_array ( builder, column, indices) ;
284+ }
285+ _ => unreachable ! (
286+ "Array builder can only copy from EmptyArray or Array, but got from type: {}" ,
287+ from. data_type( )
288+ ) ,
289+ } ,
290+ ColumnBuilder :: Null { len } => match from {
291+ Column :: Null { .. } => * len += indices. len ( ) ,
292+ Column :: Nullable ( column) => {
293+ let capacity = * len + column. len ( ) ;
294+
295+ match ColumnBuilder :: with_capacity ( & from. data_type ( ) , capacity) {
296+ ColumnBuilder :: Nullable ( mut builder) => {
297+ builder. push_repeat_null ( * len) ;
298+ copy_nullable ( & mut builder, column, indices) ;
299+ * to = ColumnBuilder :: Nullable ( builder) ;
300+ }
301+ _ => unreachable ! ( "ColumnBuilder::with_capacity for Nullable type should return ColumnBuilder::Nullable, \
302+ but got different variant. data_type: {}, capacity: {}",
303+ from. data_type( ) , capacity) ,
271304 }
272- _ => unreachable!( ) ,
273- } )
274- }
275- ( ColumnBuilder :: Decimal ( builder) , Column :: Decimal ( column) ) => {
276- with_decimal_type ! ( |DECIMAL_TYPE | match ( builder, column) {
277- (
278- DecimalColumnBuilder :: DECIMAL_TYPE ( builder, _) ,
279- DecimalColumn :: DECIMAL_TYPE ( column, _) ,
280- ) => {
281- copy_primitive_type( builder, column, indices) ;
305+ }
306+ _ => unreachable ! (
307+ "Null builder can only copy from Null or Nullable, but got from type: {}" ,
308+ from. data_type( )
309+ ) ,
310+ } ,
311+ ColumnBuilder :: Nullable ( builder) => match from {
312+ Column :: Null { .. } => {
313+ builder. push_repeat_null ( indices. len ( ) ) ;
314+ }
315+ Column :: Nullable ( column) => {
316+ copy_nullable ( builder, column, indices) ;
317+ }
318+ _ => unreachable ! (
319+ "Nullable builder can only copy from Null or Nullable, but got from type: {}" ,
320+ from. data_type( )
321+ ) ,
322+ } ,
323+ ColumnBuilder :: EmptyMap { len } => match from {
324+ Column :: EmptyMap { .. } => * len += indices. len ( ) ,
325+ Column :: Map ( column) => {
326+ let capacity = * len + indices. len ( ) ;
327+ match ColumnBuilder :: with_capacity ( & from. data_type ( ) , capacity) {
328+ ColumnBuilder :: Map ( mut builder) => {
329+ builder. offsets . extend ( vec ! [ 0 ; * len] ) ;
330+ copy_array ( & mut builder, column, indices) ;
331+ * to = ColumnBuilder :: Map ( builder) ;
332+ }
333+ _ => unreachable ! ( "ColumnBuilder::with_capacity for Map type should return ColumnBuilder::Map, \
334+ but got different variant. data_type: {}, capacity: {}",
335+ from. data_type( ) , capacity) ,
282336 }
283- _ => unreachable!( ) ,
284- } ) ;
285- }
286- ( ColumnBuilder :: Boolean ( builder) , Column :: Boolean ( column) ) => {
287- copy_boolean ( builder, column, indices)
288- }
289- ( ColumnBuilder :: Date ( builder) , Column :: Date ( column) ) => {
290- copy_primitive_type ( builder, column, indices) ;
291- }
292- ( ColumnBuilder :: Interval ( builder) , Column :: Interval ( column) ) => {
293- copy_primitive_type ( builder, column, indices) ;
294- }
295- ( ColumnBuilder :: Timestamp ( builder) , Column :: Timestamp ( column) ) => {
296- copy_primitive_type ( builder, column, indices) ;
297- }
298- ( ColumnBuilder :: Bitmap ( builder) , Column :: Bitmap ( column) ) => {
299- copy_binary ( builder, column, indices) ;
300- }
301- ( ColumnBuilder :: Binary ( builder) , Column :: Binary ( column) ) => {
302- copy_binary ( builder, column, indices) ;
303- }
304- ( ColumnBuilder :: Variant ( builder) , Column :: Variant ( column) ) => {
305- copy_binary ( builder, column, indices) ;
306- }
307- ( ColumnBuilder :: Geometry ( builder) , Column :: Geometry ( column) ) => {
308- copy_binary ( builder, column, indices) ;
309- }
310- ( ColumnBuilder :: Geography ( builder) , Column :: Geography ( column) ) => {
311- copy_binary ( builder, & column. 0 , indices) ;
312- }
313- ( ColumnBuilder :: String ( builder) , Column :: String ( column) ) => {
314- copy_string ( builder, column, indices) ;
315- }
316- ( ColumnBuilder :: Array ( builder) , Column :: Array ( column) ) => {
317- copy_array ( builder, column, indices) ;
318- }
319- ( ColumnBuilder :: Map ( builder) , Column :: Map ( column) ) => {
320- copy_array ( builder, column, indices) ;
321- }
322- ( ColumnBuilder :: Nullable ( builder) , Column :: Nullable ( column) ) => {
323- copy_nullable ( builder, column, indices) ;
324- }
325- ( ColumnBuilder :: Vector ( builder) , Column :: Vector ( column) ) => {
326- copy_vector ( indices, builder, column) ;
327- }
328- ( ColumnBuilder :: Opaque ( builder) , Column :: Opaque ( column) ) => {
329- copy_opaque ( indices, builder, column) ;
330- }
331- ( ColumnBuilder :: Tuple ( builders) , Column :: Tuple ( columns) ) => {
332- for ( builder, column) in builders. iter_mut ( ) . zip ( columns. iter ( ) ) {
333- copy_column ( indices, column, builder)
334337 }
335- }
336- _ => unreachable ! ( ) ,
337- }
338+ _ => unreachable ! (
339+ "EmptyMap builder can only copy from EmptyMap or Map, but got from type: {}" ,
340+ from. data_type( )
341+ ) ,
342+ } ,
343+ ColumnBuilder :: Map ( builder) => match from {
344+ Column :: Map ( column) => {
345+ copy_array ( builder, column, indices) ;
346+ }
347+ Column :: EmptyMap { .. } => {
348+ for _ in 0 ..indices. len ( ) {
349+ builder. commit_row ( ) ;
350+ }
351+ }
352+ _ => unreachable ! (
353+ "Map builder can only copy from EmptyMap or Map, but got from type: {}" ,
354+ from. data_type( )
355+ ) ,
356+ } ,
357+ _ => match ( to, from) {
358+ ( ColumnBuilder :: Number ( builder) , Column :: Number ( number_column) ) => {
359+ with_number_mapped_type ! ( |NUM_TYPE | match ( builder, number_column) {
360+ ( NumberColumnBuilder :: NUM_TYPE ( b) , NumberColumn :: NUM_TYPE ( c) ) => {
361+ copy_primitive_type( b, c, indices) ;
362+ }
363+ _ => unreachable!( ) ,
364+ } )
365+ }
366+ ( ColumnBuilder :: Decimal ( builder) , Column :: Decimal ( column) ) => {
367+ with_decimal_type ! ( |DECIMAL_TYPE | match ( builder, column) {
368+ (
369+ DecimalColumnBuilder :: DECIMAL_TYPE ( builder, _) ,
370+ DecimalColumn :: DECIMAL_TYPE ( column, _) ,
371+ ) => {
372+ copy_primitive_type( builder, column, indices) ;
373+ }
374+ _ => unreachable!( ) ,
375+ } ) ;
376+ }
377+ ( ColumnBuilder :: Boolean ( builder) , Column :: Boolean ( column) ) => {
378+ copy_boolean ( builder, column, indices)
379+ }
380+ ( ColumnBuilder :: Date ( builder) , Column :: Date ( column) ) => {
381+ copy_primitive_type ( builder, column, indices) ;
382+ }
383+ ( ColumnBuilder :: Interval ( builder) , Column :: Interval ( column) ) => {
384+ copy_primitive_type ( builder, column, indices) ;
385+ }
386+ ( ColumnBuilder :: Timestamp ( builder) , Column :: Timestamp ( column) ) => {
387+ copy_primitive_type ( builder, column, indices) ;
388+ }
389+ ( ColumnBuilder :: Bitmap ( builder) , Column :: Bitmap ( column) ) => {
390+ copy_binary ( builder, column, indices) ;
391+ }
392+ ( ColumnBuilder :: Binary ( builder) , Column :: Binary ( column) ) => {
393+ copy_binary ( builder, column, indices) ;
394+ }
395+ ( ColumnBuilder :: Variant ( builder) , Column :: Variant ( column) ) => {
396+ copy_binary ( builder, column, indices) ;
397+ }
398+ ( ColumnBuilder :: Geometry ( builder) , Column :: Geometry ( column) ) => {
399+ copy_binary ( builder, column, indices) ;
400+ }
401+ ( ColumnBuilder :: Geography ( builder) , Column :: Geography ( column) ) => {
402+ copy_binary ( builder, & column. 0 , indices) ;
403+ }
404+ ( ColumnBuilder :: String ( builder) , Column :: String ( column) ) => {
405+ copy_string ( builder, column, indices) ;
406+ }
407+ ( ColumnBuilder :: Vector ( builder) , Column :: Vector ( column) ) => {
408+ copy_vector ( indices, builder, column) ;
409+ }
410+ ( ColumnBuilder :: Opaque ( builder) , Column :: Opaque ( column) ) => {
411+ copy_opaque ( indices, builder, column) ;
412+ }
413+ ( ColumnBuilder :: Tuple ( builders) , Column :: Tuple ( columns) ) => {
414+ for ( builder, column) in builders. iter_mut ( ) . zip ( columns. iter ( ) ) {
415+ copy_column ( indices, column, builder)
416+ }
417+ }
418+ ( to, from) => unreachable ! (
419+ "Unsupported column builder type for copy_column. to type: {:?}, from type: {}" ,
420+ to. data_type( ) ,
421+ from. data_type( )
422+ ) ,
423+ } ,
424+ } ;
338425}
339426
340427fn copy_boolean < I : Index > ( to : & mut MutableBitmap , from : & Bitmap , indices : & [ I ] ) {
0 commit comments