summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/query_request.cpp
diff options
context:
space:
mode:
authorBernard Gorman <bernard.gorman@gmail.com>2019-05-22 13:10:17 +0100
committerBernard Gorman <bernard.gorman@gmail.com>2019-05-24 15:27:25 +0100
commitec6f2325a99b6ddd13af6903eed12ced95e4bea8 (patch)
treef225a28dc123f6e1ca0f32b1fee4202cee051db5 /src/mongo/db/query/query_request.cpp
parent8d5727273585524a38d4a663b61403a263f7cf3d (diff)
downloadmongo-ec6f2325a99b6ddd13af6903eed12ced95e4bea8.tar.gz
SERVER-41238 Allow $$NOW and $$CLUSTER_TIME to be used in the find command
Diffstat (limited to 'src/mongo/db/query/query_request.cpp')
-rw-r--r--src/mongo/db/query/query_request.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/mongo/db/query/query_request.cpp b/src/mongo/db/query/query_request.cpp
index a8698404ea8..c43317b584b 100644
--- a/src/mongo/db/query/query_request.cpp
+++ b/src/mongo/db/query/query_request.cpp
@@ -98,6 +98,7 @@ const char kOplogReplayField[] = "oplogReplay";
const char kNoCursorTimeoutField[] = "noCursorTimeout";
const char kAwaitDataField[] = "awaitData";
const char kPartialResultsField[] = "allowPartialResults";
+const char kRuntimeConstantsField[] = "runtimeConstants";
const char kTermField[] = "term";
const char kOptionsField[] = "options";
const char kReadOnceField[] = "readOnce";
@@ -337,6 +338,14 @@ StatusWith<unique_ptr<QueryRequest>> QueryRequest::parseFromFindCommand(unique_p
}
qr->_allowPartialResults = el.boolean();
+ } else if (fieldName == kRuntimeConstantsField) {
+ Status status = checkFieldType(el, Object);
+ if (!status.isOK()) {
+ return status;
+ }
+ qr->_runtimeConstants =
+ RuntimeConstants::parse(IDLParserErrorContext(kRuntimeConstantsField),
+ cmdObj.getObjectField(kRuntimeConstantsField));
} else if (fieldName == kOptionsField) {
// 3.0.x versions of the shell may generate an explain of a find command with an
// 'options' field. We accept this only if the 'options' field is empty so that
@@ -544,6 +553,12 @@ void QueryRequest::asFindCommandInternal(BSONObjBuilder* cmdBuilder) const {
cmdBuilder->append(kPartialResultsField, true);
}
+ if (_runtimeConstants) {
+ BSONObjBuilder rtcBuilder(cmdBuilder->subobjStart(kRuntimeConstantsField));
+ _runtimeConstants->serialize(&rtcBuilder);
+ rtcBuilder.doneFast();
+ }
+
if (_replicationTerm) {
cmdBuilder->append(kTermField, *_replicationTerm);
}
@@ -1116,6 +1131,11 @@ StatusWith<BSONObj> QueryRequest::asAggregationCommand() const {
if (!_unwrappedReadPref.isEmpty()) {
aggregationBuilder.append(QueryRequest::kUnwrappedReadPrefField, _unwrappedReadPref);
}
+ if (_runtimeConstants) {
+ BSONObjBuilder rtcBuilder(aggregationBuilder.subobjStart(kRuntimeConstantsField));
+ _runtimeConstants->serialize(&rtcBuilder);
+ rtcBuilder.doneFast();
+ }
return StatusWith<BSONObj>(aggregationBuilder.obj());
}
} // namespace mongo