aboutsummaryrefslogtreecommitdiffstats
path: root/yt/cpp/mapreduce/client/format_hints.cpp
blob: 0c0121e7a58f2f48865ea07943545d3b677615c2 (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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "format_hints.h"

#include <yt/cpp/mapreduce/common/helpers.h>
#include <yt/cpp/mapreduce/interface/config.h>
#include <yt/cpp/mapreduce/interface/operation.h>

#include <util/string/builder.h>

namespace NYT::NDetail {

using ::ToString;

////////////////////////////////////////////////////////////////////////////////

static void ApplyEnableTypeConversion(TFormat* format, const TFormatHints& formatHints)
{
    if (formatHints.EnableAllToStringConversion_) {
        format->Config.Attributes()["enable_all_to_string_conversion"] = *formatHints.EnableAllToStringConversion_;
    }
    if (formatHints.EnableStringToAllConversion_) {
        format->Config.Attributes()["enable_string_to_all_conversion"] = *formatHints.EnableStringToAllConversion_;
    }
    if (formatHints.EnableIntegralTypeConversion_) {
        format->Config.Attributes()["enable_integral_type_conversion"] = *formatHints.EnableIntegralTypeConversion_;
    }
    if (formatHints.EnableIntegralToDoubleConversion_) {
        format->Config.Attributes()["enable_integral_to_double_conversion"] = *formatHints.EnableIntegralToDoubleConversion_;
    }
    if (formatHints.EnableTypeConversion_) {
        format->Config.Attributes()["enable_type_conversion"] = *formatHints.EnableTypeConversion_;
    }
}

template <>
void ApplyFormatHints<TNode>(TFormat* format, const TMaybe<TFormatHints>& formatHints)
{
    Y_ABORT_UNLESS(format);
    if (!formatHints) {
        return;
    }

    ApplyEnableTypeConversion(format, *formatHints);

    if (formatHints->SkipNullValuesForTNode_) {
        Y_ENSURE_EX(
            format->Config.AsString() == "yson",
            TApiUsageError() << "SkipNullForTNode option must be used with yson format, actual format: " << format->Config.AsString());
        format->Config.Attributes()["skip_null_values"] = formatHints->SkipNullValuesForTNode_;
    }

    if (formatHints->ComplexTypeMode_) {
        Y_ENSURE_EX(
            format->Config.AsString() == "yson",
            TApiUsageError() << "ComplexTypeMode option must be used with yson format, actual format: "
                << format->Config.AsString());
        format->Config.Attributes()["complex_type_mode"] = ToString(*formatHints->ComplexTypeMode_);
    }
}

template <>
void ApplyFormatHints<TYaMRRow>(TFormat* format, const TMaybe<TFormatHints>& formatHints)
{
    Y_ABORT_UNLESS(format);
    if (!formatHints) {
        return;
    }

    ythrow TApiUsageError() << "Yamr format currently has no supported format hints";
}

template <>
void ApplyFormatHints<::google::protobuf::Message>(TFormat* format, const TMaybe<TFormatHints>& formatHints)
{
    Y_ABORT_UNLESS(format);
    if (!formatHints) {
        return;
    }

    ythrow TApiUsageError() << "Protobuf format currently has no supported format hints";
}

////////////////////////////////////////////////////////////////////////////////

} // namespace NYT::NDetail