@@ -151,7 +151,7 @@ pub fn reverse(rb: &RecordBatch) -> RecordBatch {
151151mod tests {
152152 use std:: sync:: Arc ;
153153
154- use arrow_array:: { Array , Int32Array , RecordBatch } ;
154+ use arrow_array:: { Array , ArrayRef , Int32Array , RecordBatch } ;
155155 use arrow_schema:: { DataType , Field , Schema } ;
156156
157157 use super :: * ;
@@ -213,4 +213,81 @@ mod tests {
213213 assert_eq ! ( array. len( ) , 0 ) ;
214214 assert ! ( array. is_empty( ) ) ;
215215 }
216+
217+ #[ test]
218+ fn test_replace_single_column ( ) {
219+ let schema = Schema :: new ( vec ! [
220+ Field :: new( "a" , DataType :: Int32 , false ) ,
221+ Field :: new( "b" , DataType :: Int32 , false ) ,
222+ Field :: new( "c" , DataType :: Int32 , false ) ,
223+ ] ) ;
224+
225+ let columns: Vec < ArrayRef > = vec ! [
226+ Arc :: new( Int32Array :: from( vec![ 1 , 2 , 3 ] ) ) ,
227+ Arc :: new( Int32Array :: from( vec![ 4 , 5 , 6 ] ) ) ,
228+ Arc :: new( Int32Array :: from( vec![ 7 , 8 , 9 ] ) ) ,
229+ ] ;
230+
231+ let batch = RecordBatch :: try_new ( Arc :: new ( schema. clone ( ) ) , columns. clone ( ) ) . unwrap ( ) ;
232+
233+ let new_b = Arc :: new ( Int32Array :: from ( vec ! [ 10 , 11 , 12 ] ) ) ;
234+
235+ let result = replace_columns ( Arc :: new ( schema) , & batch, & [ ( 1 , new_b. clone ( ) ) ] ) ;
236+
237+ assert_eq ! ( result. column( 0 ) . as_ref( ) , columns[ 0 ] . as_ref( ) ) ;
238+ assert_eq ! ( result. column( 1 ) . as_ref( ) , new_b. as_ref( ) ) ;
239+ assert_eq ! ( result. column( 2 ) . as_ref( ) , columns[ 2 ] . as_ref( ) ) ;
240+ }
241+
242+ #[ test]
243+ fn replace_multiple_columns ( ) {
244+ let schema = Schema :: new ( vec ! [
245+ Field :: new( "a" , DataType :: Int32 , false ) ,
246+ Field :: new( "b" , DataType :: Int32 , false ) ,
247+ Field :: new( "c" , DataType :: Int32 , false ) ,
248+ ] ) ;
249+
250+ let columns: Vec < ArrayRef > = vec ! [
251+ Arc :: new( Int32Array :: from( vec![ 1 , 2 , 3 ] ) ) ,
252+ Arc :: new( Int32Array :: from( vec![ 4 , 5 , 6 ] ) ) ,
253+ Arc :: new( Int32Array :: from( vec![ 7 , 8 , 9 ] ) ) ,
254+ ] ;
255+
256+ let batch = RecordBatch :: try_new ( Arc :: new ( schema. clone ( ) ) , columns. clone ( ) ) . unwrap ( ) ;
257+
258+ let new_a = Arc :: new ( Int32Array :: from ( vec ! [ 10 , 11 , 12 ] ) ) ;
259+ let new_c = Arc :: new ( Int32Array :: from ( vec ! [ 13 , 14 , 15 ] ) ) ;
260+
261+ let result = replace_columns (
262+ Arc :: new ( schema) ,
263+ & batch,
264+ & [ ( 0 , new_a. clone ( ) ) , ( 2 , new_c. clone ( ) ) ] ,
265+ ) ;
266+
267+ assert_eq ! ( result. column( 0 ) . as_ref( ) , new_a. as_ref( ) ) ;
268+ assert_eq ! ( result. column( 1 ) . as_ref( ) , columns[ 1 ] . as_ref( ) ) ;
269+ assert_eq ! ( result. column( 2 ) . as_ref( ) , new_c. as_ref( ) ) ;
270+ }
271+
272+ #[ test]
273+ #[ should_panic]
274+ fn replace_column_with_different_length_array ( ) {
275+ let schema = Schema :: new ( vec ! [
276+ Field :: new( "a" , DataType :: Int32 , false ) ,
277+ Field :: new( "b" , DataType :: Int32 , false ) ,
278+ Field :: new( "c" , DataType :: Int32 , false ) ,
279+ ] ) ;
280+
281+ let columns: Vec < ArrayRef > = vec ! [
282+ Arc :: new( Int32Array :: from( vec![ 1 , 2 , 3 ] ) ) ,
283+ Arc :: new( Int32Array :: from( vec![ 4 , 5 , 6 ] ) ) ,
284+ Arc :: new( Int32Array :: from( vec![ 7 , 8 , 9 ] ) ) ,
285+ ] ;
286+
287+ let batch = RecordBatch :: try_new ( Arc :: new ( schema. clone ( ) ) , columns. clone ( ) ) . unwrap ( ) ;
288+
289+ let new_b = Arc :: new ( Int32Array :: from ( vec ! [ 10 , 11 ] ) ) ; // Different length
290+
291+ replace_columns ( Arc :: new ( schema) , & batch, & [ ( 1 , new_b. clone ( ) ) ] ) ;
292+ }
216293}
0 commit comments