#include #include #include #include #include #include namespace DB { size_t RowPolicyContext::Hash::operator()(const DatabaseAndTableNameRef & database_and_table_name) const { return std::hash{}(database_and_table_name.first) - std::hash{}(database_and_table_name.second); } RowPolicyContext::RowPolicyContext() : map_of_mixed_conditions(boost::make_shared()) { } RowPolicyContext::~RowPolicyContext() = default; RowPolicyContext::RowPolicyContext(const UUID & user_id_, const std::vector & enabled_roles_) : user_id(user_id_), enabled_roles(enabled_roles_) {} ASTPtr RowPolicyContext::getCondition(const String & database, const String & table_name, ConditionIndex index) const { /// We don't lock `mutex` here. auto loaded = map_of_mixed_conditions.load(); auto it = loaded->find({database, table_name}); if (it == loaded->end()) return {}; return it->second.mixed_conditions[index]; } ASTPtr RowPolicyContext::combineConditionsUsingAnd(const ASTPtr & lhs, const ASTPtr & rhs) { if (!lhs) return rhs; if (!rhs) return lhs; auto function = std::make_shared(); auto exp_list = std::make_shared(); function->name = "and"; function->arguments = exp_list; function->children.push_back(exp_list); exp_list->children.push_back(lhs); exp_list->children.push_back(rhs); return function; } std::vector RowPolicyContext::getCurrentPolicyIDs() const { /// We don't lock `mutex` here. auto loaded = map_of_mixed_conditions.load(); std::vector policy_ids; for (const auto & mixed_conditions : *loaded | boost::adaptors::map_values) boost::range::copy(mixed_conditions.policy_ids, std::back_inserter(policy_ids)); return policy_ids; } std::vector RowPolicyContext::getCurrentPolicyIDs(const String & database, const String & table_name) const { /// We don't lock `mutex` here. auto loaded = map_of_mixed_conditions.load(); auto it = loaded->find({database, table_name}); if (it == loaded->end()) return {}; return it->second.policy_ids; } }