@@ -50,6 +50,9 @@ CollectionStatusWriter::CollectionStatusWriter(TRI_vocbase_t& vocbase,
50
50
StaticStrings::PregelCollection);
51
51
}
52
52
_logicalCollection = std::move (logicalCollection);
53
+ if (!ExecContext::current ().user ().empty ()) {
54
+ _user = ExecContext::current ().user ();
55
+ }
53
56
};
54
57
55
58
CollectionStatusWriter::CollectionStatusWriter (TRI_vocbase_t& vocbase)
@@ -62,6 +65,9 @@ CollectionStatusWriter::CollectionStatusWriter(TRI_vocbase_t& vocbase)
62
65
StaticStrings::PregelCollection);
63
66
}
64
67
_logicalCollection = std::move (logicalCollection);
68
+ if (!ExecContext::current ().user ().empty ()) {
69
+ _user = ExecContext::current ().user ();
70
+ }
65
71
};
66
72
67
73
auto CollectionStatusWriter::createResult (velocypack::Slice data)
@@ -89,47 +95,94 @@ auto CollectionStatusWriter::createResult(velocypack::Slice data)
89
95
}
90
96
91
97
auto CollectionStatusWriter::readResult () -> OperationResult {
92
- if (_executionNumber.value == 0 ) {
93
- return OperationResult (Result (TRI_ERROR_ARANGO_DOCUMENT_NOT_FOUND), {});
98
+ std::shared_ptr<VPackBuilder> bindParameter =
99
+ std::make_shared<VPackBuilder>();
100
+ bindParameter->openObject ();
101
+ bindParameter->add (" pid" , VPackValue (_executionNumber.value ));
102
+ bindParameter->add (" collectionName" ,
103
+ VPackValue (StaticStrings::PregelCollection));
104
+ if (_user.has_value () && _user.value () != " root" ) {
105
+ bindParameter->add (" user" , _user.value ());
94
106
}
95
- OperationData opData (_executionNumber.value );
96
- auto accessModeType = AccessMode::Type::READ;
97
- SingleCollectionTransaction trx (ctx (), StaticStrings::PregelCollection,
98
- accessModeType);
99
- trx.addHint (transaction::Hints::Hint::SINGLE_OPERATION);
100
- OperationOptions options (ExecContext::current ());
107
+ bindParameter->close ();
101
108
102
- // begin transaction
103
- Result transactionResult = trx.begin ();
104
- if (transactionResult.fail ()) {
105
- return OperationResult{std::move (transactionResult), options};
109
+ // TODO: GORDO-1607
110
+ // Note: As soon as we introduce an inspectable struct to the data we actually
111
+ // write into the pregel collection, we can remove change "entry.data" to
112
+ // just "entry".
113
+ std::string queryString;
114
+ if (_user.has_value () && _user.value () != " root" ) {
115
+ queryString = R"(
116
+ LET potentialDocument = DOCUMENT(CONCAT(@collectionName, '/', @pid)).data
117
+ RETURN potentialDocument.user == @user ? potentialDocument : null
118
+ )" ;
119
+ } else {
120
+ queryString = R"(
121
+ RETURN DOCUMENT(CONCAT(@collectionName, '/', @pid)).data
122
+ )" ;
106
123
}
107
- auto payload = inspection::serializeWithErrorT (opData);
108
- return handleOperationResult (
109
- trx, options, transactionResult,
110
- trx.documentAsync (StaticStrings::PregelCollection, payload->slice (), {})
111
- .get ());
124
+
125
+ return executeQuery (queryString, bindParameter);
112
126
}
113
127
114
128
auto CollectionStatusWriter::readAllNonExpiredResults () -> OperationResult {
129
+ std::shared_ptr<VPackBuilder> bindParameter =
130
+ std::make_shared<VPackBuilder>();
131
+ bindParameter->openObject ();
132
+ bindParameter->add (" @collectionName" ,
133
+ VPackValue (StaticStrings::PregelCollection));
134
+ if (_user.has_value () && _user.value () != " root" ) {
135
+ bindParameter->add (" user" , _user.value ());
136
+ }
137
+ bindParameter->close ();
138
+
115
139
// TODO: GORDO-1607
116
140
// Note: As soon as we introduce an inspectable struct to the data we actually
117
141
// write into the pregel collection, we can remove change "entry.data" to
118
142
// just "entry".
119
- std::string queryString = R"(
120
- FOR entry IN _pregel_queries
121
- FILTER DATE_DIFF(DATE_NOW(), DATE_TIMESTAMP(entry.data.expires), "s") >= 0
122
- OR entry.data.expires == null
123
- RETURN entry.data
124
- )" ;
125
-
126
- return executeQuery (queryString);
143
+ std::string queryString;
144
+ if (_user.has_value () && _user.value () != " root" ) {
145
+ queryString = R"(
146
+ FOR entry IN @@collectionName
147
+ FILTER (entry.data.user == @user AND DATE_DIFF(DATE_NOW(), DATE_TIMESTAMP(entry.data.expires), "s") >= 0)
148
+ OR (entry.data.user == @user AND entry.data.expires == null)
149
+ RETURN entry.data
150
+ )" ;
151
+ } else {
152
+ queryString = R"(
153
+ FOR entry IN @@collectionName
154
+ FILTER DATE_DIFF(DATE_NOW(), DATE_TIMESTAMP(entry.data.expires), "s") >= 0
155
+ OR entry.data.expires == null
156
+ RETURN entry.data
157
+ )" ;
158
+ }
159
+
160
+ return executeQuery (queryString, bindParameter);
127
161
}
128
162
129
163
auto CollectionStatusWriter::readAllResults () -> OperationResult {
164
+ std::shared_ptr<VPackBuilder> bindParameter =
165
+ std::make_shared<VPackBuilder>();
166
+ bindParameter->openObject ();
167
+ bindParameter->add (" @collectionName" ,
168
+ VPackValue (StaticStrings::PregelCollection));
169
+ if (_user.has_value () && _user.value () != " root" ) {
170
+ bindParameter->add (" user" , _user.value ());
171
+ }
172
+ bindParameter->close ();
173
+
130
174
// TODO: GORDO-1607
131
- std::string queryString = " FOR entry IN _pregel_queries RETURN entry" ;
132
- return executeQuery (queryString);
175
+ std::string queryString;
176
+ if (_user.has_value () && _user.value () != " root" ) {
177
+ queryString = R"(
178
+ FOR entry IN @@collectionName
179
+ FILTER entry.data.user == @user
180
+ RETURN entry.data
181
+ )" ;
182
+ } else {
183
+ queryString = " FOR entry IN @@collectionName RETURN entry.data" ;
184
+ }
185
+ return executeQuery (queryString, bindParameter);
133
186
}
134
187
135
188
auto CollectionStatusWriter::updateResult (velocypack::Slice data)
@@ -193,10 +246,17 @@ auto CollectionStatusWriter::deleteAllResults() -> OperationResult {
193
246
trx.truncateAsync (StaticStrings::PregelCollection, options).get ());
194
247
}
195
248
196
- auto CollectionStatusWriter::executeQuery (std::string queryString)
249
+ auto CollectionStatusWriter::executeQuery (
250
+ std::string queryString,
251
+ std::optional<std::shared_ptr<VPackBuilder>> bindParameters)
197
252
-> OperationResult {
253
+ std::shared_ptr<VPackBuilder> bindParams = nullptr ;
254
+ if (bindParameters.has_value ()) {
255
+ bindParams = bindParameters.value ();
256
+ }
257
+
198
258
auto query = arangodb::aql::Query::create (
199
- ctx (), arangodb::aql::QueryString (queryString), nullptr );
259
+ ctx (), arangodb::aql::QueryString (std::move ( queryString)), bindParams );
200
260
query->queryOptions ().skipAudit = true ;
201
261
aql::QueryResult queryResult = query->executeSync ();
202
262
if (queryResult.result .fail ()) {
0 commit comments