summaryrefslogtreecommitdiffstats
path: root/yql/essentials/core/yql_opt_window_stream_transformers.h
blob: 9235729e9647b69eccd68767570b769814aeb2f7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#pragma once

#include <yql/essentials/ast/yql_expr.h>
#include <yql/essentials/core/sql_types/sort_order.h>
#include <yql/essentials/core/yql_window_frame_settings.h>

namespace NYql {

class TWindowSortedColumnPusher {
public:
    TWindowSortedColumnPusher(const TExprNode::TPtr& sortTraits, TExprContext& ctx, const TExprNode::TPtr& frames);

    std::pair<TStringBuf, TStringBuf> GetRangeSortedColumnNames(const TWindowFrameSettings::TRangeFrame& rangeFrame) const;

    TVector<TStringBuf> GetAllSortedColumnNames() const;

    bool ShouldAddSortedColumn() const;

    ESortOrder SortOrder() const;

    TExprNode::TPtr GetStreamWithSortedColumns(TExprNode::TPtr stream, TExprNode::TPtr sortKeySelector) const;
    TExprNode::TPtr ClearStreamFromSortedColumns(TExprNode::TPtr stream) const;

private:
    TExprNode::TPtr AddSortedColumnsToStream(TExprNode::TPtr stream, TExprNode::TPtr sortKeySelector) const;

    using TNodeToColumnNameAndNodeTransform = THashMap<TExprNode::TPtr, std::pair<TNodeTransform, TString>>;

    ESortOrder SortOrder_;
    TExprContext& Ctx_;
    TNodeToColumnNameAndNodeTransform MappedSortedColumnsToNames_;
    TMaybe<const TTypeAnnotationNode*> SortColumnType_;
};

} // namespace NYql