yql_provider.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #pragma once
  2. #include <yql/essentials/ast/yql_expr.h>
  3. #include <yql/essentials/core/yql_data_provider.h>
  4. #include <yql/essentials/core/yql_graph_transformer.h>
  5. #include <yql/essentials/core/yql_expr_optimize.h>
  6. #include <yql/essentials/core/yql_expr_type_annotation.h>
  7. #include <yql/essentials/core/expr_nodes/yql_expr_nodes.h>
  8. #include <library/cpp/yson/writer.h>
  9. #include <util/generic/hash_set.h>
  10. #include <util/generic/string.h>
  11. #include <util/generic/strbuf.h>
  12. #include <utility>
  13. namespace NYson {
  14. class TYsonWriter;
  15. }
  16. namespace NKikimr {
  17. namespace NMiniKQL {
  18. class IFunctionRegistry;
  19. }
  20. }
  21. namespace NYql {
  22. struct TTypeAnnotationContext;
  23. struct TOperationStatistics;
  24. namespace NCommon {
  25. constexpr TStringBuf PgCatalogFileName = "_yql_pg_catalog";
  26. struct TWriteTableSettings {
  27. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  28. NNodes::TMaybeNode<NNodes::TCoAtom> Temporary;
  29. NNodes::TMaybeNode<NNodes::TExprList> Columns;
  30. NNodes::TMaybeNode<NNodes::TExprList> ReturningList;
  31. NNodes::TMaybeNode<NNodes::TCoAtomList> PrimaryKey;
  32. NNodes::TMaybeNode<NNodes::TCoAtomList> PartitionBy;
  33. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> OrderBy;
  34. NNodes::TMaybeNode<NNodes::TCoLambda> Filter;
  35. NNodes::TMaybeNode<NNodes::TCoLambda> Update;
  36. NNodes::TMaybeNode<NNodes::TCoIndexList> Indexes;
  37. NNodes::TMaybeNode<NNodes::TCoChangefeedList> Changefeeds;
  38. NNodes::TCoNameValueTupleList Other;
  39. NNodes::TMaybeNode<NNodes::TExprList> ColumnFamilies;
  40. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> ColumnsDefaultValues;
  41. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> TableSettings;
  42. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> AlterActions;
  43. NNodes::TMaybeNode<NNodes::TCoAtom> TableType;
  44. NNodes::TMaybeNode<NNodes::TCallable> PgFilter;
  45. TWriteTableSettings(const NNodes::TCoNameValueTupleList& other)
  46. : Other(other) {}
  47. };
  48. struct TWriteSequenceSettings {
  49. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  50. NNodes::TMaybeNode<NNodes::TCoAtom> ValueType;
  51. NNodes::TMaybeNode<NNodes::TCoAtom> Temporary;
  52. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> SequenceSettings;
  53. NNodes::TCoNameValueTupleList Other;
  54. TWriteSequenceSettings(const NNodes::TCoNameValueTupleList& other)
  55. : Other(other) {}
  56. };
  57. struct TWriteTopicSettings {
  58. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  59. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> TopicSettings;
  60. NNodes::TMaybeNode<NNodes::TCoTopicConsumerList> Consumers;
  61. NNodes::TMaybeNode<NNodes::TCoTopicConsumerList> AddConsumers;
  62. NNodes::TMaybeNode<NNodes::TCoTopicConsumerList> AlterConsumers;
  63. NNodes::TMaybeNode<NNodes::TCoAtomList> DropConsumers;
  64. NNodes::TCoNameValueTupleList Other;
  65. TWriteTopicSettings(const NNodes::TCoNameValueTupleList& other)
  66. : Other(other)
  67. {}
  68. };
  69. struct TWriteReplicationSettings {
  70. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  71. NNodes::TMaybeNode<NNodes::TCoReplicationTargetList> Targets;
  72. NNodes::TMaybeNode<NNodes::TCoNameValueTupleList> ReplicationSettings;
  73. NNodes::TCoNameValueTupleList Other;
  74. TWriteReplicationSettings(const NNodes::TCoNameValueTupleList& other)
  75. : Other(other)
  76. {}
  77. };
  78. struct TWriteRoleSettings {
  79. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  80. NNodes::TMaybeNode<NNodes::TCoAtomList> Roles;
  81. NNodes::TMaybeNode<NNodes::TCoAtom> NewName;
  82. NNodes::TCoNameValueTupleList Other;
  83. TWriteRoleSettings(const NNodes::TCoNameValueTupleList& other)
  84. : Other(other) {}
  85. };
  86. struct TWritePermissionSettings {
  87. NNodes::TMaybeNode<NNodes::TCoAtomList> Permissions;
  88. NNodes::TMaybeNode<NNodes::TCoAtomList> Paths;
  89. NNodes::TMaybeNode<NNodes::TCoAtomList> RoleNames;
  90. TWritePermissionSettings(NNodes::TMaybeNode<NNodes::TCoAtomList>&& permissions, NNodes::TMaybeNode<NNodes::TCoAtomList>&& paths, NNodes::TMaybeNode<NNodes::TCoAtomList>&& roleNames)
  91. : Permissions(std::move(permissions))
  92. , Paths(std::move(paths))
  93. , RoleNames(std::move(roleNames)) {}
  94. };
  95. struct TWriteObjectSettings {
  96. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  97. NNodes::TCoNameValueTupleList Features;
  98. NNodes::TCoAtomList ResetFeatures;
  99. TWriteObjectSettings(NNodes::TMaybeNode<NNodes::TCoAtom>&& mode, NNodes::TCoNameValueTupleList&& kvFeatures, NNodes::TCoAtomList&& resetFeatures)
  100. : Mode(std::move(mode))
  101. , Features(std::move(kvFeatures))
  102. , ResetFeatures(std::move(resetFeatures))
  103. {
  104. }
  105. };
  106. struct TCommitSettings
  107. {
  108. TPositionHandle Pos;
  109. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  110. NNodes::TMaybeNode<NNodes::TCoAtom> Epoch;
  111. NNodes::TCoNameValueTupleList Other;
  112. TCommitSettings(NNodes::TCoNameValueTupleList other)
  113. : Other(other) {}
  114. NNodes::TCoNameValueTupleList BuildNode(TExprContext& ctx) const;
  115. bool EnsureModeEmpty(TExprContext& ctx);
  116. bool EnsureEpochEmpty(TExprContext& ctx);
  117. bool EnsureOtherEmpty(TExprContext& ctx);
  118. };
  119. struct TPgObjectSettings
  120. {
  121. NNodes::TMaybeNode<NNodes::TCoAtom> Mode;
  122. NNodes::TMaybeNode<NNodes::TCoAtom> IfExists;
  123. TPgObjectSettings(NNodes::TMaybeNode<NNodes::TCoAtom>&& mode, NNodes::TMaybeNode<NNodes::TCoAtom>&& ifExists)
  124. : Mode(std::move(mode))
  125. , IfExists(std::move(ifExists)) {}
  126. };
  127. const TStructExprType* BuildCommonTableListType(TExprContext& ctx);
  128. TExprNode::TPtr BuildTypeExpr(TPositionHandle pos, const TTypeAnnotationNode& ann, TExprContext& ctx);
  129. bool HasResOrPullOption(const TExprNode& node, const TStringBuf& option);
  130. TVector<TString> GetResOrPullColumnHints(const TExprNode& node);
  131. TWriteTableSettings ParseWriteTableSettings(NNodes::TExprList node, TExprContext& ctx);
  132. TWriteTopicSettings ParseWriteTopicSettings(NNodes::TExprList node, TExprContext& ctx);
  133. TWriteReplicationSettings ParseWriteReplicationSettings(NNodes::TExprList node, TExprContext& ctx);
  134. TWriteRoleSettings ParseWriteRoleSettings(NNodes::TExprList node, TExprContext& ctx);
  135. TWriteObjectSettings ParseWriteObjectSettings(NNodes::TExprList node, TExprContext& ctx);
  136. TWritePermissionSettings ParseWritePermissionsSettings(NNodes::TExprList node, TExprContext& ctx);
  137. TCommitSettings ParseCommitSettings(NNodes::TCoCommit node, TExprContext& ctx);
  138. TPgObjectSettings ParsePgObjectSettings(NNodes::TExprList node, TExprContext& ctx);
  139. TWriteSequenceSettings ParseSequenceSettings(NNodes::TExprList node, TExprContext& ctx);
  140. TString FullTableName(const TStringBuf& cluster, const TStringBuf& table);
  141. IDataProvider::TFillSettings GetFillSettings(const TExprNode& node);
  142. NYson::EYsonFormat GetYsonFormat(const IDataProvider::TFillSettings& fillSettings);
  143. TVector<TString> GetStructFields(const TTypeAnnotationNode* type);
  144. void TransformerStatsToYson(const TString& name, const IGraphTransformer::TStatistics& stats, NYson::TYsonWriter& writer);
  145. TString TransformerStatsToYson(const IGraphTransformer::TStatistics& stats, NYson::EYsonFormat format
  146. = NYson::EYsonFormat::Pretty);
  147. void FillSecureParams(const TExprNode::TPtr& node, const TTypeAnnotationContext& types, THashMap<TString, TString>& secureParams);
  148. bool FillUsedFiles(const TExprNode& node, TUserDataTable& files, const TTypeAnnotationContext& types, TExprContext& ctx, const TUserDataTable& crutches = {});
  149. std::pair<IGraphTransformer::TStatus, TAsyncTransformCallbackFuture> FreezeUsedFiles(const TExprNode& node, TUserDataTable& files, const TTypeAnnotationContext& types, TExprContext& ctx, const std::function<bool(const TString&)>& urlDownloadFilter, const TUserDataTable& crutches = {});
  150. bool FreezeUsedFilesSync(const TExprNode& node, TUserDataTable& files, const TTypeAnnotationContext& types, TExprContext& ctx, const std::function<bool(const TString&)>& urlDownloadFilter);
  151. void WriteColumns(NYson::TYsonWriter& writer, const NNodes::TExprBase& columns);
  152. TString SerializeExpr(TExprContext& ctx, const TExprNode& expr, bool withTypes = false);
  153. TString ExprToPrettyString(TExprContext& ctx, const TExprNode& expr);
  154. void WriteStream(NYson::TYsonWriter& writer, const TExprNode* node, const TExprNode* source);
  155. void WriteStreams(NYson::TYsonWriter& writer, TStringBuf name, const NNodes::TCoLambda& lambda);
  156. double GetDataReplicationFactor(const TExprNode& lambda, TExprContext& ctx);
  157. void WriteStatistics(NYson::TYsonWriter& writer, bool totalOnly, const THashMap<ui32, TOperationStatistics>& statistics, bool addTotalKey = true, bool addExternalMap = true);
  158. void WriteStatistics(NYson::TYsonWriter& writer, const TOperationStatistics& statistics);
  159. bool ValidateCompressionForInput(std::string_view format, std::string_view compression, TExprContext& ctx);
  160. bool ValidateCompressionForOutput(std::string_view format, std::string_view compression, TExprContext& ctx);
  161. bool ValidateFormatForInput(std::string_view format, const TStructExprType* schemaStructRowType, const std::function<bool(TStringBuf)>& excludeFields, TExprContext& ctx);
  162. bool ValidateFormatForOutput(std::string_view format, TExprContext& ctx);
  163. bool ValidateIntervalUnit(std::string_view unit, TExprContext& ctx);
  164. bool ValidateDateTimeFormatName(std::string_view formatName, TExprContext& ctx);
  165. bool ValidateTimestampFormatName(std::string_view formatName, TExprContext& ctx);
  166. bool TransformPgSetItemOption(
  167. const NNodes::TCoPgSelect& pgSelect,
  168. TStringBuf optionName,
  169. std::function<void(const NNodes::TExprBase&)> lambda
  170. );
  171. TExprNode::TPtr GetSetItemOption(const NNodes::TCoPgSelect& pgSelect, TStringBuf optionName);
  172. TExprNode::TPtr GetSetItemOptionValue(const NNodes::TExprBase& setItemOption);
  173. bool NeedToRenamePgSelectColumns(const NNodes::TCoPgSelect& pgSelect);
  174. bool RenamePgSelectColumns(
  175. const NNodes::TCoPgSelect& node,
  176. TExprNode::TPtr& output,
  177. const TMaybe<TColumnOrder>& tableColumnOrder,
  178. TExprContext& ctx,
  179. TTypeAnnotationContext& types);
  180. } // namespace NCommon
  181. } // namespace NYql