diff options
author | Charlie Swanson <charlie.swanson@mongodb.com> | 2015-07-17 22:42:31 -0400 |
---|---|---|
committer | Charlie Swanson <charlie.swanson@mongodb.com> | 2015-07-20 15:40:54 -0400 |
commit | 824776f67165d4ee0447c1e855dcd8a79643b73c (patch) | |
tree | e7f1968d0a75d3b0f3e8c2af6c0c02af138fecae /src/mongo/db/pipeline/expression.cpp | |
parent | 75a73c76f2304e89ab9f7e611f9ba82a07de520e (diff) | |
download | mongo-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.cpp | 36 |
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 ----------------------------- */ |