use of org.apache.drill.test.rowSet.RowSet.SingleRowSet in project drill by axbaretto.
the class TestResultSetLoaderProjection method testMapArrayProjection.
/**
* Test a map array. Use the convenience methods to set values.
* Only the projected array members should appear in the harvested
* results.
*/
@Test
public void testMapArrayProjection() {
List<SchemaPath> selection = Lists.newArrayList(SchemaPath.getSimplePath("m1"), SchemaPath.getCompoundPath("m2", "d"));
TupleMetadata schema = new SchemaBuilder().addMapArray("m1").add("a", MinorType.INT).add("b", MinorType.INT).resumeSchema().addMapArray("m2").add("c", MinorType.INT).add("d", MinorType.INT).resumeSchema().addMapArray("m3").add("e", MinorType.INT).add("f", MinorType.INT).resumeSchema().buildSchema();
ResultSetOptions options = new OptionBuilder().setProjection(selection).setSchema(schema).build();
ResultSetLoader rsLoader = new ResultSetLoaderImpl(fixture.allocator(), options);
RowSetLoader rootWriter = rsLoader.writer();
// Write a couple of rows.
rsLoader.startBatch();
rootWriter.addRow(objArray(objArray(10, 20), objArray(11, 21)), objArray(objArray(30, 40), objArray(31, 42)), objArray(objArray(50, 60), objArray(51, 62)));
rootWriter.addRow(objArray(objArray(110, 120), objArray(111, 121)), objArray(objArray(130, 140), objArray(131, 142)), objArray(objArray(150, 160), objArray(151, 162)));
// Verify. Only the projected columns appear in the result set.
BatchSchema expectedSchema = new SchemaBuilder().addMapArray("m1").add("a", MinorType.INT).add("b", MinorType.INT).resumeSchema().addMapArray("m2").add("d", MinorType.INT).resumeSchema().build();
SingleRowSet expected = fixture.rowSetBuilder(expectedSchema).addRow(objArray(objArray(10, 20), objArray(11, 21)), objArray(objArray(40), objArray(42))).addRow(objArray(objArray(110, 120), objArray(111, 121)), objArray(objArray(140), objArray(142))).build();
new RowSetComparison(expected).verifyAndClearAll(fixture.wrap(rsLoader.harvest()));
rsLoader.close();
}
use of org.apache.drill.test.rowSet.RowSet.SingleRowSet in project drill by axbaretto.
the class TestResultSetLoaderProjection method doProjectionTest.
private void doProjectionTest(ResultSetLoader rsLoader) {
RowSetLoader rootWriter = rsLoader.writer();
// All columns appear, including non-projected ones.
TupleMetadata actualSchema = rootWriter.schema();
assertEquals(4, actualSchema.size());
assertEquals("a", actualSchema.column(0).getName());
assertEquals("b", actualSchema.column(1).getName());
assertEquals("c", actualSchema.column(2).getName());
assertEquals("d", actualSchema.column(3).getName());
assertEquals(0, actualSchema.index("A"));
assertEquals(3, actualSchema.index("d"));
assertEquals(-1, actualSchema.index("e"));
// Non-projected columns identify themselves via metadata
assertFalse(actualSchema.metadata("a").isProjected());
assertTrue(actualSchema.metadata("b").isProjected());
assertTrue(actualSchema.metadata("c").isProjected());
assertFalse(actualSchema.metadata("d").isProjected());
// Write some data. Doesn't need much.
rsLoader.startBatch();
for (int i = 1; i < 3; i++) {
rootWriter.start();
rootWriter.scalar(0).setInt(i * 5);
rootWriter.scalar(1).setInt(i);
rootWriter.scalar(2).setInt(i * 10);
rootWriter.scalar(3).setInt(i * 20);
rootWriter.save();
}
// Verify. Result should only have the projected
// columns, only if defined by the loader, in the order
// of definition.
BatchSchema expectedSchema = new SchemaBuilder().add("b", MinorType.INT).add("c", MinorType.INT).build();
SingleRowSet expected = fixture.rowSetBuilder(expectedSchema).addRow(1, 10).addRow(2, 20).build();
RowSet actual = fixture.wrap(rsLoader.harvest());
// actual.print();
new RowSetComparison(expected).verifyAndClearAll(actual);
rsLoader.close();
}
use of org.apache.drill.test.rowSet.RowSet.SingleRowSet in project drill by axbaretto.
the class TestResultSetLoaderProtocol method testBasics.
@Test
public void testBasics() {
ResultSetLoaderImpl rsLoaderImpl = new ResultSetLoaderImpl(fixture.allocator());
ResultSetLoader rsLoader = rsLoaderImpl;
assertEquals(0, rsLoader.schemaVersion());
assertEquals(ResultSetLoader.DEFAULT_ROW_COUNT, rsLoader.targetRowCount());
assertEquals(ValueVector.MAX_BUFFER_SIZE, rsLoader.targetVectorSize());
assertEquals(0, rsLoader.writer().rowCount());
assertEquals(0, rsLoader.batchCount());
assertEquals(0, rsLoader.totalRowCount());
try {
rsLoader.harvest();
fail();
} catch (IllegalStateException e) {
// Expected
}
// Can define schema before starting the first batch.
RowSetLoader rootWriter = rsLoader.writer();
TupleMetadata schema = rootWriter.schema();
assertEquals(0, schema.size());
MaterializedField fieldA = SchemaBuilder.columnSchema("a", MinorType.INT, DataMode.REQUIRED);
rootWriter.addColumn(fieldA);
assertEquals(1, schema.size());
assertTrue(fieldA.isEquivalent(schema.column(0)));
assertSame(schema.metadata(0), schema.metadata("a"));
try {
rootWriter.start();
fail();
} catch (IllegalStateException e) {
// Expected
}
try {
rootWriter.save();
fail();
} catch (IllegalStateException e) {
// Expected
}
// Because writing is an inner loop; no checks are
// done to ensure that writing occurs only in the proper
// state. So, can't test setInt() in the wrong state.
rsLoader.startBatch();
try {
rsLoader.startBatch();
fail();
} catch (IllegalStateException e) {
// Expected
}
assertFalse(rootWriter.isFull());
rootWriter.start();
rootWriter.scalar(0).setInt(100);
assertEquals(0, rootWriter.rowCount());
assertEquals(0, rsLoader.batchCount());
rootWriter.save();
assertEquals(1, rootWriter.rowCount());
assertEquals(1, rsLoader.batchCount());
assertEquals(1, rsLoader.totalRowCount());
// Can add a field after first row, prior rows are
// "back-filled".
MaterializedField fieldB = SchemaBuilder.columnSchema("b", MinorType.INT, DataMode.OPTIONAL);
rootWriter.addColumn(fieldB);
assertEquals(2, schema.size());
assertTrue(fieldB.isEquivalent(schema.column(1)));
assertSame(schema.metadata(1), schema.metadata("b"));
rootWriter.start();
rootWriter.scalar(0).setInt(200);
rootWriter.scalar(1).setInt(210);
rootWriter.save();
assertEquals(2, rootWriter.rowCount());
assertEquals(1, rsLoader.batchCount());
assertEquals(2, rsLoader.totalRowCount());
// Harvest the first batch. Version number is the number
// of columns added.
assertFalse(rootWriter.isFull());
RowSet result = fixture.wrap(rsLoader.harvest());
assertEquals(2, rsLoader.schemaVersion());
assertEquals(0, rootWriter.rowCount());
assertEquals(1, rsLoader.batchCount());
assertEquals(2, rsLoader.totalRowCount());
SingleRowSet expected = fixture.rowSetBuilder(result.batchSchema()).addRow(100, null).addRow(200, 210).build();
new RowSetComparison(expected).verifyAndClearAll(result);
try {
rootWriter.start();
fail();
} catch (IllegalStateException e) {
// Expected
}
try {
rsLoader.harvest();
fail();
} catch (IllegalStateException e) {
// Expected
}
try {
rootWriter.save();
fail();
} catch (IllegalStateException e) {
// Expected
}
// Create a second batch
rsLoader.startBatch();
assertEquals(0, rootWriter.rowCount());
assertEquals(1, rsLoader.batchCount());
assertEquals(2, rsLoader.totalRowCount());
rootWriter.start();
rootWriter.scalar(0).setInt(300);
rootWriter.scalar(1).setInt(310);
rootWriter.save();
assertEquals(1, rootWriter.rowCount());
assertEquals(2, rsLoader.batchCount());
assertEquals(3, rsLoader.totalRowCount());
rootWriter.start();
rootWriter.scalar(0).setInt(400);
rootWriter.scalar(1).setInt(410);
rootWriter.save();
// Harvest. Schema has not changed.
result = fixture.wrap(rsLoader.harvest());
assertEquals(2, rsLoader.schemaVersion());
assertEquals(0, rootWriter.rowCount());
assertEquals(2, rsLoader.batchCount());
assertEquals(4, rsLoader.totalRowCount());
expected = fixture.rowSetBuilder(result.batchSchema()).addRow(300, 310).addRow(400, 410).build();
new RowSetComparison(expected).verifyAndClearAll(result);
// Next batch. Schema has changed.
rsLoader.startBatch();
rootWriter.start();
rootWriter.scalar(0).setInt(500);
rootWriter.scalar(1).setInt(510);
rootWriter.addColumn(SchemaBuilder.columnSchema("c", MinorType.INT, DataMode.OPTIONAL));
rootWriter.scalar(2).setInt(520);
rootWriter.save();
rootWriter.start();
rootWriter.scalar(0).setInt(600);
rootWriter.scalar(1).setInt(610);
rootWriter.scalar(2).setInt(620);
rootWriter.save();
result = fixture.wrap(rsLoader.harvest());
assertEquals(3, rsLoader.schemaVersion());
expected = fixture.rowSetBuilder(result.batchSchema()).addRow(500, 510, 520).addRow(600, 610, 620).build();
new RowSetComparison(expected).verifyAndClearAll(result);
rsLoader.close();
try {
rootWriter.start();
fail();
} catch (IllegalStateException e) {
// Expected
}
try {
rsLoader.writer();
fail();
} catch (IllegalStateException e) {
// Expected
}
try {
rsLoader.startBatch();
fail();
} catch (IllegalStateException e) {
// Expected
}
try {
rsLoader.harvest();
fail();
} catch (IllegalStateException e) {
// Expected
}
try {
rootWriter.save();
fail();
} catch (IllegalStateException e) {
// Expected
}
// Benign to close twice
rsLoader.close();
}
use of org.apache.drill.test.rowSet.RowSet.SingleRowSet in project drill by axbaretto.
the class TestResultSetSchemaChange method testSchemaChangeFirstBatch.
/**
* Test the case where the schema changes in the first batch.
* Schema changes before the first record are trivial and tested
* elsewhere. Here we write some records, then add new columns, as a
* JSON reader might do.
*/
@Test
public void testSchemaChangeFirstBatch() {
ResultSetLoader rsLoader = new ResultSetLoaderImpl(fixture.allocator());
RowSetLoader rootWriter = rsLoader.writer();
rootWriter.addColumn(SchemaBuilder.columnSchema("a", MinorType.VARCHAR, DataMode.REQUIRED));
// Create initial rows
rsLoader.startBatch();
int rowCount = 0;
for (int i = 0; i < 2; i++) {
rootWriter.start();
rowCount++;
rootWriter.scalar(0).setString("a_" + rowCount);
rootWriter.save();
}
// Add a second column: nullable.
rootWriter.addColumn(SchemaBuilder.columnSchema("b", MinorType.INT, DataMode.OPTIONAL));
for (int i = 0; i < 2; i++) {
rootWriter.start();
rowCount++;
rootWriter.scalar(0).setString("a_" + rowCount);
rootWriter.scalar(1).setInt(rowCount);
rootWriter.save();
}
// Add a third column. Use variable-width so that offset
// vectors must be back-filled.
rootWriter.addColumn(SchemaBuilder.columnSchema("c", MinorType.VARCHAR, DataMode.OPTIONAL));
for (int i = 0; i < 2; i++) {
rootWriter.start();
rowCount++;
rootWriter.scalar(0).setString("a_" + rowCount);
rootWriter.scalar(1).setInt(rowCount);
rootWriter.scalar(2).setString("c_" + rowCount);
rootWriter.save();
}
// Fourth: Required Varchar. Previous rows are back-filled with empty strings.
// And a required int. Back-filled with zeros.
// May occasionally be useful. But, does have to work to prevent
// vector corruption if some reader decides to go this route.
rootWriter.addColumn(SchemaBuilder.columnSchema("d", MinorType.VARCHAR, DataMode.REQUIRED));
rootWriter.addColumn(SchemaBuilder.columnSchema("e", MinorType.INT, DataMode.REQUIRED));
for (int i = 0; i < 2; i++) {
rootWriter.start();
rowCount++;
rootWriter.scalar(0).setString("a_" + rowCount);
rootWriter.scalar(1).setInt(rowCount);
rootWriter.scalar(2).setString("c_" + rowCount);
rootWriter.scalar(3).setString("d_" + rowCount);
rootWriter.scalar(4).setInt(rowCount * 10);
rootWriter.save();
}
// Add an array. Now two offset vectors must be back-filled.
rootWriter.addColumn(SchemaBuilder.columnSchema("f", MinorType.VARCHAR, DataMode.REPEATED));
for (int i = 0; i < 2; i++) {
rootWriter.start();
rowCount++;
rootWriter.scalar(0).setString("a_" + rowCount);
rootWriter.scalar(1).setInt(rowCount);
rootWriter.scalar(2).setString("c_" + rowCount);
rootWriter.scalar(3).setString("d_" + rowCount);
rootWriter.scalar(4).setInt(rowCount * 10);
ScalarWriter arrayWriter = rootWriter.column(5).array().scalar();
arrayWriter.setString("f_" + rowCount + "-1");
arrayWriter.setString("f_" + rowCount + "-2");
rootWriter.save();
}
// Harvest the batch and verify.
RowSet actual = fixture.wrap(rsLoader.harvest());
BatchSchema expectedSchema = new SchemaBuilder().add("a", MinorType.VARCHAR).addNullable("b", MinorType.INT).addNullable("c", MinorType.VARCHAR).add("d", MinorType.VARCHAR).add("e", MinorType.INT).addArray("f", MinorType.VARCHAR).build();
SingleRowSet expected = fixture.rowSetBuilder(expectedSchema).addRow("a_1", null, null, "", 0, strArray()).addRow("a_2", null, null, "", 0, strArray()).addRow("a_3", 3, null, "", 0, strArray()).addRow("a_4", 4, null, "", 0, strArray()).addRow("a_5", 5, "c_5", "", 0, strArray()).addRow("a_6", 6, "c_6", "", 0, strArray()).addRow("a_7", 7, "c_7", "d_7", 70, strArray()).addRow("a_8", 8, "c_8", "d_8", 80, strArray()).addRow("a_9", 9, "c_9", "d_9", 90, strArray("f_9-1", "f_9-2")).addRow("a_10", 10, "c_10", "d_10", 100, strArray("f_10-1", "f_10-2")).build();
new RowSetComparison(expected).verifyAndClearAll(actual);
rsLoader.close();
}
use of org.apache.drill.test.rowSet.RowSet.SingleRowSet in project drill by axbaretto.
the class TestShortArrays method testSizer.
@Test
public void testSizer() {
// Create a row set with less than one item, on
// average, per array.
BatchSchema schema = new SchemaBuilder().add("a", MinorType.INT).addArray("b", MinorType.INT).build();
RowSetBuilder builder = fixture.rowSetBuilder(schema).addRow(1, intArray(10));
for (int i = 2; i <= 10; i++) {
builder.addRow(i, intArray());
}
RowSet rows = builder.build();
// Run the record batch sizer on the resulting batch.
RecordBatchSizer sizer = new RecordBatchSizer(rows.container());
assertEquals(2, sizer.columns().size());
ColumnSize bCol = sizer.columns().get("b");
assertEquals(0.1, bCol.getCardinality(), 0.01);
assertEquals(1, bCol.getElementCount());
// Create a vector initializer using the sizer info.
VectorInitializer vi = sizer.buildVectorInitializer();
AllocationHint bHint = vi.hint("b");
assertNotNull(bHint);
assertEquals(bHint.elementCount, bCol.getCardinality(), 0.001);
// Create a new batch, and new vector, using the sizer and
// initializer inferred from the previous batch.
SingleRowSet empty = fixture.rowSet(schema);
vi.allocateBatch(empty.container(), 100);
assertEquals(2, empty.container().getNumberOfColumns());
@SuppressWarnings("resource") ValueVector bVector = empty.container().getValueVector(1).getValueVector();
assertTrue(bVector instanceof RepeatedIntVector);
assertEquals(16, ((RepeatedIntVector) bVector).getDataVector().getValueCapacity());
rows.clear();
empty.clear();
}
Aggregations