@@ -309,4 +309,179 @@ void testEmptyArray() {
309309 assertThat (array ).isNotNull ();
310310 assertThat (array .size ()).isEqualTo (0 );
311311 }
312+
313+ @ Test
314+ void testArrayWithAllPrimitiveTypes () {
315+ RowType tableRowType =
316+ RowType .of (
317+ new org .apache .paimon .types .ArrayType (
318+ new org .apache .paimon .types .BooleanType ()),
319+ new org .apache .paimon .types .ArrayType (
320+ new org .apache .paimon .types .TinyIntType ()),
321+ new org .apache .paimon .types .ArrayType (
322+ new org .apache .paimon .types .SmallIntType ()),
323+ new org .apache .paimon .types .ArrayType (
324+ new org .apache .paimon .types .IntType ()),
325+ new org .apache .paimon .types .ArrayType (
326+ new org .apache .paimon .types .BigIntType ()),
327+ new org .apache .paimon .types .ArrayType (
328+ new org .apache .paimon .types .FloatType ()),
329+ new org .apache .paimon .types .ArrayType (
330+ new org .apache .paimon .types .DoubleType ()));
331+
332+ long logOffset = 0 ;
333+ long timeStamp = System .currentTimeMillis ();
334+ GenericRow genericRow = new GenericRow (7 );
335+ genericRow .setField (0 , new GenericArray (new boolean [] {true , false , true }));
336+ genericRow .setField (1 , new GenericArray (new byte [] {1 , 2 , 3 }));
337+ genericRow .setField (2 , new GenericArray (new short [] {100 , 200 , 300 }));
338+ genericRow .setField (3 , new GenericArray (new int [] {1000 , 2000 , 3000 }));
339+ genericRow .setField (4 , new GenericArray (new long [] {10000L , 20000L , 30000L }));
340+ genericRow .setField (5 , new GenericArray (new float [] {1.1f , 2.2f , 3.3f }));
341+ genericRow .setField (6 , new GenericArray (new double [] {1.11 , 2.22 , 3.33 }));
342+
343+ LogRecord logRecord = new GenericRecord (logOffset , timeStamp , APPEND_ONLY , genericRow );
344+ FlussRowAsPaimonRow flussRowAsPaimonRow =
345+ new FlussRowAsPaimonRow (logRecord .getRow (), tableRowType );
346+
347+ // Test boolean array
348+ InternalArray boolArray = flussRowAsPaimonRow .getArray (0 );
349+ assertThat (boolArray .size ()).isEqualTo (3 );
350+ assertThat (boolArray .getBoolean (0 )).isTrue ();
351+ assertThat (boolArray .getBoolean (1 )).isFalse ();
352+ assertThat (boolArray .getBoolean (2 )).isTrue ();
353+ assertThat (boolArray .toBooleanArray ()).isEqualTo (new boolean [] {true , false , true });
354+
355+ // Test byte array
356+ InternalArray byteArray = flussRowAsPaimonRow .getArray (1 );
357+ assertThat (byteArray .size ()).isEqualTo (3 );
358+ assertThat (byteArray .getByte (0 )).isEqualTo ((byte ) 1 );
359+ assertThat (byteArray .getByte (1 )).isEqualTo ((byte ) 2 );
360+ assertThat (byteArray .getByte (2 )).isEqualTo ((byte ) 3 );
361+ assertThat (byteArray .toByteArray ()).isEqualTo (new byte [] {1 , 2 , 3 });
362+
363+ // Test short array
364+ InternalArray shortArray = flussRowAsPaimonRow .getArray (2 );
365+ assertThat (shortArray .size ()).isEqualTo (3 );
366+ assertThat (shortArray .getShort (0 )).isEqualTo ((short ) 100 );
367+ assertThat (shortArray .getShort (1 )).isEqualTo ((short ) 200 );
368+ assertThat (shortArray .getShort (2 )).isEqualTo ((short ) 300 );
369+ assertThat (shortArray .toShortArray ()).isEqualTo (new short [] {100 , 200 , 300 });
370+
371+ // Test int array
372+ InternalArray intArray = flussRowAsPaimonRow .getArray (3 );
373+ assertThat (intArray .size ()).isEqualTo (3 );
374+ assertThat (intArray .getInt (0 )).isEqualTo (1000 );
375+ assertThat (intArray .getInt (1 )).isEqualTo (2000 );
376+ assertThat (intArray .getInt (2 )).isEqualTo (3000 );
377+ assertThat (intArray .toIntArray ()).isEqualTo (new int [] {1000 , 2000 , 3000 });
378+
379+ // Test long array
380+ InternalArray longArray = flussRowAsPaimonRow .getArray (4 );
381+ assertThat (longArray .size ()).isEqualTo (3 );
382+ assertThat (longArray .getLong (0 )).isEqualTo (10000L );
383+ assertThat (longArray .getLong (1 )).isEqualTo (20000L );
384+ assertThat (longArray .getLong (2 )).isEqualTo (30000L );
385+ assertThat (longArray .toLongArray ()).isEqualTo (new long [] {10000L , 20000L , 30000L });
386+
387+ // Test float array
388+ InternalArray floatArray = flussRowAsPaimonRow .getArray (5 );
389+ assertThat (floatArray .size ()).isEqualTo (3 );
390+ assertThat (floatArray .getFloat (0 )).isEqualTo (1.1f );
391+ assertThat (floatArray .getFloat (1 )).isEqualTo (2.2f );
392+ assertThat (floatArray .getFloat (2 )).isEqualTo (3.3f );
393+ assertThat (floatArray .toFloatArray ()).isEqualTo (new float [] {1.1f , 2.2f , 3.3f });
394+
395+ // Test double array
396+ InternalArray doubleArray = flussRowAsPaimonRow .getArray (6 );
397+ assertThat (doubleArray .size ()).isEqualTo (3 );
398+ assertThat (doubleArray .getDouble (0 )).isEqualTo (1.11 );
399+ assertThat (doubleArray .getDouble (1 )).isEqualTo (2.22 );
400+ assertThat (doubleArray .getDouble (2 )).isEqualTo (3.33 );
401+ assertThat (doubleArray .toDoubleArray ()).isEqualTo (new double [] {1.11 , 2.22 , 3.33 });
402+ }
403+
404+ @ Test
405+ void testArrayWithDecimalElements () {
406+ RowType tableRowType =
407+ RowType .of (
408+ new org .apache .paimon .types .ArrayType (
409+ new org .apache .paimon .types .DecimalType (10 , 2 )));
410+
411+ long logOffset = 0 ;
412+ long timeStamp = System .currentTimeMillis ();
413+ GenericRow genericRow = new GenericRow (1 );
414+ genericRow .setField (
415+ 0 ,
416+ new GenericArray (
417+ new Object [] {
418+ Decimal .fromBigDecimal (new BigDecimal ("123.45" ), 10 , 2 ),
419+ Decimal .fromBigDecimal (new BigDecimal ("678.90" ), 10 , 2 )
420+ }));
421+
422+ LogRecord logRecord = new GenericRecord (logOffset , timeStamp , APPEND_ONLY , genericRow );
423+ FlussRowAsPaimonRow flussRowAsPaimonRow =
424+ new FlussRowAsPaimonRow (logRecord .getRow (), tableRowType );
425+
426+ InternalArray array = flussRowAsPaimonRow .getArray (0 );
427+ assertThat (array .size ()).isEqualTo (2 );
428+ assertThat (array .getDecimal (0 , 10 , 2 ).toBigDecimal ()).isEqualTo (new BigDecimal ("123.45" ));
429+ assertThat (array .getDecimal (1 , 10 , 2 ).toBigDecimal ()).isEqualTo (new BigDecimal ("678.90" ));
430+ }
431+
432+ @ Test
433+ void testArrayWithTimestampElements () {
434+ RowType tableRowType =
435+ RowType .of (
436+ new org .apache .paimon .types .ArrayType (
437+ new org .apache .paimon .types .TimestampType (3 )));
438+
439+ long logOffset = 0 ;
440+ long timeStamp = System .currentTimeMillis ();
441+ GenericRow genericRow = new GenericRow (1 );
442+ genericRow .setField (
443+ 0 ,
444+ new GenericArray (
445+ new Object [] {
446+ TimestampNtz .fromMillis (1698235273182L ),
447+ TimestampNtz .fromMillis (1698235274000L )
448+ }));
449+
450+ LogRecord logRecord = new GenericRecord (logOffset , timeStamp , APPEND_ONLY , genericRow );
451+ FlussRowAsPaimonRow flussRowAsPaimonRow =
452+ new FlussRowAsPaimonRow (logRecord .getRow (), tableRowType );
453+
454+ InternalArray array = flussRowAsPaimonRow .getArray (0 );
455+ assertThat (array .size ()).isEqualTo (2 );
456+ assertThat (array .getTimestamp (0 , 3 ).getMillisecond ()).isEqualTo (1698235273182L );
457+ assertThat (array .getTimestamp (1 , 3 ).getMillisecond ()).isEqualTo (1698235274000L );
458+ }
459+
460+ @ Test
461+ void testArrayWithBinaryElements () {
462+ RowType tableRowType =
463+ RowType .of (
464+ new org .apache .paimon .types .ArrayType (
465+ new org .apache .paimon .types .VarBinaryType ()));
466+
467+ long logOffset = 0 ;
468+ long timeStamp = System .currentTimeMillis ();
469+ GenericRow genericRow = new GenericRow (1 );
470+ genericRow .setField (
471+ 0 ,
472+ new GenericArray (
473+ new Object [] {
474+ new byte [] {1 , 2 , 3 },
475+ new byte [] {4 , 5 , 6 , 7 }
476+ }));
477+
478+ LogRecord logRecord = new GenericRecord (logOffset , timeStamp , APPEND_ONLY , genericRow );
479+ FlussRowAsPaimonRow flussRowAsPaimonRow =
480+ new FlussRowAsPaimonRow (logRecord .getRow (), tableRowType );
481+
482+ InternalArray array = flussRowAsPaimonRow .getArray (0 );
483+ assertThat (array .size ()).isEqualTo (2 );
484+ assertThat (array .getBinary (0 )).isEqualTo (new byte [] {1 , 2 , 3 });
485+ assertThat (array .getBinary (1 )).isEqualTo (new byte [] {4 , 5 , 6 , 7 });
486+ }
312487}
0 commit comments