#pragma once #include #include namespace NSQLComplete { enum class EObjectKind { Folder, Table, Unknown, }; enum class ENodeKind { Any, Table, }; struct TTableId { TString Cluster; TString Path; friend bool operator<(const TTableId& lhs, const TTableId& rhs); friend bool operator==(const TTableId& lhs, const TTableId& rhs) = default; }; template requires std::regular && requires(T x) { {x < x} -> std::convertible_to; } struct TAliased: T { TString Alias; TAliased(TString alias, T value) : T(std::move(value)) , Alias(std::move(alias)) { } TAliased(T value) // NOLINT(google-explicit-constructor) : T(std::move(value)) { } friend bool operator<(const TAliased& lhs, const TAliased& rhs) { return std::tie(lhs.Alias, static_cast(lhs)) < std::tie(rhs.Alias, static_cast(rhs)); } friend bool operator==(const TAliased& lhs, const TAliased& rhs) = default; }; struct TColumnId { TString TableAlias; TString Name; friend bool operator<(const TColumnId& lhs, const TColumnId& rhs); friend bool operator==(const TColumnId& lhs, const TColumnId& rhs) = default; }; TString NormalizeName(TStringBuf name); } // namespace NSQLComplete template <> struct THash { inline size_t operator()(const NSQLComplete::TTableId& x) const { return THash>()(std::tie(x.Cluster, x.Path)); } };