match_recognize.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #pragma once
  2. #include "node.h"
  3. #include <yql/essentials/core/sql_types/match_recognize.h>
  4. #include <util/generic/ptr.h>
  5. namespace NSQLTranslationV1 {
  6. struct TNamedFunction {
  7. TNodePtr callable; //Callable with some free args
  8. TString name;
  9. };
  10. enum class ERowsPerMatch {
  11. OneRow,
  12. AllRows
  13. };
  14. class TMatchRecognizeBuilder: public TSimpleRefCount<TMatchRecognizeBuilder> {
  15. public:
  16. TMatchRecognizeBuilder(
  17. TPosition clausePos,
  18. std::pair<TPosition, TVector<TNamedFunction>>&& partitioners,
  19. std::pair<TPosition, TVector<TSortSpecificationPtr>>&& sortSpecs,
  20. std::pair<TPosition, TVector<TNamedFunction>>&& measures,
  21. std::pair<TPosition, ERowsPerMatch>&& rowsPerMatch,
  22. std::pair<TPosition, NYql::NMatchRecognize::TAfterMatchSkipTo>&& skipTo,
  23. std::pair<TPosition, NYql::NMatchRecognize::TRowPattern>&& pattern,
  24. std::pair<TPosition, TNodePtr>&& subset,
  25. std::pair<TPosition, TVector<TNamedFunction>>&& definitions
  26. )
  27. : Pos(clausePos)
  28. , Partitioners(std::move(partitioners))
  29. , SortSpecs(std::move(sortSpecs))
  30. , Measures(std::move(measures))
  31. , RowsPerMatch(std::move(rowsPerMatch))
  32. , SkipTo(std::move(skipTo))
  33. , Pattern(std::move(pattern))
  34. , Subset(std::move(subset))
  35. , Definitions(definitions)
  36. {}
  37. TNodePtr Build(TContext& ctx, TString&& inputTable, ISource* source);
  38. private:
  39. TPosition Pos;
  40. std::pair<TPosition, TVector<TNamedFunction>> Partitioners;
  41. std::pair<TPosition, TVector<TSortSpecificationPtr>> SortSpecs;
  42. std::pair<TPosition, TVector<TNamedFunction>> Measures;
  43. std::pair<TPosition, ERowsPerMatch> RowsPerMatch;
  44. std::pair<TPosition, NYql::NMatchRecognize::TAfterMatchSkipTo> SkipTo;
  45. std::pair<TPosition, NYql::NMatchRecognize::TRowPattern> Pattern;
  46. std::pair<TPosition, TNodePtr> Subset;
  47. std::pair<TPosition, TVector<TNamedFunction>> Definitions;
  48. };
  49. using TMatchRecognizeBuilderPtr=TIntrusivePtr<TMatchRecognizeBuilder> ;
  50. class TMatchRecognizeVarAccessNode: public INode {
  51. public:
  52. TMatchRecognizeVarAccessNode(TPosition pos, const TString& var, const TString& column, bool theSameVar)
  53. : INode(pos)
  54. , Var(var)
  55. , TheSameVar(theSameVar)
  56. , Column(column)
  57. {
  58. }
  59. TString GetVar() const {
  60. return Var;
  61. }
  62. bool IsTheSameVar() const {
  63. return TheSameVar;
  64. }
  65. TString GetColumn() const {
  66. return Column;
  67. }
  68. bool DoInit(TContext& ctx, ISource* src) override;
  69. TAstNode* Translate(TContext& ctx) const override {
  70. return Node->Translate(ctx);
  71. }
  72. TPtr DoClone() const override {
  73. YQL_ENSURE(!Node, "TMatchRecognizeVarAccessNode::Clone: Node must not be initialized");
  74. auto copy = new TMatchRecognizeVarAccessNode(Pos, Var, Column, TheSameVar);
  75. return copy;
  76. }
  77. protected:
  78. void DoUpdateState() const override {
  79. YQL_ENSURE(Node);
  80. }
  81. void DoVisitChildren(const TVisitFunc& func, TVisitNodeSet& visited) const final {
  82. Y_DEBUG_ABORT_UNLESS(Node);
  83. Node->VisitTree(func, visited);
  84. }
  85. private:
  86. TNodePtr Node;
  87. const TString Var;
  88. const bool TheSameVar; //reference the same var as being defined by this expression;
  89. const TString Column;
  90. };
  91. class TMatchRecognizeNavigate: public TAstListNode {
  92. public:
  93. TMatchRecognizeNavigate(TPosition pos, const TString& name, const TVector<TNodePtr>& args)
  94. : TAstListNode(pos)
  95. , Name(name)
  96. , Args(args)
  97. {
  98. }
  99. private:
  100. TNodePtr DoClone() const override {
  101. return new TMatchRecognizeNavigate(GetPos(), Name, CloneContainer(Args));
  102. }
  103. bool DoInit(TContext& ctx, ISource* src) override;
  104. private:
  105. const TString Name;
  106. const TVector<TNodePtr> Args;
  107. };
  108. } // namespace NSQLTranslationV1