diff options
| author | robot-piglet <[email protected]> | 2025-06-18 19:14:22 +0300 |
|---|---|---|
| committer | robot-piglet <[email protected]> | 2025-06-18 19:30:03 +0300 |
| commit | 47a80ed902e4e755477cd5b8a14a4f10c06938f9 (patch) | |
| tree | d53f5f310b9f442c7545620567531e1c69ebeeb6 | |
| parent | 6c1c32e876eeb5a58183d027b26ce7420eaa7c81 (diff) | |
Intermediate changes
commit_hash:56c7deefce71a95f10a4738b0a51e6ba384dd983
8 files changed, 180 insertions, 36 deletions
diff --git a/yql/essentials/sql/v1/complete/check/check_complete.cpp b/yql/essentials/sql/v1/complete/check/check_complete.cpp index 1e3ab5f7daf..e7adb846776 100644 --- a/yql/essentials/sql/v1/complete/check/check_complete.cpp +++ b/yql/essentials/sql/v1/complete/check/check_complete.cpp @@ -49,7 +49,7 @@ namespace NSQLComplete { } } - return MakeSchemaNameService(MakeSimpleSchema(MakeStaticSimpleSchema(std::move(fs)))); + return MakeSchemaNameService(MakeSimpleSchema(MakeStaticSimpleSchema({.Folders = std::move(fs)}))); } } // namespace diff --git a/yql/essentials/sql/v1/complete/name/object/simple/schema_ut.cpp b/yql/essentials/sql/v1/complete/name/object/simple/schema_ut.cpp index 7fdd5d66b21..e74b81913aa 100644 --- a/yql/essentials/sql/v1/complete/name/object/simple/schema_ut.cpp +++ b/yql/essentials/sql/v1/complete/name/object/simple/schema_ut.cpp @@ -20,8 +20,7 @@ Y_UNIT_TEST_SUITE(StaticSchemaTests) { {"Table", "meta"}}}, {"/test/service/", {{"Table", "example"}}}}}, }; - return MakeSimpleSchema( - MakeStaticSimpleSchema(std::move(fs))); + return MakeSimpleSchema(MakeStaticSimpleSchema({.Folders = std::move(fs)})); } Y_UNIT_TEST(ListFolderBasic) { diff --git a/yql/essentials/sql/v1/complete/name/object/simple/static/schema.cpp b/yql/essentials/sql/v1/complete/name/object/simple/static/schema.cpp index 7707d8dc4ba..576de4dfdc5 100644 --- a/yql/essentials/sql/v1/complete/name/object/simple/static/schema.cpp +++ b/yql/essentials/sql/v1/complete/name/object/simple/static/schema.cpp @@ -79,10 +79,8 @@ namespace NSQLComplete { } // namespace - ISimpleSchema::TPtr MakeStaticSimpleSchema( - THashMap<TString, THashMap<TString, TVector<TFolderEntry>>> folders, - THashMap<TString, THashMap<TString, TTableDetails>> tables) { - return new TSimpleSchema(std::move(folders), std::move(tables)); + ISimpleSchema::TPtr MakeStaticSimpleSchema(TSchemaData data) { + return new TSimpleSchema(std::move(data.Folders), std::move(data.Tables)); } } // namespace NSQLComplete diff --git a/yql/essentials/sql/v1/complete/name/object/simple/static/schema.h b/yql/essentials/sql/v1/complete/name/object/simple/static/schema.h index 57fb322d6e2..0fdf8f00d9b 100644 --- a/yql/essentials/sql/v1/complete/name/object/simple/static/schema.h +++ b/yql/essentials/sql/v1/complete/name/object/simple/static/schema.h @@ -2,10 +2,15 @@ #include <yql/essentials/sql/v1/complete/name/object/simple/schema.h> +#include <util/generic/hash.h> + namespace NSQLComplete { - ISimpleSchema::TPtr MakeStaticSimpleSchema( - THashMap<TString, THashMap<TString, TVector<TFolderEntry>>> folders, - THashMap<TString, THashMap<TString, TTableDetails>> tables = {}); + struct TSchemaData { + THashMap<TString, THashMap<TString, TVector<TFolderEntry>>> Folders; + THashMap<TString, THashMap<TString, TTableDetails>> Tables; + }; + + ISimpleSchema::TPtr MakeStaticSimpleSchema(TSchemaData data); } // namespace NSQLComplete diff --git a/yql/essentials/sql/v1/complete/name/object/simple/static/schema_json.cpp b/yql/essentials/sql/v1/complete/name/object/simple/static/schema_json.cpp new file mode 100644 index 00000000000..ee253a5ad2c --- /dev/null +++ b/yql/essentials/sql/v1/complete/name/object/simple/static/schema_json.cpp @@ -0,0 +1,109 @@ +#include "schema_json.h" + +#include "schema.h" + +#include <util/generic/hash.h> +#include <util/generic/vector.h> +#include <util/generic/scope.h> +#include <util/string/join.h> + +namespace NSQLComplete { + + namespace { + + TString PathString(const TVector<TString>& path) { + return "/" + JoinSeq("/", path); + } + + const NJson::TJsonValue& Expect( + const TVector<TString>& path, + const NJson::TJsonValue::TMapType& json, + TStringBuf key) { + if (!json.contains(key)) { + ythrow yexception() << "At " << PathString(path) << " expected " << key; + } + return json.at(key); + } + + const NJson::TJsonValue::TMapType& ExpectMap( + const TVector<TString>& path, + const NJson::TJsonValue& json) { + if (!json.IsMap()) { + ythrow yexception() << "At " << PathString(path) << " expected Map"; + } + return json.GetMapSafe(); + } + + const NJson::TJsonValue::TMapType& ExpectMap( + const TVector<TString>& path, + const NJson::TJsonValue::TMapType& json, + TStringBuf key) { + Expect(path, json, key); + return ExpectMap(path, json.at(key)); + } + + TString Parse( + const TString& cluster, + const NJson::TJsonValue::TMapType& json, + TSchemaData& data, + TVector<TString>& path); + + void ParseFolder( + const TString& cluster, + const NJson::TJsonValue::TMapType& json, + TSchemaData& data, + TVector<TString>& path) { + for (const auto& [name, entry] : ExpectMap(path, json, "entries")) { + path.emplace_back(name); + TString type = Parse(cluster, ExpectMap(path, entry), data, path); + path.pop_back(); + + TStringBuf suffix = (!path.empty()) ? "/" : ""; + data.Folders[cluster][PathString(path) + suffix].emplace_back(type, name); + } + } + + void ParseTable( + const TString& cluster, + const NJson::TJsonValue::TMapType& json, + TSchemaData& data, + TVector<TString>& path) { + for (const auto& [name, _] : ExpectMap(path, json, "columns")) { + data.Tables[cluster][PathString(path)].Columns.emplace_back(name); + } + } + + TString Parse( + const TString& cluster, + const NJson::TJsonValue::TMapType& json, + TSchemaData& data, + TVector<TString>& path) { + auto type = Expect(path, json, "type"); + + if (type == TFolderEntry::Folder) { + ParseFolder(cluster, json, data, path); + return TFolderEntry::Folder; + } + + if (type == TFolderEntry::Table) { + ParseTable(cluster, json, data, path); + return TFolderEntry::Table; + } + + ythrow yexception() << "Unexpected type: " << type; + } + + } // namespace + + ISimpleSchema::TPtr MakeStaticSimpleSchema(const NJson::TJsonMap& json) { + TSchemaData data; + + for (const auto& [cluster, tree] : json.GetMap()) { + TVector<TString> path; + ParseFolder(cluster, tree.GetMapSafe(), data, path); + } + + return MakeStaticSimpleSchema(std::move(data)); + } + +} // namespace NSQLComplete diff --git a/yql/essentials/sql/v1/complete/name/object/simple/static/schema_json.h b/yql/essentials/sql/v1/complete/name/object/simple/static/schema_json.h new file mode 100644 index 00000000000..83b053791ee --- /dev/null +++ b/yql/essentials/sql/v1/complete/name/object/simple/static/schema_json.h @@ -0,0 +1,11 @@ +#pragma once + +#include <library/cpp/json/json_value.h> + +#include <yql/essentials/sql/v1/complete/name/object/simple/schema.h> + +namespace NSQLComplete { + + ISimpleSchema::TPtr MakeStaticSimpleSchema(const NJson::TJsonMap& json); + +} // namespace NSQLComplete diff --git a/yql/essentials/sql/v1/complete/name/object/simple/static/ya.make b/yql/essentials/sql/v1/complete/name/object/simple/static/ya.make index 8e7918ed011..fd64fb703d4 100644 --- a/yql/essentials/sql/v1/complete/name/object/simple/static/ya.make +++ b/yql/essentials/sql/v1/complete/name/object/simple/static/ya.make @@ -1,11 +1,13 @@ LIBRARY() SRCS( + schema_json.cpp schema.cpp ) PEERDIR( yql/essentials/sql/v1/complete/name/object/simple + library/cpp/json ) END() diff --git a/yql/essentials/sql/v1/complete/sql_complete_ut.cpp b/yql/essentials/sql/v1/complete/sql_complete_ut.cpp index f78d2f54cb0..1e3b2debdb1 100644 --- a/yql/essentials/sql/v1/complete/sql_complete_ut.cpp +++ b/yql/essentials/sql/v1/complete/sql_complete_ut.cpp @@ -6,6 +6,7 @@ #include <yql/essentials/sql/v1/complete/name/object/simple/schema.h> #include <yql/essentials/sql/v1/complete/name/object/simple/cached/schema.h> #include <yql/essentials/sql/v1/complete/name/object/simple/static/schema.h> +#include <yql/essentials/sql/v1/complete/name/object/simple/static/schema_json.h> #include <yql/essentials/sql/v1/complete/name/service/ranking/frequency.h> #include <yql/essentials/sql/v1/complete/name/service/ranking/ranking.h> #include <yql/essentials/sql/v1/complete/name/service/cluster/name_service.h> @@ -20,6 +21,8 @@ #include <library/cpp/testing/unittest/registar.h> #include <library/cpp/iterator/iterate_keys.h> #include <library/cpp/iterator/functools.h> +#include <library/cpp/json/json_value.h> +#include <library/cpp/json/json_reader.h> #include <util/charset/utf8.h> @@ -84,38 +87,51 @@ Y_UNIT_TEST_SUITE(SqlCompleteTests) { }, }; - THashMap<TString, THashMap<TString, TVector<TFolderEntry>>> folders = { - {"", {{"/", {{"Folder", "local"}, - {"Folder", "test"}, - {"Folder", "prod"}, - {"Folder", ".sys"}}}, - {"/local/", {{"Table", "example"}, - {"Table", "account"}, - {"Table", "abacaba"}}}, - {"/test/", {{"Folder", "service"}, - {"Table", "meta"}}}, - {"/test/service/", {{"Table", "example"}}}, - {"/.sys/", {{"Table", "status"}}}}}, - {"example", - {{"/", {{"Table", "people"}, - {"Folder", "yql"}}}, - {"/yql/", {{"Table", "tutorial"}}}}}, - {"saurus", - {{"/", {{"Table", "maxim"}}}}}, - }; - - THashMap<TString, THashMap<TString, TTableDetails>> tables = { - {"example", {{"/people", {{"name", "age"}}}}}}; + TString clustersText = R"({ + "": { "type": "Folder", "entries": { + "local": { "type": "Folder", "entries": { + "example": { "type": "Table", "columns": {} }, + "account": { "type": "Table", "columns": {} }, + "abacaba": { "type": "Table", "columns": {} } + }}, + "test": { "type": "Folder", "entries": { + "service": { "type": "Folder", "entries": { + "example": { "type": "Table", "columns": {} } + }}, + "meta": { "type": "Table", "columns": {} } + }}, + "prod": { "type": "Folder", "entries": { + }}, + ".sys": { "type": "Folder", "entries": { + "status": { "type": "Table", "columns": {} } + }} + }}, + "example": { "type": "Folder", "entries": { + "people": { "type": "Table", "columns": { + "name": {}, + "age": {} + }}, + "yql": { "type": "Folder", "entries": { + "tutorial": { "type": "Table", "columns": {} } + }} + }}, + "saurus": { "type": "Folder", "entries": { + "maxim": { "type": "Table", "columns": {} } + }} + })"; + + NJson::TJsonMap clustersJson; + Y_ENSURE(NJson::ReadJsonTree(clustersText, &clustersJson)); auto clustersIt = NFuncTools::Filter( - [](const auto& x) { return !x.empty(); }, IterateKeys(folders)); + [](const auto& x) { return !x.empty(); }, IterateKeys(clustersJson.GetMapSafe())); TVector<TString> clusters(begin(clustersIt), end(clustersIt)); TFrequencyData frequency; TVector<INameService::TPtr> children = { MakeStaticNameService(std::move(names), frequency), - MakeSchemaNameService(MakeSimpleSchema(MakeStaticSimpleSchema(std::move(folders), std::move(tables)))), + MakeSchemaNameService(MakeSimpleSchema(MakeStaticSimpleSchema(clustersJson))), MakeClusterNameService(MakeStaticClusterDiscovery(std::move(clusters))), }; INameService::TPtr service = MakeUnionNameService( @@ -1369,13 +1385,17 @@ JOIN yt:$cluster_name.test; MakeSimpleSchema( MakeCachedSimpleSchema( cache, "alice", - MakeStaticSimpleSchema({{"", {{"/", {{"Table", "alice"}}}}}})))); + MakeStaticSimpleSchema(TSchemaData{ + .Folders = {{"", {{"/", {{"Table", "alice"}}}}}}, + })))); auto petyaService = MakeSchemaNameService( MakeSimpleSchema( MakeCachedSimpleSchema( cache, "petya", - MakeStaticSimpleSchema({{"", {{"/", {{"Table", "petya"}}}}}})))); + MakeStaticSimpleSchema(TSchemaData{ + .Folders = {{"", {{"/", {{"Table", "petya"}}}}}}, + })))); auto aliceEngine = MakeSqlCompletionEngine(lexer, std::move(aliceService)); auto petyaEngine = MakeSqlCompletionEngine(lexer, std::move(petyaService)); |
