MVault 1.0.0
Simple c++ database
Loading...
Searching...
No Matches
VaultRequest.hpp
1#pragma once
2
3#include "VaultRequest.h"
4
5#include "Vault.hpp"
6
7namespace mvlt
8{
9 template <VaultRequestType Type>
10 template <class T>
11 // codechecker_intentional [all] false positive warning from clag_tidy
12 VaultRequest<Type>::VaultRequest(const std::string& key, const T& keyValue, const std::function<bool(const VaultRecordRef& ref)>& requestPredicat) noexcept : Key(key), RequestPredicat(requestPredicat)
13 {
14 DBG_LOG_ENTER();
15
16 static_assert(!std::is_array<T>::value, "It is not possible to use a c array as a key value. \n\
17 If you want to use a string as a key, you must specialize the function with a string. Like this: \n\
18 Less<std::string>(\"Key\", \"Value\") or Greater(\"Key\", std::string(\"Value\")). \n\
19 This works with the following classes: Less, LessOrEqual, Equal, GreaterOrEqual, Greater.");
20
21 DataPtr = static_cast<void*>(new T(keyValue));
22
23 // Set Request func
24 DataRequestFunc = [](const std::string& key, Vault* vlt, std::unordered_set<VaultRecord*>& vaultRecordSet, void* beginValue, void* endValue,
25 bool isIncludeBeginKeyValue, bool isIncludeEndKeyValue, const std::function<bool(const VaultRecordRef& ref)>& requestPredicat)
26 {
28 // Simple data request to vlt
29 if (endValue == nullptr)
30 res = vlt->RequestRecordsSet(Type, key, *static_cast<T*>(beginValue), *static_cast<T*>(beginValue), vaultRecordSet, false, false, -1, requestPredicat);
31 else
32 res = vlt->RequestRecordsSet(VaultRequestType::Interval, key, *static_cast<T*>(beginValue), *static_cast<T*>(endValue), vaultRecordSet, isIncludeBeginKeyValue, isIncludeEndKeyValue, -1, requestPredicat);
33
34 // Throw error
35 if (!res.IsOperationSuccess) throw VaultOperationResult(res);
36 };
37
38 DeleteFunc = [](void* ptrToDelete)
39 {
40 delete static_cast<T*>(ptrToDelete);
41 };
42 }
43
44 template <VaultRequestType Type>
45 template <VaultRequestType RequestType1, VaultRequestType RequestType2>
47 {
48 DBG_LOG_ENTER();
49
50 // Switch by request type Or or And
51 switch (Type)
52 {
53 case VaultRequestType::Or:
54 // Set complex request func
55 LogicalRequestFunction = [&](Vault* vlt, std::unordered_set<VaultRecord*>& vaultRecordSet)
56 {
57 std::unordered_set<VaultRecord*> req1Result, req2Result;
58
59 // Make requests in Or(req1, req2)
60 request1.Request(vlt, req1Result);
61 request2.Request(vlt, req2Result);
62
63 // Union requests
65 vaultRecordSet.emplace(record);
67 vaultRecordSet.emplace(record);
68 };
69 break;
70
71 case VaultRequestType::And:
72 // Set complex request func
73 LogicalRequestFunction = [&](Vault* vlt, std::unordered_set<VaultRecord*>& vaultRecordSet)
74 {
75 // Handle interval situation
76 if (request1.Key == request2.Key &&
77 (request1.RequestType == VaultRequestType::Greater || request1.RequestType == VaultRequestType::GreaterOrEqual) &&
78 (request2.RequestType == VaultRequestType::Less || request1.RequestType == VaultRequestType::LessOrEqual))
79 {
80 request1.DataRequestFunc(request1.Key, vlt, vaultRecordSet, request1.DataPtr, request2.DataPtr,
81 (request1.RequestType == VaultRequestType::GreaterOrEqual),
82 (request2.RequestType == VaultRequestType::LessOrEqual), [&](const VaultRecordRef& ref)
83 {
84 if (request1.RequestPredicat(ref) && request2.RequestPredicat(ref))
85 return true;
86 else
87 return false;
88 });
89 }
90 else // Standart and request
91 {
92 std::unordered_set<VaultRecord*> req1Result, req2Result;
93
94 // Make requests in And(req1, req2)
95 request1.Request(vlt, req1Result);
96 request2.Request(vlt, req2Result);
97
98 // Set less request to iterate
99 if (req1Result.size() > req2Result.size())
100 std::swap(req1Result, req2Result);
101
102 // Find intersection
104 if (req2Result.find(record) != req2Result.end())
105 vaultRecordSet.emplace(record);
106 }
107 };
108 break;
109 }
110 }
111
112 template <VaultRequestType Type>
113 void VaultRequest<Type>::Request(Vault* vlt, std::unordered_set<VaultRecord*>& vaultRecords) const
114 {
115 DBG_LOG_ENTER();
116
117 switch (Type)
118 {
119 case VaultRequestType::Less:
120 case VaultRequestType::LessOrEqual:
121 case VaultRequestType::Equal:
122 case VaultRequestType::GreaterOrEqual:
123 case VaultRequestType::Greater:
124 DataRequestFunc(Key, vlt, vaultRecords, DataPtr, nullptr, false, false, RequestPredicat);
125 break;
126 case VaultRequestType::Or:
127 case VaultRequestType::And:
128 LogicalRequestFunction(vlt, vaultRecords);
129 break;
130 }
131 }
132
133 template <VaultRequestType Type>
135 {
136 DBG_LOG_ENTER();
137
138 if (DeleteFunc != nullptr && DataPtr != nullptr)
139 DeleteFunc(DataPtr);
140 }
141
142 template <VaultRequestType LType, VaultRequestType RType>
144 {
145 DBG_LOG_ENTER();
146
148 }
149
150 template <VaultRequestType LType, VaultRequestType RType>
151 VaultRequest<VaultRequestType::Or> operator|| (const VaultRequest<LType>& lhs, const VaultRequest<RType>& rhs) noexcept
152 {
153 DBG_LOG_ENTER();
154
155 return VaultRequest<VaultRequestType::Or>(lhs, rhs);
156 }
157}
Iterator class for all library maps.
Definition Map.h:18
A class for storing data with the ability to quickly search for a variety of different keys of any ty...
Definition Vault.h:35
A class for storing data inside Vault.
Definition VaultRecord.h:18
A class that provides access to data inside Vault.
Definition VaultRecordRef.h:21
friend class VaultRequest
Making the all VaultRequest templates friendly.
Definition VaultRequest.h:42
~VaultRequest() noexcept
Default destructor.
Definition VaultRequest.hpp:134
void Request(Vault *vlt, std::unordered_set< VaultRecord * > &vaultRecords) const
Function for requesting data from Vault.
Definition VaultRequest.hpp:113
Structure for storing the results of MVault operations.
Definition VaultOperationResult.h:44