summaryrefslogtreecommitdiffstats
path: root/yql/essentials/minikql/runtime_settings/runtime_settings_serialization.cpp
blob: bcb2f7a0b54825496cfd4a4e3e1dc06a3e61e74b (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "runtime_settings_serialization.h"

#include <yql/essentials/providers/common/config/yql_dispatch.h>
#include <yql/essentials/providers/common/activation/yql_activation.h>

namespace NYql {

namespace {

void FillUdfSettings(
    TRuntimeSettingsConfiguration& config,
    const google::protobuf::RepeatedPtrField<NProto::TUdfSettings>& udfSettings,
    const std::function<bool(const NProto::TRuntimeSetting&)>& filter,
    const TQContext& qContext)
{
    for (const auto& udf : udfSettings) {
        TString activationLabel = TStringBuilder() << "runtime_settings_udf_" << udf.GetModule();
        auto flags = NCommon::SelectAndSaveActivatedFlags<NProto::TRuntimeSetting>(
            activationLabel, qContext, udf.GetRuntimeSettings(), filter, /*hasProviderName=*/true);
        for (const auto& setting : flags) {
            config.SetUdfSetting(udf.GetModule(), setting.GetName(), setting.GetValue());
        }
    }
}

TRuntimeSettings::TPtr CreateRuntimeSettingsFromProtoImpl(
    const NProto::TRuntimeSettings& proto,
    const TString& userName,
    TCredentials::TPtr credentials,
    bool allowActivation,
    const TQContext& qContext,
    const std::function<void(const TString&)>& onPartialFeatureActivation)
{
    auto config = MakeRuntimeSettingsConfigurationMutable(qContext);
    auto filter = NConfig::MakeActivationFilter<NProto::TRuntimeSetting>(userName, credentials, [&](const TString& name) {
        YQL_ENSURE(allowActivation, "Activation is not allowed. "
                                    "Seems you are trying to load runtime settings with activation but all settings must be already activated.");
        if (onPartialFeatureActivation) {
            onPartialFeatureActivation(name);
        }
    });
    config->Dispatch(proto.GetHostSettings(), filter);
    FillUdfSettings(*config, proto.GetUdfSettings(), filter, qContext);
    return config;
}

TRuntimeSettings::TPtr CreateRuntimeSettingsFromStringImpl(const TString& data)
{
    NProto::TRuntimeSettings proto;
    proto.ParseFromStringOrThrow(data);
    return CreateRuntimeSettingsFromProtoImpl(proto, "", nullptr, /*allowActivation=*/false, TQContext(), {});
}

} // namespace

TRuntimeSettings::TPtr CreateRuntimeSettingsFromProto(
    const NProto::TRuntimeSettings& proto,
    const TString& userName,
    TCredentials::TPtr credentials,
    const TQContext& qContext,
    std::function<void(const TString&)> onPartialFeatureActivation)
{
    return CreateRuntimeSettingsFromProtoImpl(proto, userName, credentials, /*allowActivation=*/true, qContext, onPartialFeatureActivation);
}

TRuntimeSettings::TPtr DeserializeRuntimeSettingsFromProto(
    const NProto::TRuntimeSettings& proto)
{
    return CreateRuntimeSettingsFromProtoImpl(proto, "", nullptr, /*allowActivation=*/false, TQContext(), {});
}

NProto::TRuntimeSettings SerializeRuntimeSettingsToProto(
    const TRuntimeSettings& config)
{
    NProto::TRuntimeSettings proto;
    TRuntimeSettingsConfiguration configuration(config);
    configuration.SerializeStaticSettings([&proto](const TString& name, const TString& value) {
        auto* setting = proto.AddHostSettings();
        setting->SetName(name);
        setting->SetValue(value);
    });

    for (const auto& [moduleName, settingsMap] : config.GetUdfSettings()) {
        auto* udfSettings = proto.AddUdfSettings();
        udfSettings->SetModule(moduleName);
        for (const auto& [name, value] : settingsMap) {
            auto* setting = udfSettings->AddRuntimeSettings();
            setting->SetName(name);
            setting->SetValue(value);
        }
    }

    return proto;
}

TString SerializeRuntimeSettingsToString(const TRuntimeSettings& config) {
    TString result;
    Y_ENSURE(SerializeRuntimeSettingsToProto(config).SerializeToString(&result));
    return result;
}

TRuntimeSettings::TPtr CreateRuntimeSettingsFromString(
    const TString& data)
{
    return CreateRuntimeSettingsFromStringImpl(data);
}

} // namespace NYql