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 {
23using CollectionsField =
decltype(T::kMongoCollectionsField);
25inline constexpr bool kHasCollectionsField = meta::IsDetected<CollectionsField, T>;
28using UpdateFieldName =
decltype(T::kMongoUpdateFieldName);
30inline constexpr bool kHasUpdateFieldName = meta::IsDetected<UpdateFieldName, T>;
33using KeyField =
decltype(T::kKeyField);
35inline constexpr bool kHasKeyField = meta::IsDetected<KeyField, T>;
38using DataType =
typename T::DataType;
40inline constexpr bool kHasValidDataType = meta::kIsMap<meta::DetectedType<DataType, T>>;
43using HasSecondaryPreferred =
decltype(T::kIsSecondaryPreferred);
45inline constexpr bool kHasSecondaryPreferred = meta::IsDetected<HasSecondaryPreferred, T>;
48using HasDeserializeObject =
decltype(T::DeserializeObject);
50inline constexpr bool kHasDeserializeObject = meta::IsDetected<HasDeserializeObject, T>;
53using HasCorrectDeserializeObject = meta::ExpectSame<
54 typename T::ObjectType,
55 decltype(std::declval<
const T&>().DeserializeObject(std::declval<
const formats::
bson::
Document&>()))>;
57inline constexpr bool kHasCorrectDeserializeObject = meta::IsDetected<HasCorrectDeserializeObject, T>;
60using HasDefaultDeserializeObject =
decltype(T::kUseDefaultDeserializeObject);
62inline constexpr bool kHasDefaultDeserializeObject = meta::IsDetected<HasDefaultDeserializeObject, T>;
65using HasFindOperation =
decltype(T::GetFindOperation);
67inline constexpr bool kHasFindOperation = meta::IsDetected<HasFindOperation, T>;
70using HasCorrectFindOperation = meta::ExpectSame<
73 decltype(std::declval<
const T&>().GetFindOperation(
75 std::declval<
const std::chrono::system_clock::time_point&>(),
76 std::declval<
const std::chrono::system_clock::time_point&>(),
77 std::declval<
const std::chrono::system_clock::duration&>()
81inline constexpr bool kHasCorrectFindOperation = meta::IsDetected<HasCorrectFindOperation, T>;
84using HasDefaultFindOperation =
decltype(T::kUseDefaultFindOperation);
86inline constexpr bool kHasDefaultFindOperation = meta::IsDetected<HasDefaultFindOperation, T>;
89using HasInvalidDocumentsSkipped =
decltype(T::kAreInvalidDocumentsSkipped);
91inline constexpr bool kHasInvalidDocumentsSkipped = meta::IsDetected<HasInvalidDocumentsSkipped, T>;
94struct ClassByMemberPointer {};
95template <
typename T,
typename C>
96struct ClassByMemberPointer<T C::*> {
99template <
typename CollectionPtr>
100using CollectionsType =
typename ClassByMemberPointer<std::remove_cv_t<CollectionPtr>>::type;
102template <
typename MongoCacheTraits>
105 if constexpr (kHasDefaultDeserializeObject<MongoCacheTraits>) {
107 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kUseDefaultDeserializeObject)>,
bool>,
108 "Mongo cache traits must specify kUseDefaultDeserializeObject as "
112 if constexpr (kHasDefaultFindOperation<MongoCacheTraits>) {
114 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kUseDefaultFindOperation)>,
bool>,
115 "Mongo cache traits must specify kUseDefaultFindOperation as bool"
120 static_assert(kHasCollectionsField<MongoCacheTraits>,
"Mongo cache traits must specify collections field");
121 static_assert(kHasKeyField<MongoCacheTraits>,
"Mongo cache traits must specify key field");
122 static_assert(kHasValidDataType<MongoCacheTraits>,
"Mongo cache traits must specify mapping data type");
124 static_assert(kHasSecondaryPreferred<MongoCacheTraits>,
"Mongo cache traits must specify read preference");
126 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kIsSecondaryPreferred)>,
bool>,
127 "Mongo cache traits must specify read preference of a bool type"
130 static_assert(kHasInvalidDocumentsSkipped<MongoCacheTraits>,
"Mongo cache traits must specify validation policy");
132 std::is_same_v<std::decay_t<
decltype(MongoCacheTraits::kAreInvalidDocumentsSkipped)>,
bool>,
133 "Mongo cache traits must specify validation policy of a bool type"
137 kHasFindOperation<MongoCacheTraits> || kHasDefaultFindOperation<MongoCacheTraits>,
138 "Mongo cache traits must specify find operation"
141 !kHasFindOperation<MongoCacheTraits> || kHasCorrectFindOperation<MongoCacheTraits>,
142 "Mongo cache traits must specify find operation with correct "
143 "signature and return value type: "
144 "static storages::mongo::operations::Find GetFindOperation("
145 "cache::UpdateType type, "
146 "const std::chrono::system_clock::time_point& last_update, "
147 "const std::chrono::system_clock::time_point& now, "
148 "const std::chrono::system_clock::duration& correction)"
152 kHasDeserializeObject<MongoCacheTraits> || kHasDefaultDeserializeObject<MongoCacheTraits>,
153 "Mongo cache traits must specify deserialize object"
156 !kHasDeserializeObject<MongoCacheTraits> || kHasCorrectDeserializeObject<MongoCacheTraits>,
157 "Mongo cache traits must specify deserialize object with correct "
158 "signature and return value type: "
159 "static ObjectType DeserializeObject(const formats::bson::Document& "