9#include <userver/cache/update_type.hpp>
10#include <userver/utils/meta.hpp>
12USERVER_NAMESPACE_BEGIN
22namespace mongo_cache::impl {
25concept HasCollectionsField =
requires { T::kMongoCollectionsField; };
28concept HasUpdateFieldName =
requires { T::kMongoUpdateFieldName; };
31concept HasKeyField =
requires { T::kKeyField; };
34concept HasValidDataType = meta::kIsMap<
typename T::DataType>;
37concept HasSecondaryPreferred =
requires { T::kIsSecondaryPreferred; };
40concept HasDeserializeObject =
requires { T::DeserializeObject; };
43concept HasCorrectDeserializeObject =
requires(
const T& t,
const formats::
bson::
Document& doc) {
45 t.DeserializeObject(doc)
46 } -> std::same_as<
typename T::ObjectType>;
50concept HasDefaultDeserializeObject =
requires { T::kUseDefaultDeserializeObject; };
53concept HasFindOperation =
requires { T::GetFindOperation; };
56concept HasCorrectFindOperation =
requires(
58 cache::UpdateType update_type,
59 const std::chrono::system_clock::time_point& last_update,
60 const std::chrono::system_clock::time_point& now,
61 const std::chrono::system_clock::duration& correction
65 t.GetFindOperation(update_type, last_update, now, correction)
70concept HasDefaultFindOperation =
requires { T::kUseDefaultFindOperation; };
73concept HasInvalidDocumentsSkipped =
requires { T::kAreInvalidDocumentsSkipped; };
76struct ClassByMemberPointer {};
77template <
typename T,
typename C>
78struct ClassByMemberPointer<T C::*> {
81template <
typename CollectionPtr>
82using CollectionsType =
typename ClassByMemberPointer<std::remove_cv_t<CollectionPtr>>::type;
84template <
typename MongoCacheTraits>
87 if constexpr (HasDefaultDeserializeObject<MongoCacheTraits>) {
89 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kUseDefaultDeserializeObject)>,
bool>,
90 "Mongo cache traits must specify kUseDefaultDeserializeObject as "
94 if constexpr (HasDefaultFindOperation<MongoCacheTraits>) {
96 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kUseDefaultFindOperation)>,
bool>,
97 "Mongo cache traits must specify kUseDefaultFindOperation as bool"
102 static_assert(HasCollectionsField<MongoCacheTraits>,
"Mongo cache traits must specify collections field");
103 static_assert(HasKeyField<MongoCacheTraits>,
"Mongo cache traits must specify key field");
104 static_assert(HasValidDataType<MongoCacheTraits>,
"Mongo cache traits must specify mapping data type");
106 static_assert(HasSecondaryPreferred<MongoCacheTraits>,
"Mongo cache traits must specify read preference");
108 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kIsSecondaryPreferred)>,
bool>,
109 "Mongo cache traits must specify read preference of a bool type"
112 static_assert(HasInvalidDocumentsSkipped<MongoCacheTraits>,
"Mongo cache traits must specify validation policy");
114 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kAreInvalidDocumentsSkipped)>,
bool>,
115 "Mongo cache traits must specify validation policy of a bool type"
119 HasFindOperation<MongoCacheTraits> || HasDefaultFindOperation<MongoCacheTraits>,
120 "Mongo cache traits must specify find operation"
123 !HasFindOperation<MongoCacheTraits> || HasCorrectFindOperation<MongoCacheTraits>,
124 "Mongo cache traits must specify find operation with correct "
125 "signature and return value type: "
126 "static storages::mongo::operations::Find GetFindOperation("
127 "cache::UpdateType type, "
128 "const std::chrono::system_clock::time_point& last_update, "
129 "const std::chrono::system_clock::time_point& now, "
130 "const std::chrono::system_clock::duration& correction)"
134 HasDeserializeObject<MongoCacheTraits> || HasDefaultDeserializeObject<MongoCacheTraits>,
135 "Mongo cache traits must specify deserialize object"
138 !HasDeserializeObject<MongoCacheTraits> || HasCorrectDeserializeObject<MongoCacheTraits>,
139 "Mongo cache traits must specify deserialize object with correct "
140 "signature and return value type: "
141 "static ObjectType DeserializeObject(const formats::bson::Document& "