@Test public void testReAllocNullableVariableWidthVector() { final MaterializedField field = MaterializedField.create(EMPTY_SCHEMA_PATH, NullableVarCharHolder.TYPE); // Create a new value vector for 1024 integers try (final NullableVarCharVector vector = (NullableVarCharVector) TypeHelper.getNewVector(field, allocator)) { final NullableVarCharVector.Mutator m = vector.getMutator(); vector.allocateNew(); int initialCapacity = vector.getValueCapacity(); // Put values in indexes that fall within the initial allocation m.setSafe(0, STR1, 0, STR1.length); m.setSafe(initialCapacity - 1, STR2, 0, STR2.length); // Now try to put values in space that falls beyond the initial allocation m.setSafe(initialCapacity + 200, STR3, 0, STR3.length); // Check valueCapacity is more than initial allocation assertEquals((initialCapacity + 1) * 2 - 1, vector.getValueCapacity()); final NullableVarCharVector.Accessor accessor = vector.getAccessor(); assertArrayEquals(STR1, accessor.get(0)); assertArrayEquals(STR2, accessor.get(initialCapacity - 1)); assertArrayEquals(STR3, accessor.get(initialCapacity + 200)); // Set the valueCount to be more than valueCapacity of current allocation. This is possible // for NullableValueVectors // as we don't call setSafe for null values, but we do call setValueCount when the current // batch is processed. m.setValueCount(vector.getValueCapacity() + 200); } }
@Test public void testNullableVarCharVectorLoad() { final MaterializedField field = MaterializedField.create(EMPTY_SCHEMA_PATH, NullableVarCharHolder.TYPE); // Create a new value vector for 1024 nullable variable length strings. final NullableVarCharVector vector1 = new NullableVarCharVector(field, allocator); final NullableVarCharVector.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.set(i, stringBuilder.toString().getBytes(utf8Charset)); } // Check the contents. final NullableVarCharVector.Accessor accessor1 = vector1.getAccessor(); stringBuilder.setLength(0); for (int i = 0; i < valueCount; ++i) { stringBuilder.append('x'); final Object object = accessor1.getObject(i); assertEquals(stringBuilder.toString(), object.toString()); } mutator.setValueCount(valueCount); assertEquals(valueCount, vector1.getAccessor().getValueCount()); // Still ok after setting value count? stringBuilder.setLength(0); for (int i = 0; i < valueCount; ++i) { stringBuilder.append('x'); final Object object = accessor1.getObject(i); assertEquals(stringBuilder.toString(), object.toString()); } // Combine into a single buffer so we can load it into a new vector. final DrillBuf[] buffers1 = vector1.getBuffers(false); final DrillBuf buffer1 = combineBuffers(allocator, buffers1); final NullableVarCharVector vector2 = new NullableVarCharVector(field, allocator); vector2.load(vector1.getMetadata(), buffer1); // Check the vector's contents. final NullableVarCharVector.Accessor accessor2 = vector2.getAccessor(); stringBuilder.setLength(0); for (int i = 0; i < valueCount; ++i) { stringBuilder.append('x'); final Object object = accessor2.getObject(i); assertEquals(stringBuilder.toString(), object.toString()); } vector1.close(); vector2.close(); buffer1.release(); }