/** * Marks all values since the last set as empty. The last set value is obtained from underlying * offsets vector. * * @param lastIndex the last index (inclusive) in the offsets vector until which empty population * takes place * @throws java.lang.IndexOutOfBoundsException if lastIndex is negative or greater than offsets * capacity. */ public void populate(int lastIndex) { if (lastIndex < 0) { throw new IndexOutOfBoundsException("index cannot be negative"); } final UInt4Vector.Accessor accessor = offsets.getAccessor(); final UInt4Vector.Mutator mutator = offsets.getMutator(); final int lastSet = Math.max(accessor.getValueCount() - 1, 0); final int previousEnd = accessor.get(lastSet); // 0 ? 0 : accessor.get(lastSet); for (int i = lastSet; i < lastIndex; i++) { mutator.setSafe(i + 1, previousEnd); } mutator.setValueCount(lastIndex + 1); }
@Test public void testFixedType() { // Build a required uint field definition MajorType.Builder typeBuilder = MajorType.newBuilder(); FieldDef.Builder defBuilder = FieldDef.newBuilder(); typeBuilder.setMinorType(MinorType.UINT4).setMode(DataMode.REQUIRED).setWidth(4); defBuilder.setMajorType(typeBuilder.build()); MaterializedField field = MaterializedField.create(defBuilder.build()); // Create a new value vector for 1024 integers UInt4Vector v = new UInt4Vector(field, allocator); UInt4Vector.Mutator m = v.getMutator(); v.allocateNew(1024); // Put and set a few values m.set(0, 100); m.set(1, 101); m.set(100, 102); m.set(1022, 103); m.set(1023, 104); assertEquals(100, v.getAccessor().get(0)); assertEquals(101, v.getAccessor().get(1)); assertEquals(102, v.getAccessor().get(100)); assertEquals(103, v.getAccessor().get(1022)); assertEquals(104, v.getAccessor().get(1023)); // Ensure unallocated space returns 0 assertEquals(0, v.getAccessor().get(3)); }
@Test public void testFixedType() { final MaterializedField field = MaterializedField.create(EMPTY_SCHEMA_PATH, UInt4Holder.TYPE); // Create a new value vector for 1024 integers. try (final UInt4Vector vector = new UInt4Vector(field, allocator)) { final UInt4Vector.Mutator m = vector.getMutator(); vector.allocateNew(1024); // Put and set a few values m.setSafe(0, 100); m.setSafe(1, 101); m.setSafe(100, 102); m.setSafe(1022, 103); m.setSafe(1023, 104); final UInt4Vector.Accessor accessor = vector.getAccessor(); assertEquals(100, accessor.get(0)); assertEquals(101, accessor.get(1)); assertEquals(102, accessor.get(100)); assertEquals(103, accessor.get(1022)); assertEquals(104, accessor.get(1023)); } }
@Test(expected = OversizedAllocationException.class) public void testFixedVectorReallocation() { final MaterializedField field = MaterializedField.create(EMPTY_SCHEMA_PATH, UInt4Holder.TYPE); final UInt4Vector vector = new UInt4Vector(field, allocator); // edge case 1: buffer size = max value capacity final int expectedValueCapacity = BaseValueVector.MAX_ALLOCATION_SIZE / 4; try { vector.allocateNew(expectedValueCapacity); assertEquals(expectedValueCapacity, vector.getValueCapacity()); vector.reAlloc(); assertEquals(expectedValueCapacity * 2, vector.getValueCapacity()); } finally { vector.close(); } // common case: value count < max value capacity try { vector.allocateNew(BaseValueVector.MAX_ALLOCATION_SIZE / 8); vector.reAlloc(); // value allocation reaches to MAX_VALUE_ALLOCATION vector.reAlloc(); // this should throw an IOOB } finally { vector.close(); } }