2020-03-07 17:37:38 +00:00
|
|
|
#include <Access/EnabledRowPolicies.h>
|
2020-04-08 21:10:00 +00:00
|
|
|
#include <Parsers/makeASTForLogicalFunction.h>
|
2019-11-17 11:57:02 +00:00
|
|
|
#include <boost/range/adaptor/map.hpp>
|
|
|
|
#include <boost/range/algorithm/copy.hpp>
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
2020-03-07 17:37:38 +00:00
|
|
|
size_t EnabledRowPolicies::Hash::operator()(const DatabaseAndTableNameRef & database_and_table_name) const
|
2019-11-17 11:57:02 +00:00
|
|
|
{
|
2020-02-12 23:59:49 +00:00
|
|
|
return std::hash<std::string_view>{}(database_and_table_name.first) - std::hash<std::string_view>{}(database_and_table_name.second);
|
2019-11-17 11:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-03-07 17:37:38 +00:00
|
|
|
EnabledRowPolicies::EnabledRowPolicies(const Params & params_)
|
|
|
|
: params(params_)
|
2019-11-17 11:57:02 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2020-03-07 17:37:38 +00:00
|
|
|
EnabledRowPolicies::~EnabledRowPolicies() = default;
|
2019-11-17 11:57:02 +00:00
|
|
|
|
|
|
|
|
2020-03-07 17:37:38 +00:00
|
|
|
ASTPtr EnabledRowPolicies::getCondition(const String & database, const String & table_name, ConditionType type) const
|
2019-11-17 11:57:02 +00:00
|
|
|
{
|
|
|
|
/// We don't lock `mutex` here.
|
2020-02-12 23:59:49 +00:00
|
|
|
auto loaded = map_of_mixed_conditions.load();
|
|
|
|
auto it = loaded->find({database, table_name});
|
|
|
|
if (it == loaded->end())
|
2019-11-17 11:57:02 +00:00
|
|
|
return {};
|
2020-03-07 17:37:38 +00:00
|
|
|
return it->second.mixed_conditions[type];
|
2019-11-17 11:57:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-03-07 17:37:38 +00:00
|
|
|
ASTPtr EnabledRowPolicies::getCondition(const String & database, const String & table_name, ConditionType type, const ASTPtr & extra_condition) const
|
2020-02-12 20:47:37 +00:00
|
|
|
{
|
2020-04-08 21:10:00 +00:00
|
|
|
ASTPtr condition = getCondition(database, table_name, type);
|
|
|
|
if (condition && extra_condition)
|
|
|
|
condition = makeASTForLogicalAnd({condition, extra_condition});
|
|
|
|
else if (!condition)
|
|
|
|
condition = extra_condition;
|
|
|
|
|
|
|
|
bool value;
|
|
|
|
if (tryGetLiteralBool(condition.get(), value) && value)
|
|
|
|
condition = nullptr; /// The condition is always true, no need to check it.
|
|
|
|
|
|
|
|
return condition;
|
2020-02-12 20:47:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-03-07 17:37:38 +00:00
|
|
|
std::vector<UUID> EnabledRowPolicies::getCurrentPolicyIDs() const
|
2019-11-17 11:57:02 +00:00
|
|
|
{
|
|
|
|
/// We don't lock `mutex` here.
|
2020-02-12 23:59:49 +00:00
|
|
|
auto loaded = map_of_mixed_conditions.load();
|
2019-11-17 11:57:02 +00:00
|
|
|
std::vector<UUID> policy_ids;
|
2020-02-12 23:59:49 +00:00
|
|
|
for (const auto & mixed_conditions : *loaded | boost::adaptors::map_values)
|
2019-11-17 11:57:02 +00:00
|
|
|
boost::range::copy(mixed_conditions.policy_ids, std::back_inserter(policy_ids));
|
|
|
|
return policy_ids;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-03-07 17:37:38 +00:00
|
|
|
std::vector<UUID> EnabledRowPolicies::getCurrentPolicyIDs(const String & database, const String & table_name) const
|
2019-11-17 11:57:02 +00:00
|
|
|
{
|
|
|
|
/// We don't lock `mutex` here.
|
2020-02-12 23:59:49 +00:00
|
|
|
auto loaded = map_of_mixed_conditions.load();
|
|
|
|
auto it = loaded->find({database, table_name});
|
|
|
|
if (it == loaded->end())
|
2019-11-17 11:57:02 +00:00
|
|
|
return {};
|
|
|
|
return it->second.policy_ids;
|
|
|
|
}
|
2020-03-07 17:37:38 +00:00
|
|
|
|
2019-11-17 11:57:02 +00:00
|
|
|
}
|