Skip to content

Commit 51a1a8f

Browse files
binary-signalluoyuxia
authored andcommitted
add more tests with array primitives
Signed-off-by: binary-signal <[email protected]>
1 parent 1b2580c commit 51a1a8f

File tree

2 files changed

+317
-0
lines changed

2 files changed

+317
-0
lines changed

fluss-lake/fluss-lake-paimon/src/test/java/org/apache/fluss/lake/paimon/source/FlussRowAsPaimonRowTest.java

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

fluss-lake/fluss-lake-paimon/src/test/java/org/apache/fluss/lake/paimon/utils/PaimonRowAsFlussRowTest.java

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,4 +239,146 @@ void testArrayWithBooleanElements() {
239239
assertThat(array.getBoolean(1)).isFalse();
240240
assertThat(array.getBoolean(2)).isTrue();
241241
}
242+
243+
@Test
244+
void testArrayWithAllPrimitiveTypes() {
245+
GenericRow paimonRow = new GenericRow(10);
246+
paimonRow.setField(0, new GenericArray(new boolean[] {true, false}));
247+
paimonRow.setField(1, new GenericArray(new byte[] {1, 2, 3}));
248+
paimonRow.setField(2, new GenericArray(new short[] {100, 200}));
249+
paimonRow.setField(3, new GenericArray(new int[] {1000, 2000}));
250+
paimonRow.setField(4, new GenericArray(new long[] {10000L, 20000L}));
251+
paimonRow.setField(5, new GenericArray(new float[] {1.1f, 2.2f}));
252+
paimonRow.setField(6, new GenericArray(new double[] {1.11, 2.22}));
253+
// System columns
254+
paimonRow.setField(7, 0);
255+
paimonRow.setField(8, 0L);
256+
paimonRow.setField(9, 0L);
257+
258+
PaimonRowAsFlussRow flussRow = new PaimonRowAsFlussRow(paimonRow);
259+
260+
// Test boolean array with toArray
261+
InternalArray boolArray = flussRow.getArray(0);
262+
assertThat(boolArray.toBooleanArray()).isEqualTo(new boolean[] {true, false});
263+
264+
// Test byte array with toArray
265+
InternalArray byteArray = flussRow.getArray(1);
266+
assertThat(byteArray.getByte(0)).isEqualTo((byte) 1);
267+
assertThat(byteArray.getByte(1)).isEqualTo((byte) 2);
268+
assertThat(byteArray.toByteArray()).isEqualTo(new byte[] {1, 2, 3});
269+
270+
// Test short array with toArray
271+
InternalArray shortArray = flussRow.getArray(2);
272+
assertThat(shortArray.getShort(0)).isEqualTo((short) 100);
273+
assertThat(shortArray.getShort(1)).isEqualTo((short) 200);
274+
assertThat(shortArray.toShortArray()).isEqualTo(new short[] {100, 200});
275+
276+
// Test int array with toArray
277+
InternalArray intArray = flussRow.getArray(3);
278+
assertThat(intArray.toIntArray()).isEqualTo(new int[] {1000, 2000});
279+
280+
// Test long array with toArray
281+
InternalArray longArray = flussRow.getArray(4);
282+
assertThat(longArray.toLongArray()).isEqualTo(new long[] {10000L, 20000L});
283+
284+
// Test float array with toArray
285+
InternalArray floatArray = flussRow.getArray(5);
286+
assertThat(floatArray.getFloat(0)).isEqualTo(1.1f);
287+
assertThat(floatArray.toFloatArray()).isEqualTo(new float[] {1.1f, 2.2f});
288+
289+
// Test double array with toArray
290+
InternalArray doubleArray = flussRow.getArray(6);
291+
assertThat(doubleArray.toDoubleArray()).isEqualTo(new double[] {1.11, 2.22});
292+
}
293+
294+
@Test
295+
void testArrayWithDecimalElements() {
296+
GenericRow paimonRow = new GenericRow(4);
297+
paimonRow.setField(
298+
0,
299+
new GenericArray(
300+
new Object[] {
301+
org.apache.paimon.data.Decimal.fromBigDecimal(
302+
new java.math.BigDecimal("123.45"), 10, 2),
303+
org.apache.paimon.data.Decimal.fromBigDecimal(
304+
new java.math.BigDecimal("678.90"), 10, 2)
305+
}));
306+
paimonRow.setField(1, 0);
307+
paimonRow.setField(2, 0L);
308+
paimonRow.setField(3, 0L);
309+
310+
PaimonRowAsFlussRow flussRow = new PaimonRowAsFlussRow(paimonRow);
311+
312+
InternalArray array = flussRow.getArray(0);
313+
assertThat(array.size()).isEqualTo(2);
314+
assertThat(array.getDecimal(0, 10, 2).toBigDecimal())
315+
.isEqualTo(new java.math.BigDecimal("123.45"));
316+
assertThat(array.getDecimal(1, 10, 2).toBigDecimal())
317+
.isEqualTo(new java.math.BigDecimal("678.90"));
318+
}
319+
320+
@Test
321+
void testArrayWithTimestampElements() {
322+
GenericRow paimonRow = new GenericRow(4);
323+
paimonRow.setField(
324+
0,
325+
new GenericArray(
326+
new Object[] {
327+
org.apache.paimon.data.Timestamp.fromEpochMillis(1698235273182L),
328+
org.apache.paimon.data.Timestamp.fromEpochMillis(1698235274000L)
329+
}));
330+
paimonRow.setField(1, 0);
331+
paimonRow.setField(2, 0L);
332+
paimonRow.setField(3, 0L);
333+
334+
PaimonRowAsFlussRow flussRow = new PaimonRowAsFlussRow(paimonRow);
335+
336+
InternalArray array = flussRow.getArray(0);
337+
assertThat(array.size()).isEqualTo(2);
338+
assertThat(array.getTimestampNtz(0, 3).getMillisecond()).isEqualTo(1698235273182L);
339+
assertThat(array.getTimestampLtz(1, 3).getEpochMillisecond()).isEqualTo(1698235274000L);
340+
}
341+
342+
@Test
343+
void testArrayWithBinaryElements() {
344+
GenericRow paimonRow = new GenericRow(4);
345+
paimonRow.setField(
346+
0,
347+
new GenericArray(
348+
new Object[] {
349+
new byte[] {1, 2, 3},
350+
new byte[] {4, 5, 6, 7}
351+
}));
352+
paimonRow.setField(1, 0);
353+
paimonRow.setField(2, 0L);
354+
paimonRow.setField(3, 0L);
355+
356+
PaimonRowAsFlussRow flussRow = new PaimonRowAsFlussRow(paimonRow);
357+
358+
InternalArray array = flussRow.getArray(0);
359+
assertThat(array.size()).isEqualTo(2);
360+
assertThat(array.getBinary(0, 3)).isEqualTo(new byte[] {1, 2, 3});
361+
assertThat(array.getBytes(1)).isEqualTo(new byte[] {4, 5, 6, 7});
362+
}
363+
364+
@Test
365+
void testArrayWithCharElements() {
366+
GenericRow paimonRow = new GenericRow(4);
367+
paimonRow.setField(
368+
0,
369+
new GenericArray(
370+
new BinaryString[] {
371+
BinaryString.fromString("abc"), BinaryString.fromString("def")
372+
}));
373+
paimonRow.setField(1, 0);
374+
paimonRow.setField(2, 0L);
375+
paimonRow.setField(3, 0L);
376+
377+
PaimonRowAsFlussRow flussRow = new PaimonRowAsFlussRow(paimonRow);
378+
379+
InternalArray array = flussRow.getArray(0);
380+
assertThat(array.size()).isEqualTo(2);
381+
assertThat(array.getChar(0, 3).toString()).isEqualTo("abc");
382+
assertThat(array.getString(1).toString()).isEqualTo("def");
383+
}
242384
}

0 commit comments

Comments
 (0)