#pragma once #include "match_recognize.h" #include "node.h" #include "sql_translation.h" namespace NSQLTranslationV1 { class TSqlMatchRecognizeClause final : public TSqlTranslation { public: TSqlMatchRecognizeClause(TContext& ctx, NSQLTranslation::ESqlMode mode); TMatchRecognizeBuilderPtr CreateBuilder(const TRule_row_pattern_recognition_clause& node); static constexpr size_t MaxPatternNesting = 20; static constexpr size_t MaxPermutedItems = 6; private: std::tuple ParsePartitionBy(TPosition pos, const TRule_window_partition_clause* node); TMaybe> ParseOrderBy(const TRule_order_by_clause* node); TNamedFunction ParseOneMeasure(const TRule_row_pattern_measure_definition& node); TVector ParseMeasures(const TRule_row_pattern_measure_list* node); TNodePtr ParseRowsPerMatch(TPosition pos, const TRule_row_pattern_rows_per_match* node); TNodePtr ParseAfterMatchSkipTo(TPosition pos, const TRule_row_pattern_skip_to* node); TNodePtr BuildPatternFactor(TPosition pos, TNodePtr primary, std::tuple quantifier); TNodePtr ParsePatternFactor(TPosition pos, const TRule_row_pattern_factor& node, size_t nestingLevel, bool output); TNodePtr BuildPatternTerm(TPosition pos, std::vector term); TNodePtr ParsePatternTerm(TPosition pos, const TRule_row_pattern_term& node, size_t nestingLevel, bool output); TNodePtr BuildPattern(TPosition pos, std::vector pattern); TNodePtr ParsePattern(TPosition pos, const TRule_row_pattern& node, size_t nestingLevel, bool output); TMaybe ParseSubset(TPosition pos, const TRule_row_pattern_subset_clause* node); TNamedFunction ParseOneDefinition(const TRule_row_pattern_definition& node); TVector ParseDefinitions(const TRule_row_pattern_definition_list& node); private: THashSet PatternVarNames; TNodePtr PatternVars; }; } // namespace NSQLTranslationV1