#pragma once #include "sql_translation.h" #include namespace NSQLTranslationV1 { using namespace NSQLv1Generated; class TSqlSelect: public TSqlTranslation { public: TSqlSelect(TContext& ctx, NSQLTranslation::ESqlMode mode) : TSqlTranslation(ctx, mode) { } TSourcePtr Build(const TRule_select_stmt& node, TPosition& selectPos); TSourcePtr Build(const TRule_select_unparenthesized_stmt& node, TPosition& selectPos); private: bool SelectTerm(TVector& terms, const TRule_result_column& node); bool ValidateSelectColumns(const TVector& terms); bool ColumnName(TVector& keys, const TRule_column_name& node); bool ColumnName(TVector& keys, const TRule_without_column_name& node); template bool ColumnList(TVector& keys, const TRule& node); bool NamedColumn(TVector& columnList, const TRule_named_column& node); TSourcePtr SingleSource(const TRule_single_source& node, const TVector& derivedColumns, TPosition derivedColumnsPos, bool unorderedSubquery); TSourcePtr NamedSingleSource(const TRule_named_single_source& node, bool unorderedSubquery); bool FlattenByArg(const TString& sourceLabel, TVector& flattenByColumns, TVector& flattenByExprs, const TRule_flatten_by_arg& node); TSourcePtr FlattenSource(const TRule_flatten_source& node); TSourcePtr JoinSource(const TRule_join_source& node); bool JoinOp(ISource* join, const TRule_join_source::TBlock3& block, TMaybe anyPos); TNodePtr JoinExpr(ISource*, const TRule_join_constraint& node); TSourcePtr ProcessCore(const TRule_process_core& node, const TWriteSettings& settings, TPosition& selectPos); TSourcePtr ReduceCore(const TRule_reduce_core& node, const TWriteSettings& settings, TPosition& selectPos); struct TSelectKindPlacement { bool IsFirstInSelectOp = false; bool IsLastInSelectOp = false; }; TSourcePtr SelectCore(const TRule_select_core& node, const TWriteSettings& settings, TPosition& selectPos, TMaybe placement, TVector& selectOpOrederBy, bool& selectOpAssumeOrderBy); bool WindowDefinition(const TRule_window_definition& node, TWinSpecs& winSpecs); bool WindowClause(const TRule_window_clause& node, TWinSpecs& winSpecs); struct TSelectKindResult { TSourcePtr Source; TWriteSettings Settings; TVector SelectOpOrderBy; bool SelectOpAssumeOrderBy = false; TNodePtr SelectOpSkipTake; inline explicit operator bool() const { return static_cast(Source); } }; bool ValidateLimitOrderByWithSelectOp(TMaybe placement, TStringBuf what); bool NeedPassLimitOrderByToUnderlyingSelect(TMaybe placement); template TSourcePtr Build(const TRule& node, TPosition pos, TSelectKindResult&& first); TSelectKindResult SelectKind(const TRule_select_kind& node, TPosition& selectPos, TMaybe placement); TSelectKindResult SelectKind(const TRule_select_kind_partial& node, TPosition& selectPos, TMaybe placement); TSelectKindResult SelectKind(const TRule_select_kind_parenthesis& node, TPosition& selectPos, TMaybe placement); }; } //namespace NSQLTranslationV1