summaryrefslogtreecommitdiffstats
path: root/yql/essentials/core/yql_window_frame_setting_bound.h
blob: a22b2cf1e65a1fc2db9aef628cc3522a2df654b2 (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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#pragma once

#include <yql/essentials/core/expr_nodes/yql_expr_nodes.h>
#include <yql/essentials/core/yql_node_transform.h>
#include <yql/essentials/core/sql_types/window_number_and_direction.h>

#include <util/generic/hash.h>

#include <utility>

namespace NYql {

class TWindowFrameSettingWithOffset {
public:
    TWindowFrameSettingWithOffset(TExprNode::TPtr frameBound,
                                  TMaybe<TNodeTransform> columnCast,
                                  TMaybe<TNodeTransform> boundCast,
                                  TMaybe<ui32> procId)
        : FrameBound_(std::move(frameBound))
        , ColumnCast_(std::move(columnCast))
        , BoundCast_(std::move(boundCast))
        , ProcId_(std::move(procId))
    {
    }

    const TExprNode::TPtr& GetFrameBound() const {
        return FrameBound_;
    }

    const TMaybe<TNodeTransform>& GetColumnCast() const {
        return ColumnCast_;
    }

    const TMaybe<TNodeTransform>& GetBoundCast() const {
        return BoundCast_;
    }

    const TMaybe<ui32>& GetProcId() const {
        return ProcId_;
    }

private:
    TExprNode::TPtr FrameBound_;
    TExprNode::TPtr OriginalFrameBound_;
    TMaybe<TNodeTransform> ColumnCast_;
    TMaybe<TNodeTransform> BoundCast_;
    TMaybe<ui32> ProcId_;
};

template <typename TValueHasher = THash<TExprNode::TPtr>>
class TWindowFrameSettingOriginalBoundHash {
public:
    explicit TWindowFrameSettingOriginalBoundHash(TValueHasher hasher = TValueHasher{})
        : Hasher_(std::move(hasher))
    {
    }

    size_t operator()(const TWindowFrameSettingWithOffset& value) const {
        return Hasher_(value.GetFrameBound());
    }

private:
    TValueHasher Hasher_;
};

template <typename TValueComparator = TEqualTo<TExprNode::TPtr>>
class TWindowFrameSettingOriginalBoundComparator {
public:
    explicit TWindowFrameSettingOriginalBoundComparator(TValueComparator comparator = TValueComparator{})
        : Comparator_(comparator)
    {
    }

    bool operator()(const TWindowFrameSettingWithOffset& left, const TWindowFrameSettingWithOffset& right) const {
        return Comparator_(left.GetFrameBound(), right.GetFrameBound());
    }

private:
    TValueComparator Comparator_;
};

using TWindowFrameSettingBound = NWindow::TNumberAndDirection<TWindowFrameSettingWithOffset>;

} // namespace NYql