summaryrefslogtreecommitdiffstats
path: root/yql/essentials/minikql/runtime_settings/runtime_settings.h
blob: 0ee82c9d6de8c06ed5b3f924123828944ea91a63 (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
#pragma once

#include <yql/essentials/providers/common/config/yql_setting.h>

#include <util/generic/map.h>
#include <util/generic/ptr.h>

namespace NYql {

enum class EDatumValidationMode {
    None,
    Cheap,
    Expensive,
};

constexpr EDatumValidationMode DefaultDatumValidationMode = EDatumValidationMode::None;

constexpr EDatumValidationMode DefaultDatumTestValidationMode = EDatumValidationMode::Cheap;

template <typename TType>
class TRuntimeSetting {
public:
    using TConfSetting = NYql::NCommon::TConfSetting<TType, NYql::NCommon::EConfSettingType::Static>;

    explicit TRuntimeSetting(const TType& value)
        : DefaultValue_(value)
    {
    }

    TType Get() const {
        return Setting_.Get().GetOrElse(DefaultValue_);
    }

    void Set(const TType& value) {
        Setting_ = value;
    }

private:
    friend class TRuntimeSettingsConfiguration;

    TConfSetting Setting_;
    TType DefaultValue_;
};

struct TRuntimeSettings {
    using TPtr = TSharedPtr<TRuntimeSettings, TAtomicCounter>;
    using TConstPtr = TSharedPtr<const TRuntimeSettings, TAtomicCounter>;

    TRuntimeSettings();
    virtual ~TRuntimeSettings();

    // =============================== Host settings ===============================
    TRuntimeSetting<EDatumValidationMode> DatumValidation{DefaultDatumValidationMode};
    // Noop feature.
    // Used for testing only.
    TRuntimeSetting<bool> TestHostSetting{false};
    // =============================== Host settings end ===========================
    using TUdfSettings = TMap<TString, TString>;

    TStringBuf GetUdfSetting(TStringBuf module, TStringBuf settingName) const {
        const auto moduleIt = ModuleToSettings_.find(module);
        if (moduleIt == ModuleToSettings_.end()) {
            return TStringBuf{};
        }
        const auto settingIt = moduleIt->second.find(settingName);
        if (settingIt == moduleIt->second.end()) {
            return TStringBuf{};
        }
        return settingIt->second;
    }

    void SetUdfSetting(const TString& module, const TString& settingName, const TString& value) {
        ModuleToSettings_[module][settingName] = value;
    }

    const TMap<TString, TUdfSettings>& GetUdfSettings() const {
        return ModuleToSettings_;
    }

private:
    TMap<TString, TUdfSettings> ModuleToSettings_;
};

TRuntimeSettings::TConstPtr MakeRuntimeSettings(auto&&... args) {
    return MakeShared<const TRuntimeSettings, TAtomicCounter>(std::forward<decltype(args)>(args)...);
}

TRuntimeSettings::TPtr MakeRuntimeSettingsMutable(auto&&... args) {
    return MakeShared<TRuntimeSettings, TAtomicCounter>(std::forward<decltype(args)>(args)...);
}

} // namespace NYql

template <>
void Out<NYql::EDatumValidationMode>(IOutputStream& out, NYql::EDatumValidationMode value);