3232import org .apache .flink .table .data .TimestampData ;
3333
3434import static org .apache .fluss .flink .utils .FlussRowToFlinkRowConverter .createInternalConverter ;
35- import static org .apache .fluss .types .DataTypeChecks .getLength ;
36- import static org .apache .fluss .types .DataTypeChecks .getPrecision ;
37- import static org .apache .fluss .types .DataTypeChecks .getScale ;
3835
3936/** Flink Array Converter. */
4037public class FlinkArrayConverter implements ArrayData {
@@ -48,32 +45,42 @@ public class FlinkArrayConverter implements ArrayData {
4845 private ArrayData copyArray (org .apache .fluss .row .InternalArray from , DataType eleType ) {
4946 FlussRowToFlinkRowConverter .FlussDeserializationConverter converter =
5047 createInternalConverter (eleType );
48+ InternalArray .ElementGetter elementGetter = InternalArray .createElementGetter (eleType );
49+
5150 if (!eleType .isNullable ()) {
52- switch (eleType .getTypeRoot ()) {
53- case BOOLEAN :
54- return new GenericArrayData (from .toBooleanArray ());
55- case TINYINT :
56- return new GenericArrayData (from .toByteArray ());
57- case SMALLINT :
58- return new GenericArrayData (from .toShortArray ());
59- case INTEGER :
60- case DATE :
61- case TIME_WITHOUT_TIME_ZONE :
62- return new GenericArrayData (from .toIntArray ());
63- case BIGINT :
64- return new GenericArrayData (from .toLongArray ());
65- case FLOAT :
66- return new GenericArrayData (from .toFloatArray ());
67- case DOUBLE :
68- return new GenericArrayData (from .toDoubleArray ());
51+ try {
52+ switch (eleType .getTypeRoot ()) {
53+ case BOOLEAN :
54+ return new GenericArrayData (from .toBooleanArray ());
55+ case TINYINT :
56+ return new GenericArrayData (from .toByteArray ());
57+ case SMALLINT :
58+ return new GenericArrayData (from .toShortArray ());
59+ case INTEGER :
60+ case DATE :
61+ case TIME_WITHOUT_TIME_ZONE :
62+ return new GenericArrayData (from .toIntArray ());
63+ case BIGINT :
64+ return new GenericArrayData (from .toLongArray ());
65+ case FLOAT :
66+ return new GenericArrayData (from .toFloatArray ());
67+ case DOUBLE :
68+ return new GenericArrayData (from .toDoubleArray ());
69+ default :
70+ // Fall through to element-by-element conversion for complex types
71+ break ;
72+ }
73+ } catch (Exception e ) {
74+ // Fall back to element-by-element conversion if primitive array access fails
6975 }
7076 }
7177
7278 Object [] newArray = new Object [from .size ()];
7379
7480 for (int i = 0 ; i < newArray .length ; ++i ) {
75- if (!from .isNullAt (i )) {
76- newArray [i ] = converter .deserialize (getFieldValue (from , i , eleType ));
81+ Object element = elementGetter .getElementOrNull (from , i );
82+ if (element != null ) {
83+ newArray [i ] = converter .deserialize (element );
7784 } else {
7885 newArray [i ] = null ;
7986 }
@@ -209,54 +216,4 @@ public ArrayData getArrayData() {
209216 public static ArrayData deserialize (DataType flussDataType , Object flussField ) {
210217 return new FlinkArrayConverter (flussDataType , flussField ).getArrayData ();
211218 }
212-
213- private static Object getFieldValue (InternalArray array , int pos , DataType dataType ) {
214- if (array .isNullAt (pos )) {
215- return null ;
216- }
217-
218- switch (dataType .getTypeRoot ()) {
219- case CHAR :
220- return array .getChar (pos , getLength (dataType ));
221- case STRING :
222- return array .getString (pos );
223- case BOOLEAN :
224- return array .getBoolean (pos );
225- case BINARY :
226- return array .getBinary (pos , getLength (dataType ));
227- case BYTES :
228- return array .getBytes (pos );
229- case DECIMAL :
230- return array .getDecimal (pos , getPrecision (dataType ), getScale (dataType ));
231- case TINYINT :
232- return array .getByte (pos );
233- case SMALLINT :
234- return array .getShort (pos );
235- case INTEGER :
236- case DATE :
237- case TIME_WITHOUT_TIME_ZONE :
238- return array .getInt (pos );
239- case BIGINT :
240- return array .getLong (pos );
241- case FLOAT :
242- return array .getFloat (pos );
243- case DOUBLE :
244- return array .getDouble (pos );
245- case TIMESTAMP_WITHOUT_TIME_ZONE :
246- return array .getTimestampNtz (pos , getPrecision (dataType ));
247- case TIMESTAMP_WITH_LOCAL_TIME_ZONE :
248- return array .getTimestampLtz (pos , getPrecision (dataType ));
249- case ARRAY :
250- return array .getArray (pos );
251- // TODO: Add Map type support in future
252- case MAP :
253- throw new UnsupportedOperationException ("Map type not supported yet" );
254- // TODO: Requires InternalArray.getRow() method from fluss-common Row type support
255- case ROW :
256- // return array.getRow(pos, getFieldCount(dataType));
257- throw new UnsupportedOperationException ("Row type requires fluss-common update" );
258- default :
259- throw new IllegalArgumentException ("Unsupported data type: " + dataType );
260- }
261- }
262219}
0 commit comments