yql_mounts.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include "yql_mounts.h"
  2. #include <yql/essentials/core/yql_library_compiler.h>
  3. #include <yql/essentials/utils/log/profile.h>
  4. #include <library/cpp/resource/resource.h>
  5. #include <util/folder/path.h>
  6. #include <util/stream/file.h>
  7. namespace NYql {
  8. namespace {
  9. using namespace NUserData;
  10. void AddLibraryFromResource(TUserDataTable& userDataTable, const TString& resourceName) {
  11. auto& block = userDataTable[TUserDataKey::File(resourceName)];
  12. block.Data = NResource::Find(resourceName);
  13. block.Type = EUserDataType::RAW_INLINE_DATA;
  14. block.Usage.Set(EUserDataBlockUsage::Library, true);
  15. }
  16. TUserDataKey CreateKey(const NUserData::TUserData& item) {
  17. TString name = (item.Disposition_ == EDisposition::RESOURCE) ? item.Content_ : item.Name_;
  18. if (!name.StartsWith('/')) {
  19. name = GetDefaultFilePrefix() + name;
  20. }
  21. if (item.Type_ == EType::UDF) {
  22. return TUserDataKey::Udf(name);
  23. } else {
  24. return TUserDataKey::File(name);
  25. }
  26. }
  27. void AddUserDataToTable(
  28. TUserDataTable& userDataTable,
  29. const NUserData::TUserData& item) {
  30. auto& block = userDataTable[CreateKey(item)];
  31. switch (item.Disposition_) {
  32. case EDisposition::INLINE:
  33. block.Data = item.Content_;
  34. block.Type = EUserDataType::RAW_INLINE_DATA;
  35. break;
  36. case EDisposition::RESOURCE:
  37. case EDisposition::RESOURCE_FILE:
  38. block.Data = NResource::Find(item.Content_);
  39. block.Type = EUserDataType::RAW_INLINE_DATA;
  40. break;
  41. case EDisposition::FILESYSTEM:
  42. block.Data = item.Content_;
  43. block.Type = EUserDataType::PATH;
  44. break;
  45. case EDisposition::URL:
  46. block.Data = item.Content_;
  47. block.Type = EUserDataType::URL;
  48. break;
  49. default:
  50. ythrow yexception() << "Unknown disposition for user data \"" << item.Name_ << "\": " << item.Disposition_;
  51. }
  52. switch (item.Type_) {
  53. case EType::LIBRARY:
  54. block.Usage.Set(EUserDataBlockUsage::Library, true);
  55. break;
  56. case EType::FILE:
  57. block.Usage.Set(EUserDataBlockUsage::Content, true);
  58. break;
  59. case EType::UDF:
  60. block.Usage.Set(EUserDataBlockUsage::Udf, true);
  61. break;
  62. default:
  63. ythrow yexception() << "Unknown type for user data \"" << item.Name_ << "\": " << item.Type_;
  64. }
  65. if (item.Type_ == EType::LIBRARY) {
  66. switch (item.Disposition_) {
  67. case EDisposition::INLINE:
  68. case EDisposition::RESOURCE:
  69. case EDisposition::RESOURCE_FILE:
  70. case EDisposition::FILESYSTEM: {
  71. if (item.Disposition_ == EDisposition::FILESYSTEM) {
  72. TFsPath path(block.Data);
  73. if (path.Exists() && path.IsFile()) {
  74. TFileInput input(path);
  75. block.Data = input.ReadAll();
  76. } else {
  77. ythrow yexception() << "File for user data \"" << item.Name_ << "\" does not exist: " << block.Data;
  78. }
  79. block.Type = EUserDataType::RAW_INLINE_DATA;
  80. }
  81. } break;
  82. default:
  83. ythrow yexception() << item.Disposition_ << " disposition is not yet supported for libraries (specified for \"" << item.Name_ << "\")";
  84. }
  85. }
  86. }
  87. }
  88. void LoadYqlDefaultMounts(TUserDataTable& userData) {
  89. AddLibraryFromResource(userData, "/lib/yql/aggregate.yqls");
  90. AddLibraryFromResource(userData, "/lib/yql/window.yqls");
  91. AddLibraryFromResource(userData, "/lib/yql/id.yqls");
  92. AddLibraryFromResource(userData, "/lib/yql/sqr.yqls");
  93. AddLibraryFromResource(userData, "/lib/yql/core.yqls");
  94. AddLibraryFromResource(userData, "/lib/yql/walk_folders.yqls");
  95. }
  96. TUserDataTable GetYqlModuleResolverImpl(
  97. TExprContext* rawCtx,
  98. IModuleResolver::TPtr& moduleResolver,
  99. const TVector<NUserData::TUserData>& userData,
  100. const THashMap<TString, TString>& clusterMapping,
  101. const THashSet<TString>& sqlFlags,
  102. bool optimizeLibraries,
  103. THolder<TExprContext> ownedCtx)
  104. {
  105. YQL_PROFILE_FUNC(DEBUG);
  106. auto ctx = rawCtx ? rawCtx : ownedCtx.Get();
  107. Y_ENSURE(ctx);
  108. TUserDataTable mounts;
  109. LoadYqlDefaultMounts(mounts);
  110. TModulesTable modulesTable;
  111. if (!CompileLibraries(mounts, *ctx, modulesTable, optimizeLibraries)) {
  112. return {};
  113. }
  114. for (const auto& item : userData) {
  115. AddUserDataToTable(mounts, item);
  116. }
  117. moduleResolver = std::make_shared<TModuleResolver>(std::move(modulesTable), ctx->NextUniqueId,
  118. clusterMapping, sqlFlags, optimizeLibraries, std::move(ownedCtx));
  119. return mounts;
  120. }
  121. TUserDataTable GetYqlModuleResolver(
  122. TExprContext& ctx,
  123. IModuleResolver::TPtr& moduleResolver,
  124. const TVector<NUserData::TUserData>& userData,
  125. const THashMap<TString, TString>& clusterMapping,
  126. const THashSet<TString>& sqlFlags,
  127. bool optimizeLibraries) {
  128. return GetYqlModuleResolverImpl(&ctx, moduleResolver, userData, clusterMapping, sqlFlags, optimizeLibraries, nullptr);
  129. }
  130. bool GetYqlDefaultModuleResolver(
  131. TExprContext& ctx,
  132. IModuleResolver::TPtr& moduleResolver,
  133. const THashMap<TString, TString>& clusterMapping,
  134. bool optimizeLibraries) {
  135. return !GetYqlModuleResolverImpl(&ctx, moduleResolver, {}, clusterMapping, {}, optimizeLibraries, nullptr).empty();
  136. }
  137. bool GetYqlDefaultModuleResolverWithContext(
  138. IModuleResolver::TPtr& moduleResolver,
  139. const THashMap<TString, TString>& clusterMapping,
  140. bool optimizeLibraries) {
  141. return !GetYqlModuleResolverImpl(nullptr, moduleResolver, {}, clusterMapping, {}, optimizeLibraries, MakeHolder<TExprContext>()).empty();
  142. }
  143. }