/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.hadoop.hive.ql.exec.vector; import java.util.Arrays; import java.util.Random; import org.apache.hadoop.hive.ql.metadata.HiveException; import junit.framework.TestCase; /** * Unit test for the vectorized conversion to and from row object[]. */ public class TestVectorRowObject extends TestCase { void examineBatch(VectorizedRowBatch batch, VectorExtractRow vectorExtractRow, Object[][] randomRows, int firstRandomRowIndex ) { int rowSize = vectorExtractRow.getCount(); Object[] row = new Object[rowSize]; for (int i = 0; i < batch.size; i++) { vectorExtractRow.extractRow(batch, i, row); Object[] expectedRow = randomRows[firstRandomRowIndex + i]; for (int c = 0; c < rowSize; c++) { Object actualValue = row[c]; Object expectedValue = expectedRow[c]; if (actualValue == null || expectedValue == null) { if (actualValue != expectedValue) { fail("Row " + (firstRandomRowIndex + i) + " and column " + c + " mismatch"); } } else if (!actualValue.equals(expectedValue)) { fail("Row " + (firstRandomRowIndex + i) + " and column " + c + " mismatch"); } } } } void testVectorRowObject(int caseNum, boolean sort, Random r) throws HiveException { String[] emptyScratchTypeNames = new String[0]; VectorRandomRowSource source = new VectorRandomRowSource(); source.init(r, VectorRandomRowSource.SupportedTypes.ALL, 4); VectorizedRowBatchCtx batchContext = new VectorizedRowBatchCtx(); batchContext.init(source.rowStructObjectInspector(), emptyScratchTypeNames); VectorizedRowBatch batch = batchContext.createVectorizedRowBatch(); // junk the destination for the 1st pass for (ColumnVector cv : batch.cols) { Arrays.fill(cv.isNull, true); cv.noNulls = false; } VectorAssignRow vectorAssignRow = new VectorAssignRow(); vectorAssignRow.init(source.typeNames()); VectorExtractRow vectorExtractRow = new VectorExtractRow(); vectorExtractRow.init(source.typeNames()); Object[][] randomRows = source.randomRows(1000); if (sort) { source.sort(randomRows); } int firstRandomRowIndex = 0; for (int i = 0; i < randomRows.length; i++) { Object[] row = randomRows[i]; vectorAssignRow.assignRow(batch, batch.size, row); batch.size++; if (batch.size == batch.DEFAULT_SIZE) { examineBatch(batch, vectorExtractRow, randomRows, firstRandomRowIndex); firstRandomRowIndex = i + 1; batch.reset(); } } if (batch.size > 0) { examineBatch(batch, vectorExtractRow, randomRows, firstRandomRowIndex); } } public void testVectorRowObject() throws Throwable { try { Random r = new Random(5678); int caseNum = 0; for (int i = 0; i < 10; i++) { testVectorRowObject(caseNum, false, r); caseNum++; } // Try one sorted. testVectorRowObject(caseNum, true, r); caseNum++; } catch (Throwable e) { e.printStackTrace(); throw e; } } }