@Test public void testVarCharVectorLoad() { final MaterializedField field = MaterializedField.create(EMPTY_SCHEMA_PATH, VarCharHolder.TYPE); // Create a new value vector for 1024 variable length strings. final VarCharVector vector1 = new VarCharVector(field, allocator); final VarCharVector.Mutator mutator = vector1.getMutator(); vector1.allocateNew(1024 * 10, 1024); // Populate the vector. final StringBuilder stringBuilder = new StringBuilder(); final int valueCount = 10; for (int i = 0; i < valueCount; ++i) { stringBuilder.append('x'); mutator.setSafe(i, stringBuilder.toString().getBytes(utf8Charset)); } mutator.setValueCount(valueCount); assertEquals(valueCount, vector1.getAccessor().getValueCount()); // Combine the backing buffers so we can load them into a new vector. final DrillBuf[] buffers1 = vector1.getBuffers(false); final DrillBuf buffer1 = combineBuffers(allocator, buffers1); final VarCharVector vector2 = new VarCharVector(field, allocator); vector2.load(vector1.getMetadata(), buffer1); // Check the contents of the new vector. final VarCharVector.Accessor accessor = vector2.getAccessor(); stringBuilder.setLength(0); for (int i = 0; i < valueCount; ++i) { stringBuilder.append('x'); final Object object = accessor.getObject(i); assertEquals(stringBuilder.toString(), object.toString()); } vector1.close(); vector2.close(); buffer1.release(); }
@Test(expected = OversizedAllocationException.class) public void testVariableVectorReallocation() { final MaterializedField field = MaterializedField.create(EMPTY_SCHEMA_PATH, UInt4Holder.TYPE); final VarCharVector vector = new VarCharVector(field, allocator); // edge case 1: value count = MAX_VALUE_ALLOCATION final int expectedAllocationInBytes = BaseValueVector.MAX_ALLOCATION_SIZE; final int expectedOffsetSize = 10; try { vector.allocateNew(expectedAllocationInBytes, 10); assertEquals(expectedOffsetSize, vector.getValueCapacity()); assertEquals(expectedAllocationInBytes, vector.getBuffer().capacity()); vector.reAlloc(); assertEquals(expectedOffsetSize * 2, vector.getValueCapacity()); assertEquals(expectedAllocationInBytes * 2, vector.getBuffer().capacity()); } finally { vector.close(); } // common: value count < MAX_VALUE_ALLOCATION try { vector.allocateNew(BaseValueVector.MAX_ALLOCATION_SIZE / 2, 0); vector.reAlloc(); // value allocation reaches to MAX_VALUE_ALLOCATION vector.reAlloc(); // this tests if it overflows } finally { vector.close(); } }