#pragma once #include #include #include #include #include namespace NYql { class TWindowFrameSettingWithOffset { public: TWindowFrameSettingWithOffset(TExprNode::TPtr frameBound, TMaybe columnCast, TMaybe boundCast, TMaybe 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& GetColumnCast() const { return ColumnCast_; } const TMaybe& GetBoundCast() const { return BoundCast_; } const TMaybe& GetProcId() const { return ProcId_; } private: TExprNode::TPtr FrameBound_; TExprNode::TPtr OriginalFrameBound_; TMaybe ColumnCast_; TMaybe BoundCast_; TMaybe ProcId_; }; template > 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 > 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; } // namespace NYql