blob: 16001cc6d6a6e6dcf7ec95c397d03a9a2514cb75 [file] [log] [blame]
/*
* 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.
*/
#include "../utils/VeloxArrowUtils.h"
#include "memory/ArrowMemoryPool.h"
#include "memory/VeloxColumnarBatch.h"
#include "operators/serializer//VeloxColumnarToRowConverter.h"
#include "operators/serializer//VeloxRowToColumnarConverter.h"
#include "velox/vector/tests/utils/VectorTestBase.h"
using namespace facebook;
using namespace facebook::velox;
namespace gluten {
class VeloxRowToColumnarTest : public ::testing::Test, public test::VectorTestBase {
protected:
static void SetUpTestCase() {
memory::MemoryManager::testingSetInstance(memory::MemoryManager::Options{});
}
void testRowVectorEqual(velox::RowVectorPtr vector) {
auto columnarToRowConverter = std::make_shared<VeloxColumnarToRowConverter>(pool_, 64 << 10);
auto columnarBatch = std::make_shared<VeloxColumnarBatch>(vector);
columnarToRowConverter->convert(columnarBatch);
int64_t numRows = vector->size();
uint8_t* address = columnarToRowConverter->getBufferAddress();
auto lengthVec = columnarToRowConverter->getLengths();
std::vector<int64_t> lengthArr(lengthVec.size());
for (int i = 0; i < lengthVec.size(); i++) {
lengthArr[i] = lengthVec[i];
}
ArrowSchema cSchema;
toArrowSchema(vector->type(), pool(), &cSchema);
auto rowToColumnarConverter = std::make_shared<VeloxRowToColumnarConverter>(&cSchema, pool_);
auto cb = rowToColumnarConverter->convert(numRows, lengthArr.data(), address);
auto vp = std::dynamic_pointer_cast<VeloxColumnarBatch>(cb)->getRowVector();
velox::test::assertEqualVectors(vector, vp);
}
};
TEST_F(VeloxRowToColumnarTest, allTypes) {
auto vector = makeRowVector({
makeNullableFlatVector<int8_t>({1, 2, 3, std::nullopt, 4, std::nullopt, 5, 6, std::nullopt, 7}),
makeNullableFlatVector<int8_t>({1, -1, std::nullopt, std::nullopt, -2, 2, std::nullopt, std::nullopt, 3, -3}),
makeNullableFlatVector<int32_t>({1, 2, 3, 4, std::nullopt, 5, 6, 7, 8, std::nullopt}),
makeNullableFlatVector<int64_t>(
{std::nullopt,
std::nullopt,
std::nullopt,
std::nullopt,
std::nullopt,
std::nullopt,
std::nullopt,
std::nullopt,
std::nullopt,
std::nullopt}),
makeNullableFlatVector<float>(
{-0.1234567,
std::nullopt,
0.1234567,
std::nullopt,
-0.142857,
std::nullopt,
0.142857,
0.285714,
0.428617,
std::nullopt}),
makeNullableFlatVector<bool>(
{std::nullopt, true, false, std::nullopt, true, true, false, true, std::nullopt, std::nullopt}),
makeFlatVector<velox::StringView>(
{"alice0",
"bob1",
"alice2",
"bob3",
"Alice4",
"Bob5123456789098766notinline",
"AlicE6",
"boB7",
"ALICE8",
"BOB9"}),
makeNullableFlatVector<velox::StringView>(
{"alice", "bob", std::nullopt, std::nullopt, "Alice", "Bob", std::nullopt, "alicE", std::nullopt, "boB"}),
});
testRowVectorEqual(vector);
}
TEST_F(VeloxRowToColumnarTest, bigint) {
auto vector = makeRowVector({
makeNullableFlatVector<int64_t>({1, 2, 3, std::nullopt, 4, std::nullopt, 5, 6, std::nullopt, 7}),
});
testRowVectorEqual(vector);
}
TEST_F(VeloxRowToColumnarTest, decimal) {
auto vector = makeRowVector({
makeNullableFlatVector<int128_t>(
{123456, HugeInt::build(1045, 1789), 3678, std::nullopt, 4, std::nullopt, 5, 687987, std::nullopt, 7},
DECIMAL(38, 2)),
makeNullableFlatVector<int64_t>(
{178987, 2, 3, std::nullopt, 4, std::nullopt, 5, 6, std::nullopt, 7}, DECIMAL(12, 3)),
});
testRowVectorEqual(vector);
}
TEST_F(VeloxRowToColumnarTest, timestamp) {
auto vector = makeRowVector({
makeNullableFlatVector<Timestamp>(
{Timestamp(-946684800, 0),
Timestamp(-7266, 0),
Timestamp(0, 0),
Timestamp(946684800, 0),
Timestamp(9466848000, 0),
Timestamp(94668480000, 0),
Timestamp(946729316, 0),
Timestamp(946729316, 0),
Timestamp(946729316, 0),
Timestamp(7266, 0),
Timestamp(-50049331200, 0),
Timestamp(253405036800, 0),
Timestamp(-62480037600, 0),
std::nullopt}),
});
testRowVectorEqual(vector);
}
} // namespace gluten