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)); | 
