summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrobot-piglet <[email protected]>2025-06-18 19:14:22 +0300
committerrobot-piglet <[email protected]>2025-06-18 19:30:03 +0300
commit47a80ed902e4e755477cd5b8a14a4f10c06938f9 (patch)
treed53f5f310b9f442c7545620567531e1c69ebeeb6
parent6c1c32e876eeb5a58183d027b26ce7420eaa7c81 (diff)
Intermediate changes
commit_hash:56c7deefce71a95f10a4738b0a51e6ba384dd983
-rw-r--r--yql/essentials/sql/v1/complete/check/check_complete.cpp2
-rw-r--r--yql/essentials/sql/v1/complete/name/object/simple/schema_ut.cpp3
-rw-r--r--yql/essentials/sql/v1/complete/name/object/simple/static/schema.cpp6
-rw-r--r--yql/essentials/sql/v1/complete/name/object/simple/static/schema.h11
-rw-r--r--yql/essentials/sql/v1/complete/name/object/simple/static/schema_json.cpp109
-rw-r--r--yql/essentials/sql/v1/complete/name/object/simple/static/schema_json.h11
-rw-r--r--yql/essentials/sql/v1/complete/name/object/simple/static/ya.make2
-rw-r--r--yql/essentials/sql/v1/complete/sql_complete_ut.cpp72
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));