]> git.proxmox.com Git - ceph.git/blame - ceph/src/arrow/java/vector/src/test/java/org/apache/arrow/vector/TestFixedSizeListVector.java
import quincy 17.2.0
[ceph.git] / ceph / src / arrow / java / vector / src / test / java / org / apache / arrow / vector / TestFixedSizeListVector.java
CommitLineData
1d09f67e
TL
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package org.apache.arrow.vector;
19
20import static org.junit.Assert.assertArrayEquals;
21import static org.junit.Assert.assertEquals;
22import static org.junit.Assert.assertTrue;
23import static org.junit.jupiter.api.Assertions.assertNull;
24import static org.junit.jupiter.api.Assertions.assertThrows;
25
26import java.math.BigDecimal;
27import java.util.Arrays;
28import java.util.List;
29
30import org.apache.arrow.memory.BufferAllocator;
31import org.apache.arrow.vector.complex.FixedSizeListVector;
32import org.apache.arrow.vector.complex.ListVector;
33import org.apache.arrow.vector.complex.impl.UnionFixedSizeListReader;
34import org.apache.arrow.vector.complex.impl.UnionFixedSizeListWriter;
35import org.apache.arrow.vector.complex.impl.UnionListReader;
36import org.apache.arrow.vector.complex.reader.FieldReader;
37import org.apache.arrow.vector.types.Types.MinorType;
38import org.apache.arrow.vector.types.pojo.ArrowType;
39import org.apache.arrow.vector.types.pojo.FieldType;
40import org.apache.arrow.vector.util.TransferPair;
41import org.junit.After;
42import org.junit.Assert;
43import org.junit.Before;
44import org.junit.Test;
45
46public class TestFixedSizeListVector {
47
48 private BufferAllocator allocator;
49
50 @Before
51 public void init() {
52 allocator = new DirtyRootAllocator(Long.MAX_VALUE, (byte) 100);
53 }
54
55 @After
56 public void terminate() throws Exception {
57 allocator.close();
58 }
59
60 @Test
61 public void testIntType() {
62 try (FixedSizeListVector vector = FixedSizeListVector.empty("list", 2, allocator)) {
63 IntVector nested = (IntVector) vector.addOrGetVector(FieldType.nullable(MinorType.INT.getType())).getVector();
64 vector.allocateNew();
65
66 for (int i = 0; i < 10; i++) {
67 vector.setNotNull(i);
68 nested.set(i * 2, i);
69 nested.set(i * 2 + 1, i + 10);
70 }
71 vector.setValueCount(10);
72
73 UnionFixedSizeListReader reader = vector.getReader();
74 for (int i = 0; i < 10; i++) {
75 reader.setPosition(i);
76 Assert.assertTrue(reader.isSet());
77 Assert.assertTrue(reader.next());
78 assertEquals(i, reader.reader().readInteger().intValue());
79 Assert.assertTrue(reader.next());
80 assertEquals(i + 10, reader.reader().readInteger().intValue());
81 Assert.assertFalse(reader.next());
82 assertEquals(Arrays.asList(i, i + 10), reader.readObject());
83 }
84 }
85 }
86
87 @Test
88 public void testFloatTypeNullable() {
89 try (FixedSizeListVector vector = FixedSizeListVector.empty("list", 2, allocator)) {
90 Float4Vector nested = (Float4Vector) vector.addOrGetVector(FieldType.nullable(MinorType.FLOAT4.getType()))
91 .getVector();
92 vector.allocateNew();
93
94 for (int i = 0; i < 10; i++) {
95 if (i % 2 == 0) {
96 vector.setNotNull(i);
97 nested.set(i * 2, i + 0.1f);
98 nested.set(i * 2 + 1, i + 10.1f);
99 }
100 }
101 vector.setValueCount(10);
102
103 UnionFixedSizeListReader reader = vector.getReader();
104 for (int i = 0; i < 10; i++) {
105 reader.setPosition(i);
106 if (i % 2 == 0) {
107 Assert.assertTrue(reader.isSet());
108 Assert.assertTrue(reader.next());
109 assertEquals(i + 0.1f, reader.reader().readFloat(), 0.00001);
110 Assert.assertTrue(reader.next());
111 assertEquals(i + 10.1f, reader.reader().readFloat(), 0.00001);
112 Assert.assertFalse(reader.next());
113 assertEquals(Arrays.asList(i + 0.1f, i + 10.1f), reader.readObject());
114 } else {
115 Assert.assertFalse(reader.isSet());
116 Assert.assertNull(reader.readObject());
117 }
118 }
119 }
120 }
121
122 @Test
123 public void testNestedInList() {
124 try (ListVector vector = ListVector.empty("list", allocator)) {
125 FixedSizeListVector tuples = (FixedSizeListVector) vector.addOrGetVector(
126 FieldType.nullable(new ArrowType.FixedSizeList(2))).getVector();
127 IntVector innerVector = (IntVector) tuples.addOrGetVector(FieldType.nullable(MinorType.INT.getType()))
128 .getVector();
129 vector.allocateNew();
130
131 for (int i = 0; i < 10; i++) {
132 if (i % 2 == 0) {
133 int position = vector.startNewValue(i);
134 for (int j = 0; j < i % 7; j++) {
135 tuples.setNotNull(position + j);
136 innerVector.set((position + j) * 2, j);
137 innerVector.set((position + j) * 2 + 1, j + 1);
138 }
139 vector.endValue(i, i % 7);
140 }
141 }
142 vector.setValueCount(10);
143
144 UnionListReader reader = vector.getReader();
145 for (int i = 0; i < 10; i++) {
146 reader.setPosition(i);
147 if (i % 2 == 0) {
148 for (int j = 0; j < i % 7; j++) {
149 Assert.assertTrue(reader.next());
150 FieldReader innerListReader = reader.reader();
151 for (int k = 0; k < 2; k++) {
152 Assert.assertTrue(innerListReader.next());
153 assertEquals(k + j, innerListReader.reader().readInteger().intValue());
154 }
155 Assert.assertFalse(innerListReader.next());
156 }
157 Assert.assertFalse(reader.next());
158 } else {
159 Assert.assertFalse(reader.isSet());
160 Assert.assertNull(reader.readObject());
161 }
162 }
163 }
164 }
165
166 @Test
167 public void testTransferPair() {
168 try (FixedSizeListVector from = new FixedSizeListVector(
169 "from", allocator, new FieldType(true, new ArrowType.FixedSizeList(2), null), null);
170 FixedSizeListVector to = new FixedSizeListVector(
171 "to", allocator, new FieldType(true, new ArrowType.FixedSizeList(2), null), null)) {
172 Float4Vector nested = (Float4Vector) from.addOrGetVector(FieldType.nullable(MinorType.FLOAT4.getType()))
173 .getVector();
174 from.allocateNew();
175
176 for (int i = 0; i < 10; i++) {
177 if (i % 2 == 0) {
178 from.setNotNull(i);
179 nested.set(i * 2, i + 0.1f);
180 nested.set(i * 2 + 1, i + 10.1f);
181 }
182 }
183 from.setValueCount(10);
184
185 TransferPair pair = from.makeTransferPair(to);
186
187 pair.copyValueSafe(0, 1);
188 pair.copyValueSafe(2, 2);
189 to.copyFromSafe(4, 3, from);
190
191 to.setValueCount(10);
192
193 UnionFixedSizeListReader reader = to.getReader();
194
195 reader.setPosition(0);
196 Assert.assertFalse(reader.isSet());
197 Assert.assertNull(reader.readObject());
198
199 reader.setPosition(1);
200 Assert.assertTrue(reader.isSet());
201 Assert.assertTrue(reader.next());
202 assertEquals(0.1f, reader.reader().readFloat(), 0.00001);
203 Assert.assertTrue(reader.next());
204 assertEquals(10.1f, reader.reader().readFloat(), 0.00001);
205 Assert.assertFalse(reader.next());
206 assertEquals(Arrays.asList(0.1f, 10.1f), reader.readObject());
207
208 reader.setPosition(2);
209 Assert.assertTrue(reader.isSet());
210 Assert.assertTrue(reader.next());
211 assertEquals(2.1f, reader.reader().readFloat(), 0.00001);
212 Assert.assertTrue(reader.next());
213 assertEquals(12.1f, reader.reader().readFloat(), 0.00001);
214 Assert.assertFalse(reader.next());
215 assertEquals(Arrays.asList(2.1f, 12.1f), reader.readObject());
216
217 reader.setPosition(3);
218 Assert.assertTrue(reader.isSet());
219 Assert.assertTrue(reader.next());
220 assertEquals(4.1f, reader.reader().readFloat(), 0.00001);
221 Assert.assertTrue(reader.next());
222 assertEquals(14.1f, reader.reader().readFloat(), 0.00001);
223 Assert.assertFalse(reader.next());
224 assertEquals(Arrays.asList(4.1f, 14.1f), reader.readObject());
225
226 for (int i = 4; i < 10; i++) {
227 reader.setPosition(i);
228 Assert.assertFalse(reader.isSet());
229 Assert.assertNull(reader.readObject());
230 }
231 }
232 }
233
234 @Test
235 public void testConsistentChildName() throws Exception {
236 try (FixedSizeListVector listVector = FixedSizeListVector.empty("sourceVector", 2, allocator)) {
237 String emptyListStr = listVector.getField().toString();
238 Assert.assertTrue(emptyListStr.contains(ListVector.DATA_VECTOR_NAME));
239
240 listVector.addOrGetVector(FieldType.nullable(MinorType.INT.getType()));
241 String emptyVectorStr = listVector.getField().toString();
242 Assert.assertTrue(emptyVectorStr.contains(ListVector.DATA_VECTOR_NAME));
243 }
244 }
245
246 @Test
247 public void testUnionFixedSizeListWriterWithNulls() throws Exception {
248 /* Write to a decimal list vector
249 * each list of size 3 and having its data values alternating between null and a non-null.
250 * Read and verify
251 */
252 try (final FixedSizeListVector vector = FixedSizeListVector.empty("vector", /*listSize=*/3, allocator)) {
253
254 UnionFixedSizeListWriter writer = vector.getWriter();
255 writer.allocate();
256
257 final int valueCount = 100;
258
259 for (int i = 0; i < valueCount; i++) {
260 writer.startList();
261 writer.decimal().writeDecimal(new BigDecimal(i));
262 writer.writeNull();
263 writer.decimal().writeDecimal(new BigDecimal(i * 3));
264 writer.endList();
265 }
266 vector.setValueCount(valueCount);
267
268 for (int i = 0; i < valueCount; i++) {
269 List<BigDecimal> values = (List<BigDecimal>) vector.getObject(i);
270 assertEquals(3, values.size());
271 assertEquals(new BigDecimal(i), values.get(0));
272 assertEquals(null, values.get(1));
273 assertEquals(new BigDecimal(i * 3), values.get(2));
274 }
275 }
276 }
277
278 @Test
279 public void testUnionFixedSizeListWriter() throws Exception {
280 try (final FixedSizeListVector vector1 = FixedSizeListVector.empty("vector", 3, allocator)) {
281
282 UnionFixedSizeListWriter writer1 = vector1.getWriter();
283 writer1.allocate();
284
285 int[] values1 = new int[] {1, 2, 3};
286 int[] values2 = new int[] {4, 5, 6};
287 int[] values3 = new int[] {7, 8, 9};
288
289 //set some values
290 writeListVector(vector1, writer1, values1);
291 writeListVector(vector1, writer1, values2);
292 writeListVector(vector1, writer1, values3);
293 writer1.setValueCount(3);
294
295 assertEquals(3, vector1.getValueCount());
296
297 int[] realValue1 = convertListToIntArray(vector1.getObject(0));
298 assertTrue(Arrays.equals(values1, realValue1));
299 int[] realValue2 = convertListToIntArray(vector1.getObject(1));
300 assertTrue(Arrays.equals(values2, realValue2));
301 int[] realValue3 = convertListToIntArray(vector1.getObject(2));
302 assertTrue(Arrays.equals(values3, realValue3));
303 }
304 }
305
306 @Test
307 public void testWriteDecimal() throws Exception {
308 try (final FixedSizeListVector vector = FixedSizeListVector.empty("vector", /*listSize=*/3, allocator)) {
309
310 UnionFixedSizeListWriter writer = vector.getWriter();
311 writer.allocate();
312
313 final int valueCount = 100;
314
315 for (int i = 0; i < valueCount; i++) {
316 writer.startList();
317 writer.decimal().writeDecimal(new BigDecimal(i));
318 writer.decimal().writeDecimal(new BigDecimal(i * 2));
319 writer.decimal().writeDecimal(new BigDecimal(i * 3));
320 writer.endList();
321 }
322 vector.setValueCount(valueCount);
323
324 for (int i = 0; i < valueCount; i++) {
325 List<BigDecimal> values = (List<BigDecimal>) vector.getObject(i);
326 assertEquals(3, values.size());
327 assertEquals(new BigDecimal(i), values.get(0));
328 assertEquals(new BigDecimal(i * 2), values.get(1));
329 assertEquals(new BigDecimal(i * 3), values.get(2));
330 }
331 }
332 }
333
334 @Test
335 public void testDecimalIndexCheck() throws Exception {
336 try (final FixedSizeListVector vector = FixedSizeListVector.empty("vector", /*listSize=*/3, allocator)) {
337
338 UnionFixedSizeListWriter writer = vector.getWriter();
339 writer.allocate();
340
341 IllegalStateException e = assertThrows(IllegalStateException.class, () -> {
342 writer.startList();
343 writer.decimal().writeDecimal(new BigDecimal(1));
344 writer.decimal().writeDecimal(new BigDecimal(2));
345 writer.decimal().writeDecimal(new BigDecimal(3));
346 writer.decimal().writeDecimal(new BigDecimal(4));
347 writer.endList();
348 });
349 assertEquals("values at index 0 is greater than listSize 3", e.getMessage());
350 }
351 }
352
353
354 @Test(expected = IllegalStateException.class)
355 public void testWriteIllegalData() throws Exception {
356 try (final FixedSizeListVector vector1 = FixedSizeListVector.empty("vector", 3, allocator)) {
357
358 UnionFixedSizeListWriter writer1 = vector1.getWriter();
359 writer1.allocate();
360
361 int[] values1 = new int[] {1, 2, 3};
362 int[] values2 = new int[] {4, 5, 6, 7, 8};
363
364 //set some values
365 writeListVector(vector1, writer1, values1);
366 writeListVector(vector1, writer1, values2);
367 writer1.setValueCount(3);
368
369 assertEquals(3, vector1.getValueCount());
370 int[] realValue1 = convertListToIntArray(vector1.getObject(0));
371 assertTrue(Arrays.equals(values1, realValue1));
372 int[] realValue2 = convertListToIntArray(vector1.getObject(1));
373 assertTrue(Arrays.equals(values2, realValue2));
374 }
375 }
376
377 @Test
378 public void testSplitAndTransfer() throws Exception {
379 try (final FixedSizeListVector vector1 = FixedSizeListVector.empty("vector", 3, allocator)) {
380
381 UnionFixedSizeListWriter writer1 = vector1.getWriter();
382 writer1.allocate();
383
384 int[] values1 = new int[] {1, 2, 3};
385 int[] values2 = new int[] {4, 5, 6};
386 int[] values3 = new int[] {7, 8, 9};
387
388 //set some values
389 writeListVector(vector1, writer1, values1);
390 writeListVector(vector1, writer1, values2);
391 writeListVector(vector1, writer1, values3);
392 writer1.setValueCount(3);
393
394 TransferPair transferPair = vector1.getTransferPair(allocator);
395 transferPair.splitAndTransfer(0, 2);
396 FixedSizeListVector targetVector = (FixedSizeListVector) transferPair.getTo();
397
398 assertEquals(2, targetVector.getValueCount());
399 int[] realValue1 = convertListToIntArray(targetVector.getObject(0));
400 assertTrue(Arrays.equals(values1, realValue1));
401 int[] realValue2 = convertListToIntArray(targetVector.getObject(1));
402 assertTrue(Arrays.equals(values2, realValue2));
403
404 targetVector.clear();
405 }
406 }
407
408 @Test
409 public void testZeroWidthVector() {
410 try (final FixedSizeListVector vector1 = FixedSizeListVector.empty("vector", 0, allocator)) {
411
412 UnionFixedSizeListWriter writer1 = vector1.getWriter();
413 writer1.allocate();
414
415 int[] values1 = new int[] {};
416 int[] values2 = new int[] {};
417 int[] values3 = null;
418 int[] values4 = new int[] {};
419
420 //set some values
421 writeListVector(vector1, writer1, values1);
422 writeListVector(vector1, writer1, values2);
423 writeListVector(vector1, writer1, values3);
424 writeListVector(vector1, writer1, values4);
425 writer1.setValueCount(4);
426
427 assertEquals(4, vector1.getValueCount());
428
429 int[] realValue1 = convertListToIntArray(vector1.getObject(0));
430 assertArrayEquals(values1, realValue1);
431 int[] realValue2 = convertListToIntArray(vector1.getObject(1));
432 assertArrayEquals(values2, realValue2);
433 assertNull(vector1.getObject(2));
434 int[] realValue4 = convertListToIntArray(vector1.getObject(3));
435 assertArrayEquals(values4, realValue4);
436 }
437 }
438
439 @Test
440 public void testVectorWithNulls() {
441 try (final FixedSizeListVector vector1 = FixedSizeListVector.empty("vector", 4, allocator)) {
442
443 UnionFixedSizeListWriter writer1 = vector1.getWriter();
444 writer1.allocate();
445
446 List<Integer> values1 = Arrays.asList(null, 1, 2, 3);
447 List<Integer> values2 = Arrays.asList(4, null, 5, 6);
448 List<Integer> values3 = null;
449 List<Integer> values4 = Arrays.asList(7, 8, null, 9);
450
451 //set some values
452 writeListVector(vector1, writer1, values1);
453 writeListVector(vector1, writer1, values2);
454 writeListVector(vector1, writer1, values3);
455 writeListVector(vector1, writer1, values4);
456 writer1.setValueCount(4);
457
458 assertEquals(4, vector1.getValueCount());
459
460 List realValue1 = vector1.getObject(0);
461 assertEquals(values1, realValue1);
462 List realValue2 = vector1.getObject(1);
463 assertEquals(values2, realValue2);
464 List realValue3 = vector1.getObject(2);
465 assertEquals(values3, realValue3);
466 List realValue4 = vector1.getObject(3);
467 assertEquals(values4, realValue4);
468 }
469 }
470
471 private int[] convertListToIntArray(List list) {
472 int[] values = new int[list.size()];
473 for (int i = 0; i < list.size(); i++) {
474 values[i] = (int) list.get(i);
475 }
476 return values;
477 }
478
479 private void writeListVector(FixedSizeListVector vector, UnionFixedSizeListWriter writer, int[] values) {
480 writer.startList();
481 if (values != null) {
482 for (int v : values) {
483 writer.integer().writeInt(v);
484 }
485 } else {
486 vector.setNull(writer.getPosition());
487 }
488 writer.endList();
489 }
490
491 private void writeListVector(FixedSizeListVector vector, UnionFixedSizeListWriter writer, List<Integer> values) {
492 writer.startList();
493 if (values != null) {
494 for (Integer v : values) {
495 if (v == null) {
496 writer.writeNull();
497 } else {
498 writer.integer().writeInt(v);
499 }
500 }
501 } else {
502 vector.setNull(writer.getPosition());
503 }
504 writer.endList();
505 }
506
507}