blob: 35c18d8ec34f2d63fcef524425b8e3bee821deb8 [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 <gtest/gtest.h>
#include "../utils/VeloxArrowUtils.h"
#include "compute/VeloxBackend.h"
#include "memory/ArrowMemoryPool.h"
#include "memory/VeloxColumnarBatch.h"
#include "operators/serializer/VeloxColumnarBatchSerializer.h"
#include "velox/vector/arrow/Bridge.h"
#include "velox/vector/tests/utils/VectorTestBase.h"
#include <arrow/buffer.h>
using namespace facebook::velox;
namespace gluten {
class VeloxColumnarBatchSerializerTest : public ::testing::Test, public test::VectorTestBase {
protected:
static void SetUpTestSuite() {
VeloxBackend::create(AllocationListener::noop(), {});
memory::MemoryManager::testingSetInstance(memory::MemoryManager::Options{});
}
static void TearDownTestSuite() {
VeloxBackend::get()->tearDown();
}
};
TEST_F(VeloxColumnarBatchSerializerTest, serialize) {
auto* arrowPool = getDefaultMemoryManager()->defaultArrowMemoryPool();
std::vector<VectorPtr> children = {
makeNullableFlatVector<int8_t>({1, 2, 3, std::nullopt, 4}),
makeNullableFlatVector<int8_t>({1, -1, std::nullopt, std::nullopt, -2}),
makeNullableFlatVector<int32_t>({1, 2, 3, 4, std::nullopt}),
makeNullableFlatVector<int64_t>({std::nullopt, std::nullopt, std::nullopt, std::nullopt, std::nullopt}),
makeNullableFlatVector<float>({-0.1234567, std::nullopt, 0.1234567, std::nullopt, -0.142857}),
makeNullableFlatVector<bool>({std::nullopt, true, false, std::nullopt, true}),
makeFlatVector<StringView>({"alice0", "bob1", "alice2", "bob3", "Alice4uuudeuhdhfudhfudhfudhbvudubvudfvu"}),
makeNullableFlatVector<StringView>({"alice", "bob", std::nullopt, std::nullopt, "Alice"}),
makeNullableFlatVector<int64_t>({34567235, 4567, 222, 34567, 333}, DECIMAL(12, 4)),
makeNullableFlatVector<int128_t>({34567235, 4567, 222, 34567, 333}, DECIMAL(20, 4)),
};
auto vector = makeRowVector(children);
auto batch = std::make_shared<VeloxColumnarBatch>(vector);
auto serializer = std::make_shared<VeloxColumnarBatchSerializer>(arrowPool, pool_, nullptr);
serializer->append(batch);
std::shared_ptr<arrow::Buffer> buffer;
GLUTEN_ASSIGN_OR_THROW(buffer, arrow::AllocateResizableBuffer(serializer->maxSerializedSize(), arrowPool));
serializer->serializeTo(reinterpret_cast<uint8_t*>(buffer->mutable_address()), buffer->size());
ArrowSchema cSchema;
exportToArrow(vector, cSchema, ArrowUtils::getBridgeOptions());
auto deserializer = std::make_shared<VeloxColumnarBatchSerializer>(arrowPool, pool_, &cSchema);
auto deserialized = deserializer->deserialize(const_cast<uint8_t*>(buffer->data()), buffer->size());
auto deserializedVector = std::dynamic_pointer_cast<VeloxColumnarBatch>(deserialized)->getRowVector();
test::assertEqualVectors(vector, deserializedVector);
}
} // namespace gluten