Skip to content

Commit e8bbdf6

Browse files
fix failed cases
1 parent e8be1f7 commit e8bbdf6

File tree

26 files changed

+822
-566
lines changed

26 files changed

+822
-566
lines changed

fluss-client/pom.xml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,6 @@
113113
<include>*:*</include>
114114
</includes>
115115
</artifactSet>
116-
<filters>
117-
<filter>
118-
<artifact>*</artifact>
119-
<excludes>
120-
<exclude>LICENSE*</exclude>
121-
</excludes>
122-
</filter>
123-
</filters>
124116
</configuration>
125117
</execution>
126118
</executions>

fluss-client/src/test/java/org/apache/fluss/client/table/scanner/log/DefaultCompletedFetchTest.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,21 +227,32 @@ void testComplexTypeFetch() throws Exception {
227227
new Object[] {
228228
1,
229229
new String[] {"a", "b"},
230-
new Object[] {new int[] {1, 2}, new int[] {3, 4}}
230+
new Object[] {new int[] {1, 2}, new int[] {3, 4}},
231+
new Object[] {10, new Object[] {20, "nested"}, "row1"}
231232
},
232233
new Object[] {
233-
2, new String[] {"c", null}, new Object[] {null, new int[] {3, 4}}
234+
2,
235+
new String[] {"c", null},
236+
new Object[] {null, new int[] {3, 4}},
237+
new Object[] {30, new Object[] {40, "test"}, "row2"}
234238
},
235239
new Object[] {
236240
3,
237241
new String[] {"e", "f"},
238-
new Object[] {new int[] {5, 6, 7}, new int[] {8}}
242+
new Object[] {new int[] {5, 6, 7}, new int[] {8}},
243+
new Object[] {50, new Object[] {60, "value"}, "row3"}
239244
});
240245
Schema schema =
241246
Schema.newBuilder()
242247
.column("a", DataTypes.INT())
243248
.column("b", DataTypes.ARRAY(DataTypes.STRING()))
244249
.column("c", DataTypes.ARRAY(DataTypes.ARRAY(DataTypes.INT())))
250+
.column(
251+
"d",
252+
DataTypes.ROW(
253+
DataTypes.INT(),
254+
DataTypes.ROW(DataTypes.INT(), DataTypes.STRING()),
255+
DataTypes.STRING()))
245256
.build();
246257
TableInfo tableInfo =
247258
TableInfo.of(
@@ -299,6 +310,17 @@ void testComplexTypeFetch() throws Exception {
299310
.isEqualTo(Arrays.deepToString((Object[]) complexData.get(i)[1]));
300311
assertThat(row.getArray(2).toString())
301312
.isEqualTo(Arrays.deepToString((Object[]) complexData.get(i)[2]));
313+
InternalRow nestedRow = row.getRow(3, 3);
314+
assertThat(nestedRow).isNotNull();
315+
assertThat(nestedRow.getInt(0)).isEqualTo(((Object[]) complexData.get(i)[3])[0]);
316+
InternalRow deeplyNestedRow = nestedRow.getRow(1, 2);
317+
assertThat(deeplyNestedRow).isNotNull();
318+
assertThat(deeplyNestedRow.getInt(0))
319+
.isEqualTo(((Object[]) ((Object[]) complexData.get(i)[3])[1])[0]);
320+
assertThat(deeplyNestedRow.getString(1).toString())
321+
.isEqualTo(((Object[]) ((Object[]) complexData.get(i)[3])[1])[1]);
322+
assertThat(nestedRow.getString(2).toString())
323+
.isEqualTo(((Object[]) complexData.get(i)[3])[2]);
302324
}
303325
}
304326

fluss-common/src/test/java/org/apache/fluss/row/BinaryArrayTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,4 +929,36 @@ public void testCalculateFixLengthPartSizeForArray() {
929929
assertThat(BinaryArray.calculateFixLengthPartSize(DataTypes.CHAR(10))).isEqualTo(8);
930930
assertThat(BinaryArray.calculateFixLengthPartSize(DataTypes.BINARY(20))).isEqualTo(8);
931931
}
932+
933+
@Test
934+
public void testPrimitiveBinaryArrayGetRowThrowsException() {
935+
PrimitiveBinaryArray array = new PrimitiveBinaryArray();
936+
BinaryArrayWriter writer = new BinaryArrayWriter(array, 3, 4);
937+
writer.writeInt(0, 10);
938+
writer.writeInt(1, 20);
939+
writer.writeInt(2, 30);
940+
writer.complete();
941+
942+
assertThatThrownBy(() -> array.getRow(0, 2))
943+
.isInstanceOf(IllegalArgumentException.class)
944+
.hasMessageContaining("Can not get nested row from array of primitive type");
945+
}
946+
947+
@Test
948+
public void testPrimitiveBinaryArrayGetArray() {
949+
PrimitiveBinaryArray innerArray1 = new PrimitiveBinaryArray();
950+
BinaryArrayWriter innerWriter1 = new BinaryArrayWriter(innerArray1, 2, 4);
951+
innerWriter1.writeInt(0, 10);
952+
innerWriter1.writeInt(1, 20);
953+
innerWriter1.complete();
954+
955+
PrimitiveBinaryArray outerArray = new PrimitiveBinaryArray();
956+
BinaryArrayWriter outerWriter = new BinaryArrayWriter(outerArray, 1, 8);
957+
outerWriter.setOffsetAndSize(0, 0, innerArray1.getSizeInBytes());
958+
outerWriter.complete();
959+
960+
InternalArray result = outerArray.getArray(0);
961+
assertThat(result).isNotNull();
962+
assertThat(result).isInstanceOf(PrimitiveBinaryArray.class);
963+
}
932964
}

fluss-common/src/test/java/org/apache/fluss/row/TestInternalRowGenerator.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,15 @@ public static RowType createAllRowType() {
6363
new DataField("f17", DataTypes.TIMESTAMP_LTZ(1)),
6464
new DataField("f18", DataTypes.TIMESTAMP_LTZ(5)),
6565
new DataField("f19", DataTypes.ARRAY(DataTypes.INT())),
66-
// TODO: Add Map and Row fields in Issue #1973
6766
new DataField(
6867
"f20",
68+
DataTypes.ARRAY(DataTypes.FLOAT().copy(false))), // vector embedding type
69+
new DataField(
70+
"f21",
71+
DataTypes.ARRAY(DataTypes.ARRAY(DataTypes.STRING()))), // nested array
72+
// TODO: Add Map and Row fields in Issue #1973
73+
new DataField(
74+
"f22",
6975
DataTypes.ROW(
7076
new DataField("u1", DataTypes.INT()),
7177
new DataField(
@@ -123,6 +129,17 @@ public static IndexedRow genIndexedRowForAllType() {
123129
GenericArray array1 = GenericArray.of(1, 2, 3, 4, 5, -11, null, 444, 102234);
124130
setRandomNull(writers[19], writer, 19, rnd, array1);
125131

132+
GenericArray array2 =
133+
GenericArray.of(0.1f, 1.1f, -0.5f, 6.6f, Float.MAX_VALUE, Float.MIN_VALUE);
134+
setRandomNull(writers[20], writer, 20, rnd, array2);
135+
136+
GenericArray array3 =
137+
GenericArray.of(
138+
GenericArray.of(fromString("a"), null, fromString("c")),
139+
null,
140+
GenericArray.of(fromString("hello"), fromString("world")));
141+
setRandomNull(writers[21], writer, 21, rnd, array3);
142+
126143
// TODO: Map type support will be added in Issue #1973
127144
// Map<Object, Object> javaMap = new HashMap<>();
128145
// javaMap.put(0, null);
@@ -131,9 +148,9 @@ public static IndexedRow genIndexedRowForAllType() {
131148
// GenericMap map = new GenericMap(javaMap);
132149
// setRandomNull(writers[20], writer, 20, rnd, map);
133150

134-
GenericRow innerRow = GenericRow.of(20);
151+
GenericRow innerRow = GenericRow.of(22);
135152
GenericRow genericRow = GenericRow.of(123, innerRow, BinaryString.fromString("Test"));
136-
setRandomNull(writers[20], writer, 20, rnd, genericRow);
153+
setRandomNull(writers[22], writer, 22, rnd, genericRow);
137154

138155
IndexedRow row = new IndexedRow(dataTypes);
139156
row.pointTo(writer.segment(), 0, writer.position());

fluss-common/src/test/java/org/apache/fluss/row/aligned/AlignedRowTest.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import org.apache.fluss.row.BinaryString;
2222
import org.apache.fluss.row.BinaryWriter;
2323
import org.apache.fluss.row.Decimal;
24+
import org.apache.fluss.row.InternalArray;
25+
import org.apache.fluss.row.InternalRow;
2426
import org.apache.fluss.row.TimestampLtz;
2527
import org.apache.fluss.row.TimestampNtz;
2628
import org.apache.fluss.types.DataType;
@@ -744,4 +746,78 @@ public void testComplexDataMix() {
744746
assertThat(row.getTimestampNtz(10, 9).toString()).contains("2021-01-01T00:00:00.000123456");
745747
assertThat(row.isNullAt(11)).isTrue();
746748
}
749+
750+
@Test
751+
public void testAlignedArrayGetRow() {
752+
DataType rowType =
753+
DataTypes.ROW(
754+
DataTypes.FIELD("f1", DataTypes.INT()),
755+
DataTypes.FIELD("f2", DataTypes.STRING()));
756+
DataType arrayType = DataTypes.ARRAY(rowType);
757+
758+
AlignedRow outerRow = new AlignedRow(1);
759+
AlignedRowWriter outerWriter = new AlignedRowWriter(outerRow);
760+
761+
org.apache.fluss.row.GenericRow row1 =
762+
org.apache.fluss.row.GenericRow.of(100, BinaryString.fromString("nested"));
763+
org.apache.fluss.row.GenericRow row2 =
764+
org.apache.fluss.row.GenericRow.of(200, BinaryString.fromString("nested2"));
765+
org.apache.fluss.row.GenericArray arrayData =
766+
org.apache.fluss.row.GenericArray.of(row1, row2);
767+
768+
BinaryWriter.ValueWriter arrayWriter = BinaryWriter.createValueWriter(arrayType, ALIGNED);
769+
arrayWriter.writeValue(outerWriter, 0, arrayData);
770+
outerWriter.complete();
771+
772+
InternalArray array = outerRow.getArray(0);
773+
assertThat(array).isNotNull();
774+
assertThat(array.size()).isEqualTo(2);
775+
776+
InternalRow nestedRow1 = array.getRow(0, 2);
777+
assertThat(nestedRow1.getInt(0)).isEqualTo(100);
778+
assertThat(nestedRow1.getString(1)).isEqualTo(BinaryString.fromString("nested"));
779+
780+
InternalRow nestedRow2 = array.getRow(1, 2);
781+
assertThat(nestedRow2.getInt(0)).isEqualTo(200);
782+
assertThat(nestedRow2.getString(1)).isEqualTo(BinaryString.fromString("nested2"));
783+
}
784+
785+
@Test
786+
public void testAlignedArrayGetNestedArray() {
787+
DataType innerArrayType = DataTypes.ARRAY(DataTypes.INT());
788+
DataType outerArrayType = DataTypes.ARRAY(innerArrayType);
789+
790+
AlignedRow outerRow = new AlignedRow(1);
791+
AlignedRowWriter outerWriter = new AlignedRowWriter(outerRow);
792+
793+
org.apache.fluss.row.GenericArray innerArray1 =
794+
org.apache.fluss.row.GenericArray.of(10, 20, 30);
795+
org.apache.fluss.row.GenericArray innerArray2 =
796+
org.apache.fluss.row.GenericArray.of(40, 50, 60);
797+
org.apache.fluss.row.GenericArray outerArrayData =
798+
org.apache.fluss.row.GenericArray.of(innerArray1, innerArray2);
799+
800+
BinaryWriter.ValueWriter arrayWriter =
801+
BinaryWriter.createValueWriter(outerArrayType, ALIGNED);
802+
arrayWriter.writeValue(outerWriter, 0, outerArrayData);
803+
outerWriter.complete();
804+
805+
InternalArray outerArray = outerRow.getArray(0);
806+
assertThat(outerArray).isNotNull();
807+
assertThat(outerArray.size()).isEqualTo(2);
808+
809+
InternalArray nestedArray1 = outerArray.getArray(0);
810+
assertThat(nestedArray1).isNotNull();
811+
assertThat(nestedArray1.size()).isEqualTo(3);
812+
assertThat(nestedArray1.getInt(0)).isEqualTo(10);
813+
assertThat(nestedArray1.getInt(1)).isEqualTo(20);
814+
assertThat(nestedArray1.getInt(2)).isEqualTo(30);
815+
816+
InternalArray nestedArray2 = outerArray.getArray(1);
817+
assertThat(nestedArray2).isNotNull();
818+
assertThat(nestedArray2.size()).isEqualTo(3);
819+
assertThat(nestedArray2.getInt(0)).isEqualTo(40);
820+
assertThat(nestedArray2.getInt(1)).isEqualTo(50);
821+
assertThat(nestedArray2.getInt(2)).isEqualTo(60);
822+
}
747823
}

fluss-common/src/test/java/org/apache/fluss/row/compacted/CompactedRowTest.java

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.junit.jupiter.api.Test;
2929

3030
import static org.assertj.core.api.Assertions.assertThat;
31+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
3132

3233
/** Test for {@link CompactedRow}. */
3334
public class CompactedRowTest {
@@ -412,4 +413,98 @@ public void testLargeRow() {
412413
assertThat(row.getInt(i)).isEqualTo(i * 10);
413414
}
414415
}
416+
417+
@Test
418+
public void testCompactedArrayGetRowWithInvalidType() {
419+
DataType arrayType = DataTypes.ARRAY(DataTypes.INT());
420+
DataType[] fieldTypes = {arrayType};
421+
422+
CompactedRow outerRow = new CompactedRow(fieldTypes);
423+
CompactedRowWriter outerWriter = new CompactedRowWriter(fieldTypes.length);
424+
425+
org.apache.fluss.row.GenericArray arrayData = org.apache.fluss.row.GenericArray.of(1, 2, 3);
426+
org.apache.fluss.row.serializer.ArraySerializer serializer =
427+
new org.apache.fluss.row.serializer.ArraySerializer(
428+
DataTypes.INT(), org.apache.fluss.row.BinaryRow.BinaryRowFormat.COMPACTED);
429+
outerWriter.writeArray(arrayData, serializer);
430+
431+
outerRow.pointTo(outerWriter.segment(), 0, outerWriter.position());
432+
433+
org.apache.fluss.row.InternalArray array = outerRow.getArray(0);
434+
assertThatThrownBy(() -> array.getRow(0, 1))
435+
.isInstanceOf(IllegalArgumentException.class)
436+
.hasMessageContaining("Can not get row from Array of type");
437+
}
438+
439+
@Test
440+
public void testCompactedArrayGetRowWithWrongNumFields() {
441+
DataType rowType =
442+
DataTypes.ROW(
443+
DataTypes.FIELD("f1", DataTypes.INT()),
444+
DataTypes.FIELD("f2", DataTypes.STRING()));
445+
DataType arrayType = DataTypes.ARRAY(rowType);
446+
DataType[] fieldTypes = {arrayType};
447+
448+
CompactedRow outerRow = new CompactedRow(fieldTypes);
449+
CompactedRowWriter outerWriter = new CompactedRowWriter(fieldTypes.length);
450+
451+
org.apache.fluss.row.GenericRow innerRow =
452+
org.apache.fluss.row.GenericRow.of(100, BinaryString.fromString("test"));
453+
org.apache.fluss.row.GenericArray arrayData =
454+
org.apache.fluss.row.GenericArray.of(innerRow);
455+
456+
org.apache.fluss.row.serializer.ArraySerializer serializer =
457+
new org.apache.fluss.row.serializer.ArraySerializer(
458+
rowType, org.apache.fluss.row.BinaryRow.BinaryRowFormat.COMPACTED);
459+
outerWriter.writeArray(arrayData, serializer);
460+
461+
outerRow.pointTo(outerWriter.segment(), 0, outerWriter.position());
462+
463+
org.apache.fluss.row.InternalArray array = outerRow.getArray(0);
464+
assertThatThrownBy(() -> array.getRow(0, 5))
465+
.isInstanceOf(IllegalArgumentException.class)
466+
.hasMessageContaining("Unexpected number of fields");
467+
}
468+
469+
@Test
470+
public void testCompactedArrayGetNestedArray() {
471+
DataType innerArrayType = DataTypes.ARRAY(DataTypes.INT());
472+
DataType outerArrayType = DataTypes.ARRAY(innerArrayType);
473+
DataType[] fieldTypes = {outerArrayType};
474+
475+
CompactedRow outerRow = new CompactedRow(fieldTypes);
476+
CompactedRowWriter outerWriter = new CompactedRowWriter(fieldTypes.length);
477+
478+
org.apache.fluss.row.GenericArray innerArray1 =
479+
org.apache.fluss.row.GenericArray.of(10, 20, 30);
480+
org.apache.fluss.row.GenericArray innerArray2 =
481+
org.apache.fluss.row.GenericArray.of(40, 50, 60);
482+
org.apache.fluss.row.GenericArray outerArrayData =
483+
org.apache.fluss.row.GenericArray.of(innerArray1, innerArray2);
484+
485+
org.apache.fluss.row.serializer.ArraySerializer serializer =
486+
new org.apache.fluss.row.serializer.ArraySerializer(
487+
innerArrayType, org.apache.fluss.row.BinaryRow.BinaryRowFormat.COMPACTED);
488+
outerWriter.writeArray(outerArrayData, serializer);
489+
490+
outerRow.pointTo(outerWriter.segment(), 0, outerWriter.position());
491+
492+
org.apache.fluss.row.InternalArray outerArray = outerRow.getArray(0);
493+
assertThat(outerArray).isNotNull();
494+
assertThat(outerArray.size()).isEqualTo(2);
495+
496+
org.apache.fluss.row.InternalArray nestedArray1 = outerArray.getArray(0);
497+
assertThat(nestedArray1).isNotNull();
498+
assertThat(nestedArray1.size()).isEqualTo(3);
499+
assertThat(nestedArray1.getInt(0)).isEqualTo(10);
500+
assertThat(nestedArray1.getInt(1)).isEqualTo(20);
501+
assertThat(nestedArray1.getInt(2)).isEqualTo(30);
502+
503+
org.apache.fluss.row.InternalArray nestedArray2 = outerArray.getArray(1);
504+
assertThat(nestedArray2).isNotNull();
505+
assertThat(nestedArray2.size()).isEqualTo(3);
506+
assertThat(nestedArray2.getInt(0)).isEqualTo(40);
507+
assertThat(nestedArray2.getInt(1)).isEqualTo(50);
508+
assertThat(nestedArray2.getInt(2)).isEqualTo(60);
509+
}
415510
}

0 commit comments

Comments
 (0)