summaryrefslogtreecommitdiffstats
path: root/yql/essentials/minikql/comp_nodes/ut/mkql_block_serializer_test_utils.cpp
blob: 1fb8135b3ec706aa45da0f28efa1ac67e545100b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "mkql_block_serializer_test_utils.h"

#include <yql/essentials/minikql/computation/mkql_block_transport.h>
#include <yql/essentials/minikql/computation/mkql_datum_validate.h>
#include <yql/essentials/minikql/computation/mkql_computation_node_holders.h>
#include <yql/essentials/utils/chunked_buffer.h>

#include <library/cpp/testing/unittest/registar.h>

namespace NKikimr::NMiniKQL {

std::shared_ptr<arrow::ArrayData> DoSerializerRoundtrip(
    const std::shared_ptr<arrow::ArrayData>& arrayData, TType* itemType, TType* blockType)
{
    const ui64 blockLen = static_cast<ui64>(arrayData->length);
    auto* pool = arrow::default_memory_pool();
    TBlockSerializerParams params(pool, Nothing(), /*shouldSerializeOffset=*/true);
    auto serializer = MakeBlockSerializer(TTypeInfoHelper(), itemType, params);
    auto deserializer = MakeBlockDeserializer(TTypeInfoHelper(), itemType, params);

    TVector<ui64> metadata;
    serializer->StoreMetadata(*arrayData, [&](ui64 meta) { metadata.push_back(meta); });
    NYql::TChunkedBuffer buffer;
    serializer->StoreArray(*arrayData, buffer);

    size_t metaIdx = 0;
    deserializer->LoadMetadata([&]() -> ui64 { return metadata[metaIdx++]; });
    auto restored = deserializer->LoadArray(buffer, blockLen, TMaybe<size_t>(0));

    ValidateDatum(restored, Nothing(), blockType, NYql::EDatumValidationMode::Expensive);
    UNIT_ASSERT_VALUES_EQUAL(restored->length, arrayData->length);
    return restored;
}

} // namespace NKikimr::NMiniKQL