mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-11 08:52:06 +00:00
62 lines
1.9 KiB
C++
62 lines
1.9 KiB
C++
|
#include <Analyzer/IQueryTreeNode.h>
|
||
|
|
||
|
namespace DB
|
||
|
{
|
||
|
|
||
|
/** This structure holds query tree node ptr and its hash. It can be used as hash map key to avoid unnecessary hash
|
||
|
* recalculations.
|
||
|
*
|
||
|
* Example of usage:
|
||
|
* std::unordered_map<QueryTreeNodeConstRawPtrWithHash, std::string> map;
|
||
|
*/
|
||
|
template <typename QueryTreeNodePtrType>
|
||
|
struct QueryTreeNodeWithHash
|
||
|
{
|
||
|
QueryTreeNodeWithHash(QueryTreeNodePtrType node_) /// NOLINT
|
||
|
: node(std::move(node_))
|
||
|
, hash(node->getTreeHash().first)
|
||
|
{}
|
||
|
|
||
|
QueryTreeNodePtrType node = nullptr;
|
||
|
size_t hash = 0;
|
||
|
};
|
||
|
|
||
|
template <typename T>
|
||
|
inline bool operator==(const QueryTreeNodeWithHash<T> & lhs, const QueryTreeNodeWithHash<T> & rhs)
|
||
|
{
|
||
|
return lhs.hash == rhs.hash && lhs.node->isEqual(*rhs.node);
|
||
|
}
|
||
|
|
||
|
template <typename T>
|
||
|
inline bool operator!=(const QueryTreeNodeWithHash<T> & lhs, const QueryTreeNodeWithHash<T> & rhs)
|
||
|
{
|
||
|
return !(lhs == rhs);
|
||
|
}
|
||
|
|
||
|
using QueryTreeNodePtrWithHash = QueryTreeNodeWithHash<QueryTreeNodePtr>;
|
||
|
using QueryTreeNodeConstPtrWithHash = QueryTreeNodeWithHash<const QueryTreeNodePtr>;
|
||
|
|
||
|
using QueryTreeNodeRawPtrWithHash = QueryTreeNodeWithHash<IQueryTreeNode *>;
|
||
|
using QueryTreeNodeConstRawPtrWithHash = QueryTreeNodeWithHash<const IQueryTreeNode *>;
|
||
|
|
||
|
using QueryTreeNodeConstPtrWithHashSet = std::unordered_set<QueryTreeNodeConstPtrWithHash>;
|
||
|
|
||
|
using QueryTreeNodeConstRawPtrWithHashSet = std::unordered_set<QueryTreeNodeConstRawPtrWithHash>;
|
||
|
|
||
|
template <typename Value>
|
||
|
using QueryTreeNodeConstPtrWithHashMap = std::unordered_map<QueryTreeNodeConstPtrWithHash, Value>;
|
||
|
|
||
|
template <typename Value>
|
||
|
using QueryTreeNodeConstRawPtrWithHashMap = std::unordered_map<QueryTreeNodeConstRawPtrWithHash, Value>;
|
||
|
|
||
|
}
|
||
|
|
||
|
template <typename T>
|
||
|
struct std::hash<DB::QueryTreeNodeWithHash<T>>
|
||
|
{
|
||
|
size_t operator()(const DB::QueryTreeNodeWithHash<T> & node_with_hash) const
|
||
|
{
|
||
|
return node_with_hash.hash;
|
||
|
}
|
||
|
};
|