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
|
#include "name_set.h"
#include "name_set_json.h"
#include <yql/essentials/sql/v1/ide/completion/name/service/name_service.h>
#include <library/cpp/json/json_reader.h>
#include <library/cpp/resource/resource.h>
#include <util/charset/utf8.h>
namespace NSQLComplete {
NJson::TJsonValue LoadJsonResource(TStringBuf filename) {
TString text;
Y_ENSURE(NResource::FindExact(filename, &text), filename);
return NJson::ReadJsonFastTree(text);
}
TVector<TString> ParseNames(NJson::TJsonValue::TArray& json) {
TVector<TString> keys;
keys.reserve(json.size());
for (auto& item : json) {
keys.emplace_back(item.GetMapSafe().at("name").GetStringSafe());
}
return keys;
}
TVector<TString> ParsePragmas(NJson::TJsonValue json) {
return ParseNames(json.GetArraySafe());
}
TVector<TString> ParseTypes(NJson::TJsonValue json) {
return ParseNames(json.GetArraySafe());
}
TVector<TString> ParseFunctions(NJson::TJsonValue json) {
return ParseNames(json.GetArraySafe());
}
TVector<TString> ParseUdfs(NJson::TJsonValue json) {
TVector<TString> names;
for (auto& [module, v] : json.GetMapSafe()) {
auto functions = ParseNames(v.GetArraySafe());
for (auto& function : functions) {
function.prepend("::").prepend(module);
}
std::copy(std::begin(functions), std::end(functions), std::back_inserter(names));
}
return names;
}
// TODO(YQL-19747): support multiple systems, name service/set hierarchy - common & special
THashMap<EStatementKind, TVector<TString>> ParseHints(NJson::TJsonValue json) {
THashMap<EStatementKind, TVector<TString>> hints;
THashMap<EStatementKind, TString> StatementNames = {
{EStatementKind::Select, "read"},
{EStatementKind::Insert, "insert"},
};
for (const auto& [k, kname] : StatementNames) {
for (auto& [_, values] : json.GetMapSafe().at(kname).GetMapSafe()) {
for (auto& name : ParseNames(values.GetMapSafe().at("hints").GetArraySafe())) {
hints[k].emplace_back(std::move(name));
}
}
}
for (auto& [_, hints] : hints) {
for (auto& hint : hints) {
hint = ToUpperUTF8(hint);
}
}
return hints;
}
TNameSet LoadDefaultNameSet() {
return {
.Pragmas = ParsePragmas(LoadJsonResource("pragmas_opensource.json")),
.Types = ParseTypes(LoadJsonResource("types.json")),
.Functions = Merge(
ParseFunctions(LoadJsonResource("sql_functions.json")),
ParseUdfs(LoadJsonResource("udfs_basic.json"))),
.Hints = ParseHints(LoadJsonResource("statements_opensource.json")),
};
}
TNameSet MakeDefaultNameSet() {
return Pruned(LoadDefaultNameSet(), LoadFrequencyData());
}
} // namespace NSQLComplete
|