6#include <userver/cache/update_type.hpp>
7#include <userver/utils/meta.hpp>
8#include <userver/utils/void_t.hpp>
10USERVER_NAMESPACE_BEGIN
20namespace mongo_cache::impl {
23concept HasCollectionsField =
requires { T::kMongoCollectionsField; };
26concept HasUpdateFieldName =
requires { T::kMongoUpdateFieldName; };
29concept HasKeyField =
requires { T::kKeyField; };
32concept HasValidDataType = meta::kIsMap<
typename T::DataType>;
35concept HasSecondaryPreferred =
requires { T::kIsSecondaryPreferred; };
38concept HasDeserializeObject =
requires { T::DeserializeObject; };
41concept HasCorrectDeserializeObject =
requires(
const T& t,
const formats::
bson::
Document& doc) {
43 t.DeserializeObject(doc)
44 } -> std::same_as<
typename T::ObjectType>;
48concept HasDefaultDeserializeObject =
requires { T::kUseDefaultDeserializeObject; };
51concept HasFindOperation =
requires { T::GetFindOperation; };
54concept HasCorrectFindOperation =
requires(
56 cache::UpdateType update_type,
57 const std::chrono::system_clock::time_point& last_update,
58 const std::chrono::system_clock::time_point& now,
59 const std::chrono::system_clock::duration& correction
63 t.GetFindOperation(update_type, last_update, now, correction)
68concept HasDefaultFindOperation =
requires { T::kUseDefaultFindOperation; };
71concept HasInvalidDocumentsSkipped =
requires { T::kAreInvalidDocumentsSkipped; };
74struct ClassByMemberPointer {};
75template <
typename T,
typename C>
76struct ClassByMemberPointer<T C::*> {
79template <
typename CollectionPtr>
80using CollectionsType =
typename ClassByMemberPointer<std::remove_cv_t<CollectionPtr>>::type;
82template <
typename MongoCacheTraits>
85 if constexpr (HasDefaultDeserializeObject<MongoCacheTraits>) {
87 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kUseDefaultDeserializeObject)>,
bool>,
88 "Mongo cache traits must specify kUseDefaultDeserializeObject as "
92 if constexpr (HasDefaultFindOperation<MongoCacheTraits>) {
94 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kUseDefaultFindOperation)>,
bool>,
95 "Mongo cache traits must specify kUseDefaultFindOperation as bool"
100 static_assert(HasCollectionsField<MongoCacheTraits>,
"Mongo cache traits must specify collections field");
101 static_assert(HasKeyField<MongoCacheTraits>,
"Mongo cache traits must specify key field");
102 static_assert(HasValidDataType<MongoCacheTraits>,
"Mongo cache traits must specify mapping data type");
104 static_assert(HasSecondaryPreferred<MongoCacheTraits>,
"Mongo cache traits must specify read preference");
106 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kIsSecondaryPreferred)>,
bool>,
107 "Mongo cache traits must specify read preference of a bool type"
110 static_assert(HasInvalidDocumentsSkipped<MongoCacheTraits>,
"Mongo cache traits must specify validation policy");
112 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kAreInvalidDocumentsSkipped)>,
bool>,
113 "Mongo cache traits must specify validation policy of a bool type"
117 HasFindOperation<MongoCacheTraits> || HasDefaultFindOperation<MongoCacheTraits>,
118 "Mongo cache traits must specify find operation"
121 !HasFindOperation<MongoCacheTraits> || HasCorrectFindOperation<MongoCacheTraits>,
122 "Mongo cache traits must specify find operation with correct "
123 "signature and return value type: "
124 "static storages::mongo::operations::Find GetFindOperation("
125 "cache::UpdateType type, "
126 "const std::chrono::system_clock::time_point& last_update, "
127 "const std::chrono::system_clock::time_point& now, "
128 "const std::chrono::system_clock::duration& correction)"
132 HasDeserializeObject<MongoCacheTraits> || HasDefaultDeserializeObject<MongoCacheTraits>,
133 "Mongo cache traits must specify deserialize object"
136 !HasDeserializeObject<MongoCacheTraits> || HasCorrectDeserializeObject<MongoCacheTraits>,
137 "Mongo cache traits must specify deserialize object with correct "
138 "signature and return value type: "
139 "static ObjectType DeserializeObject(const formats::bson::Document& "