summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/expression.cpp
diff options
context:
space:
mode:
authorCharlie Swanson <charlie.swanson@mongodb.com>2015-07-17 22:42:31 -0400
committerCharlie Swanson <charlie.swanson@mongodb.com>2015-07-20 15:40:54 -0400
commit824776f67165d4ee0447c1e855dcd8a79643b73c (patch)
treee7f1968d0a75d3b0f3e8c2af6c0c02af138fecae /src/mongo/db/pipeline/expression.cpp
parent75a73c76f2304e89ab9f7e611f9ba82a07de520e (diff)
downloadmongo-824776f67165d4ee0447c1e855dcd8a79643b73c.tar.gz
$sample
Conflicts: src/mongo/db/pipeline/document_source.h src/mongo/db/pipeline/document_source_test.cpp
Diffstat (limited to 'src/mongo/db/pipeline/expression.cpp')
-rw-r--r--src/mongo/db/pipeline/expression.cpp36
1 files changed, 29 insertions, 7 deletions
diff --git a/src/mongo/db/pipeline/expression.cpp b/src/mongo/db/pipeline/expression.cpp
index 92aab58ad61..88a471d0792 100644
--- a/src/mongo/db/pipeline/expression.cpp
+++ b/src/mongo/db/pipeline/expression.cpp
@@ -1851,23 +1851,45 @@ REGISTER_EXPRESSION(meta, ExpressionMeta::parse);
intrusive_ptr<Expression> ExpressionMeta::parse(BSONElement expr,
const VariablesParseState& vpsIn) {
uassert(17307, "$meta only supports String arguments", expr.type() == String);
- uassert(17308, "Unsupported argument to $meta: " + expr.String(), expr.String() == "textScore");
-
- return new ExpressionMeta();
+ if (expr.valueStringData() == "textScore") {
+ return new ExpressionMeta(MetaType::TEXT_SCORE);
+ } else if (expr.valueStringData() == "randVal") {
+ return new ExpressionMeta(MetaType::RAND_VAL);
+ } else {
+ uasserted(17308, "Unsupported argument to $meta: " + expr.String());
+ }
}
+ExpressionMeta::ExpressionMeta(MetaType metaType) : _metaType(metaType) {}
+
Value ExpressionMeta::serialize(bool explain) const {
- return Value(DOC("$meta"
- << "textScore"));
+ switch (_metaType) {
+ case MetaType::TEXT_SCORE:
+ return Value(DOC("$meta"
+ << "textScore"));
+ case MetaType::RAND_VAL:
+ return Value(DOC("$meta"
+ << "randVal"));
+ }
+ MONGO_UNREACHABLE;
}
Value ExpressionMeta::evaluateInternal(Variables* vars) const {
const Document& root = vars->getRoot();
- return root.hasTextScore() ? Value(root.getTextScore()) : Value();
+ switch (_metaType) {
+ case MetaType::TEXT_SCORE:
+ return root.hasTextScore() ? Value(root.getTextScore()) : Value();
+ case MetaType::RAND_VAL:
+ return root.hasRandMetaField() ? Value(static_cast<long long>(root.getRandMetaField()))
+ : Value();
+ }
+ MONGO_UNREACHABLE;
}
void ExpressionMeta::addDependencies(DepsTracker* deps, vector<string>* path) const {
- deps->needTextScore = true;
+ if (_metaType == MetaType::TEXT_SCORE) {
+ deps->needTextScore = true;
+ }
}
/* ------------------------- ExpressionMillisecond ----------------------------- */