Class BinaryArrayData
- java.lang.Object
-
- org.apache.flink.cdc.common.data.binary.BinarySection
-
- org.apache.flink.cdc.common.data.binary.BinaryArrayData
-
- All Implemented Interfaces:
ArrayData,BinaryFormat
public final class BinaryArrayData extends BinarySection implements ArrayData
A binary implementation ofArrayDatawhich is backed byMemorySegments.This class provides a way to store array data in a binary format that is compact and efficient. It uses
MemorySegments to manage the binary representation of the data, allowing for efficient storage and access.The binary layout of
BinaryArrayDatais structured as follows:[size(int)] + [null bits(4-byte word boundaries)] + [values or offset&length] + [variable length part].
- size: The first 4 bytes store the number of elements in the array.
- null bits: A bitmap to track null values, aligned to 4-byte word boundaries. Each bit represents whether an element is null.
- values or offset&length: The values of the array elements. For fixed-length primitive types, the values are stored directly. For variable-length types (e.g., strings, maps), this part stores the offset and length of the actual data in the variable length part.
- variable length part: This part of the memory segment stores the actual data for variable-length types (e.g., strings, maps).
The header size is calculated based on the number of elements in the array, ensuring efficient alignment and access.
For fields that hold fixed-length primitive types, such as long, double, or int, they are stored compactly in bytes, just like the original Java array.
The class also provides methods to convert the binary data back into Java primitive arrays, handling various types such as boolean, byte, short, int, long, float, and double.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface org.apache.flink.cdc.common.data.ArrayData
ArrayData.ElementGetter
-
-
Field Summary
-
Fields inherited from class org.apache.flink.cdc.common.data.binary.BinarySection
offset, segments, sizeInBytes
-
Fields inherited from interface org.apache.flink.cdc.common.data.binary.BinaryFormat
HIGHEST_FIRST_BIT, HIGHEST_SECOND_TO_EIGHTH_BIT, MAX_FIX_PART_DATA_SIZE
-
-
Constructor Summary
Constructors Constructor Description BinaryArrayData()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description booleananyNull()static intcalculateFixLengthPartSize(DataType type)It store real value when type is primitive.static intcalculateHeaderInBytes(int numFields)Calculates the size of the header in bytes for an array with the specified number of fields.BinaryArrayDatacopy()BinaryArrayDatacopy(BinaryArrayData reuse)static BinaryArrayDatafromPrimitiveArray(boolean[] arr)static BinaryArrayDatafromPrimitiveArray(byte[] arr)static BinaryArrayDatafromPrimitiveArray(double[] arr)static BinaryArrayDatafromPrimitiveArray(float[] arr)static BinaryArrayDatafromPrimitiveArray(int[] arr)static BinaryArrayDatafromPrimitiveArray(long[] arr)static BinaryArrayDatafromPrimitiveArray(short[] arr)ArrayDatagetArray(int pos)Returns the array value at the given position.byte[]getBinary(int pos)Returns the binary value at the given position.booleangetBoolean(int pos)Returns the boolean value at the given position.bytegetByte(int pos)Returns the byte value at the given position.DecimalDatagetDecimal(int pos, int precision, int scale)Returns the decimal value at the given position.doublegetDouble(int pos)Returns the double value at the given position.floatgetFloat(int pos)Returns the float value at the given position.intgetInt(int pos)Returns the integer value at the given position.LocalZonedTimestampDatagetLocalZonedTimestamp(int pos, int precision)Returns the local zoned timestamp value at the given position.longgetLong(int pos)Returns the long value at the given position.MapDatagetMap(int pos)Returns the map value at the given position.RecordDatagetRecord(int pos, int numFields)Returns the record value at the given position.shortgetShort(int pos)Returns the short value at the given position.StringDatagetString(int pos)Returns the string value at the given position.TimestampDatagetTimestamp(int pos, int precision)Returns the timestamp value at the given position.ZonedTimestampDatagetZonedTimestamp(int pos, int precision)Returns the zoned timestamp value at the given position.inthashCode()booleanisNullAt(int pos)Returns true if the element is null at the given position.voidpointTo(org.apache.flink.core.memory.MemorySegment[] segments, int offset, int sizeInBytes)voidsetBoolean(int pos, boolean value)voidsetByte(int pos, byte value)voidsetDecimal(int pos, DecimalData value, int precision)voidsetDouble(int pos, double value)voidsetFloat(int pos, float value)voidsetInt(int pos, int value)voidsetLong(int pos, long value)voidsetNotNullAt(int pos)voidsetNullAt(int pos)voidsetNullBoolean(int pos)voidsetNullByte(int pos)voidsetNullDouble(int pos)voidsetNullFloat(int pos)voidsetNullInt(int pos)voidsetNullLong(int pos)voidsetNullShort(int pos)voidsetShort(int pos, short value)voidsetTimestamp(int pos, TimestampData value, int precision)intsize()Returns the number of elements in this array.boolean[]toBooleanArray()byte[]toByteArray()double[]toDoubleArray()float[]toFloatArray()int[]toIntArray()long[]toLongArray()<T> T[]toObjectArray(DataType elementType)short[]toShortArray()-
Methods inherited from class org.apache.flink.cdc.common.data.binary.BinarySection
equals, getOffset, getSegments, getSizeInBytes, pointTo
-
-
-
-
Method Detail
-
calculateHeaderInBytes
public static int calculateHeaderInBytes(int numFields)
Calculates the size of the header in bytes for an array with the specified number of fields.The header consists of:
- 4 bytes to store the size of the array (number of elements).
- A bitmap to track null values, where each bit represents whether an element is null. This bitmap is aligned to 4-byte word boundaries for efficient memory access and to facilitate the use of bitwise operations.
The size of the bitmap is determined by the number of elements in the array:
- Each element requires 1 bit in the bitmap.
- The total number of bits is rounded up to the nearest multiple of 32 to ensure alignment to 4-byte word boundaries (i.e., a 32-bit integer).
The formula for calculating the size of the header is:
header size = 4 bytes (for array size) + ((numFields + 31) / 32) * 4 bytes (for null bitmap)
- Parameters:
numFields- the number of elements in the array- Returns:
- the size of the header in bytes
-
calculateFixLengthPartSize
public static int calculateFixLengthPartSize(DataType type)
It store real value when type is primitive. It store the length and offset of variable-length part when type is string, map, etc.
-
size
public int size()
Description copied from interface:ArrayDataReturns the number of elements in this array.
-
pointTo
public void pointTo(org.apache.flink.core.memory.MemorySegment[] segments, int offset, int sizeInBytes)- Overrides:
pointToin classBinarySection
-
isNullAt
public boolean isNullAt(int pos)
Description copied from interface:ArrayDataReturns true if the element is null at the given position.
-
setNullAt
public void setNullAt(int pos)
-
setNotNullAt
public void setNotNullAt(int pos)
-
getLong
public long getLong(int pos)
Description copied from interface:ArrayDataReturns the long value at the given position.
-
setLong
public void setLong(int pos, long value)
-
setNullLong
public void setNullLong(int pos)
-
getInt
public int getInt(int pos)
Description copied from interface:ArrayDataReturns the integer value at the given position.
-
setInt
public void setInt(int pos, int value)
-
setNullInt
public void setNullInt(int pos)
-
getString
public StringData getString(int pos)
Description copied from interface:ArrayDataReturns the string value at the given position.
-
getDecimal
public DecimalData getDecimal(int pos, int precision, int scale)
Description copied from interface:ArrayDataReturns the decimal value at the given position.The precision and scale are required to determine whether the decimal value was stored in a compact representation (see
DecimalData).- Specified by:
getDecimalin interfaceArrayData
-
getTimestamp
public TimestampData getTimestamp(int pos, int precision)
Description copied from interface:ArrayDataReturns the timestamp value at the given position.The precision is required to determine whether the timestamp value was stored in a compact representation (see
TimestampData).- Specified by:
getTimestampin interfaceArrayData
-
getLocalZonedTimestamp
public LocalZonedTimestampData getLocalZonedTimestamp(int pos, int precision)
Description copied from interface:ArrayDataReturns the local zoned timestamp value at the given position.The precision is required to determine whether the timestamp value was stored in a compact representation (see
LocalZonedTimestampData).- Specified by:
getLocalZonedTimestampin interfaceArrayData
-
getZonedTimestamp
public ZonedTimestampData getZonedTimestamp(int pos, int precision)
Description copied from interface:ArrayDataReturns the zoned timestamp value at the given position.The precision is required to determine whether the timestamp value was stored in a compact representation (see
ZonedTimestampData).- Specified by:
getZonedTimestampin interfaceArrayData
-
getBinary
public byte[] getBinary(int pos)
Description copied from interface:ArrayDataReturns the binary value at the given position.
-
getArray
public ArrayData getArray(int pos)
Description copied from interface:ArrayDataReturns the array value at the given position.
-
getMap
public MapData getMap(int pos)
Description copied from interface:ArrayDataReturns the map value at the given position.
-
getRecord
public RecordData getRecord(int pos, int numFields)
Description copied from interface:ArrayDataReturns the record value at the given position.The number of fields is required to correctly extract the row.
-
getBoolean
public boolean getBoolean(int pos)
Description copied from interface:ArrayDataReturns the boolean value at the given position.- Specified by:
getBooleanin interfaceArrayData
-
setBoolean
public void setBoolean(int pos, boolean value)
-
setNullBoolean
public void setNullBoolean(int pos)
-
getByte
public byte getByte(int pos)
Description copied from interface:ArrayDataReturns the byte value at the given position.
-
setByte
public void setByte(int pos, byte value)
-
setNullByte
public void setNullByte(int pos)
-
getShort
public short getShort(int pos)
Description copied from interface:ArrayDataReturns the short value at the given position.
-
setShort
public void setShort(int pos, short value)
-
setNullShort
public void setNullShort(int pos)
-
getFloat
public float getFloat(int pos)
Description copied from interface:ArrayDataReturns the float value at the given position.
-
setFloat
public void setFloat(int pos, float value)
-
setNullFloat
public void setNullFloat(int pos)
-
getDouble
public double getDouble(int pos)
Description copied from interface:ArrayDataReturns the double value at the given position.
-
setDouble
public void setDouble(int pos, double value)
-
setNullDouble
public void setNullDouble(int pos)
-
setDecimal
public void setDecimal(int pos, DecimalData value, int precision)
-
setTimestamp
public void setTimestamp(int pos, TimestampData value, int precision)
-
anyNull
public boolean anyNull()
-
toBooleanArray
public boolean[] toBooleanArray()
- Specified by:
toBooleanArrayin interfaceArrayData
-
toByteArray
public byte[] toByteArray()
- Specified by:
toByteArrayin interfaceArrayData
-
toShortArray
public short[] toShortArray()
- Specified by:
toShortArrayin interfaceArrayData
-
toIntArray
public int[] toIntArray()
- Specified by:
toIntArrayin interfaceArrayData
-
toLongArray
public long[] toLongArray()
- Specified by:
toLongArrayin interfaceArrayData
-
toFloatArray
public float[] toFloatArray()
- Specified by:
toFloatArrayin interfaceArrayData
-
toDoubleArray
public double[] toDoubleArray()
- Specified by:
toDoubleArrayin interfaceArrayData
-
toObjectArray
public <T> T[] toObjectArray(DataType elementType)
-
copy
public BinaryArrayData copy()
-
copy
public BinaryArrayData copy(BinaryArrayData reuse)
-
hashCode
public int hashCode()
- Overrides:
hashCodein classBinarySection
-
fromPrimitiveArray
public static BinaryArrayData fromPrimitiveArray(boolean[] arr)
-
fromPrimitiveArray
public static BinaryArrayData fromPrimitiveArray(byte[] arr)
-
fromPrimitiveArray
public static BinaryArrayData fromPrimitiveArray(short[] arr)
-
fromPrimitiveArray
public static BinaryArrayData fromPrimitiveArray(int[] arr)
-
fromPrimitiveArray
public static BinaryArrayData fromPrimitiveArray(long[] arr)
-
fromPrimitiveArray
public static BinaryArrayData fromPrimitiveArray(float[] arr)
-
fromPrimitiveArray
public static BinaryArrayData fromPrimitiveArray(double[] arr)
-
-