yql_provider_mkql.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #pragma once
  2. #include "yql_type_mkql.h"
  3. #include <yql/essentials/ast/yql_expr.h>
  4. #include <yql/essentials/minikql/mkql_node.h>
  5. #include <yql/essentials/minikql/mkql_program_builder.h>
  6. namespace NYql {
  7. namespace NCommon {
  8. class IMkqlCallableCompiler;
  9. struct TMkqlBuildContext {
  10. using TArgumentsMap = TNodeMap<NKikimr::NMiniKQL::TRuntimeNode>;
  11. using TMemoizedNodesMap = TArgumentsMap;
  12. const IMkqlCallableCompiler& MkqlCompiler;
  13. NKikimr::NMiniKQL::TProgramBuilder& ProgramBuilder;
  14. TExprContext& ExprCtx;
  15. TMemoizedNodesMap Memoization;
  16. TMemoizedTypesMap TypeMemoizationHolder;
  17. TMemoizedTypesMap* TypeMemoization;
  18. TMkqlBuildContext *const ParentCtx = nullptr;
  19. const size_t Level = 0ULL;
  20. const ui64 LambdaId = 0ULL;
  21. NKikimr::NMiniKQL::TRuntimeNode Parameters;
  22. TMkqlBuildContext(const IMkqlCallableCompiler& mkqlCompiler, NKikimr::NMiniKQL::TProgramBuilder& builder, TExprContext& exprCtx, ui64 lambdaId = 0ULL, TArgumentsMap&& args = {}, TMemoizedTypesMap* typeMemoization = nullptr)
  23. : MkqlCompiler(mkqlCompiler)
  24. , ProgramBuilder(builder)
  25. , ExprCtx(exprCtx)
  26. , Memoization(std::move(args))
  27. , TypeMemoization(typeMemoization ? typeMemoization : &TypeMemoizationHolder)
  28. , LambdaId(lambdaId)
  29. {}
  30. TMkqlBuildContext(TMkqlBuildContext& parent, TArgumentsMap&& args, ui64 lambdaId)
  31. : MkqlCompiler(parent.MkqlCompiler)
  32. , ProgramBuilder(parent.ProgramBuilder)
  33. , ExprCtx(parent.ExprCtx)
  34. , Memoization(std::move(args))
  35. , TypeMemoization(parent.TypeMemoization)
  36. , ParentCtx(&parent)
  37. , Level(parent.Level + 1U)
  38. , LambdaId(lambdaId)
  39. , Parameters(parent.Parameters)
  40. {}
  41. NKikimr::NMiniKQL::TType* BuildType(const TExprNode& owner, const TTypeAnnotationNode& annotation) {
  42. return NYql::NCommon::BuildType(owner, annotation, ProgramBuilder, *TypeMemoization);
  43. }
  44. };
  45. class IMkqlCallableCompiler : public TThrRefBase {
  46. public:
  47. typedef std::function<NKikimr::NMiniKQL::TRuntimeNode(const TExprNode&, TMkqlBuildContext&)> TCompiler;
  48. virtual bool HasCallable(const std::string_view& name) const = 0;
  49. virtual TCompiler FindCallable(const std::string_view& name) const = 0;
  50. virtual TCompiler GetCallable(const std::string_view& name) const = 0;
  51. virtual ~IMkqlCallableCompiler() {}
  52. };
  53. class TMkqlCallableCompilerBase : public IMkqlCallableCompiler {
  54. public:
  55. bool HasCallable(const std::string_view& name) const override;
  56. TCompiler FindCallable(const std::string_view& name) const override;
  57. TCompiler GetCallable(const std::string_view& name) const override;
  58. virtual void AddCallable(const std::string_view& name, TCompiler compiler);
  59. virtual void AddCallable(const std::initializer_list<std::string_view>& names, TCompiler compiler);
  60. virtual void ChainCallable(const std::string_view& name, TCompiler compiler);
  61. virtual void ChainCallable(const std::initializer_list<std::string_view>& names, TCompiler compiler);
  62. virtual void OverrideCallable(const std::string_view& name, TCompiler compiler);
  63. private:
  64. THashMap<TString, TCompiler> Callables;
  65. protected:
  66. void AddSimpleCallables(const std::initializer_list<std::pair<std::string_view, NKikimr::NMiniKQL::TProgramBuilder::UnaryFunctionMethod>>& callables);
  67. void AddSimpleCallables(const std::initializer_list<std::pair<std::string_view, NKikimr::NMiniKQL::TProgramBuilder::BinaryFunctionMethod>>& callables);
  68. void AddSimpleCallables(const std::initializer_list<std::pair<std::string_view, NKikimr::NMiniKQL::TProgramBuilder::TernaryFunctionMethod>>& callables);
  69. void AddSimpleCallables(const std::initializer_list<std::pair<std::string_view, NKikimr::NMiniKQL::TProgramBuilder::ArrayFunctionMethod>>& callables);
  70. void AddSimpleCallables(const std::initializer_list<std::pair<std::string_view, NKikimr::NMiniKQL::TProgramBuilder::ProcessFunctionMethod>>& callables);
  71. void AddSimpleCallables(const std::initializer_list<std::pair<std::string_view, NKikimr::NMiniKQL::TProgramBuilder::NarrowFunctionMethod>>& callables);
  72. };
  73. class TMkqlCommonCallableCompiler : public TMkqlCallableCompilerBase {
  74. public:
  75. bool HasCallable(const std::string_view& name) const override;
  76. TCompiler FindCallable(const std::string_view& name) const override;
  77. TCompiler GetCallable(const std::string_view& name) const override;
  78. void AddCallable(const std::string_view& name, TCompiler compiler) override;
  79. void AddCallable(const std::initializer_list<std::string_view>& names, TCompiler compiler) override;
  80. void OverrideCallable(const std::string_view& name, TCompiler compiler) override;
  81. private:
  82. class TShared : public TMkqlCallableCompilerBase {
  83. public:
  84. TShared();
  85. };
  86. const TShared& GetShared() const {
  87. return *Singleton<TShared>();
  88. }
  89. };
  90. NKikimr::NMiniKQL::TRuntimeNode CombineByKeyImpl(const TExprNode& node, TMkqlBuildContext& ctx);
  91. NKikimr::NMiniKQL::TRuntimeNode MkqlBuildExpr(const TExprNode& node, TMkqlBuildContext& ctx);
  92. NKikimr::NMiniKQL::TRuntimeNode MkqlBuildLambda(const TExprNode& lambda, TMkqlBuildContext& ctx, const NKikimr::NMiniKQL::TRuntimeNode::TList& args);
  93. NKikimr::NMiniKQL::TRuntimeNode::TList MkqlBuildWideLambda(const TExprNode& lambda, TMkqlBuildContext& ctx, const NKikimr::NMiniKQL::TRuntimeNode::TList& args);
  94. } // namespace NCommon
  95. } // namespace NYql