diff options
author | Svilen Mihaylov <svilen.mihaylov@mongodb.com> | 2020-06-15 10:11:14 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-06-16 16:37:45 +0000 |
commit | 336636a95cf29ef9b2641a4dc768b585e845bd6b (patch) | |
tree | 3466c786ac081d2a4a92ae28a8264175d281cbc4 | |
parent | 1854bf07a1af64792822ca5df2ce8b9821fd6b3a (diff) | |
download | mongo-336636a95cf29ef9b2641a4dc768b585e845bd6b.tar.gz |
SERVER-48464 Remove {$rand:{const:true}}
-rw-r--r-- | jstests/aggregation/expressions/rand.js | 22 | ||||
-rw-r--r-- | src/mongo/db/pipeline/expression.cpp | 30 | ||||
-rw-r--r-- | src/mongo/db/pipeline/expression_test.cpp | 18 |
3 files changed, 7 insertions, 63 deletions
diff --git a/jstests/aggregation/expressions/rand.js b/jstests/aggregation/expressions/rand.js index b87d9e58be6..d4d3559bc1a 100644 --- a/jstests/aggregation/expressions/rand.js +++ b/jstests/aggregation/expressions/rand.js @@ -29,26 +29,4 @@ print("Average: ", avg); const err = 10.0 / Math.sqrt(12.0 * N); assert.lte(0.5 - err, avg); assert.gte(0.5 + err, avg); - -const collConst = db.expression_rand_const; -collConst.drop(); -assert.commandWorked(collConst.insert({_id: i, v: 0})); - -const randPipelineConst = [{$project: {r: {$rand: {const : true}}}}]; -let sum = 0.0; -for (i = 0; i < N; i++) { - const resultArrayConst = collConst.aggregate(randPipelineConst).toArray(); - assert.eq(1, resultArrayConst.length); - - const r = resultArrayConst[0]["r"]; - assert.lte(0.0, r); - assert.gte(1.0, r); - - sum += r; -} - -const avgConst = sum / N; -print("Average Const: ", avgConst); -assert.lte(0.5 - err, avgConst); -assert.gte(0.5 + err, avgConst); }()); diff --git a/src/mongo/db/pipeline/expression.cpp b/src/mongo/db/pipeline/expression.cpp index 42f95c7746f..80400576bf0 100644 --- a/src/mongo/db/pipeline/expression.cpp +++ b/src/mongo/db/pipeline/expression.cpp @@ -6439,34 +6439,11 @@ ExpressionRandom::ExpressionRandom(ExpressionContext* const expCtx) : Expression intrusive_ptr<Expression> ExpressionRandom::parse(ExpressionContext* const expCtx, BSONElement exprElement, const VariablesParseState& vps) { - bool hasConstField = false; - bool isConst = false; - uassert(3040500, - str::stream() << "$rand not allowed inside collection validators", + "$rand not allowed inside collection validators", !expCtx->isParsingCollectionValidator); - for (const auto& elem : exprElement.Obj()) { - const auto fieldName = elem.fieldNameStringData(); - if (fieldName == "const"_sd) { - uassert( - 3040501, str::stream() << "'const' must be specified just once", !hasConstField); - - uassert(3040502, - str::stream() << "'const' argument must be a boolean, found " - << typeName(elem.type()), - elem.type() == Bool); - isConst = elem.boolean(); - hasConstField = true; - } else { - uasserted(3040503, str::stream() << "Unknown argument: " << fieldName); - } - } - - if (isConst) { - ExpressionRandom exprRandom(expCtx); - return ExpressionConstant::create(expCtx, Value(exprRandom.getRandomValue())); - } + uassert(3040501, "$rand does not currently accept arguments", exprElement.Obj().isEmpty()); return new ExpressionRandom(expCtx); } @@ -6484,7 +6461,6 @@ Value ExpressionRandom::evaluate(const Document& root, Variables* variables) con } intrusive_ptr<Expression> ExpressionRandom::optimize() { - // Already optimized to ExpressionConstant if "const" option passed in. return intrusive_ptr<Expression>(this); } @@ -6493,6 +6469,6 @@ void ExpressionRandom::_doAddDependencies(DepsTracker* deps) const { } Value ExpressionRandom::serialize(const bool explain) const { - return Value(DOC(getOpName() << DOC("const"_sd << Value(false)))); + return Value(DOC(getOpName() << Document())); } } // namespace mongo diff --git a/src/mongo/db/pipeline/expression_test.cpp b/src/mongo/db/pipeline/expression_test.cpp index 23150d4a1a3..99c1fe07648 100644 --- a/src/mongo/db/pipeline/expression_test.cpp +++ b/src/mongo/db/pipeline/expression_test.cpp @@ -2976,26 +2976,16 @@ TEST(ExpressionRandom, Basic) { auto expCtx = ExpressionContextForTest{}; VariablesParseState vps = expCtx.variablesParseState; - // Test const = false case, we generate new random value on every call to evaluate(). + // We generate a new random value on every call to evaluate(). intrusive_ptr<Expression> expression = Expression::parseExpression(&expCtx, fromjson("{ $rand: {} }"), vps); const std::string& serialized = expression->serialize(false).getDocument().toString(); - ASSERT_EQ("{$rand: {const: false}}", serialized); + ASSERT_EQ("{$rand: {}}", serialized); - const auto randFn1 = [&expression, &expCtx]() -> double { + const auto randFn = [&expression, &expCtx]() -> double { return expression->evaluate({}, &expCtx.variables).getDouble(); }; - assertRandomProperties(randFn1); - - // Test const = true case, we optimize to a const. - const auto randFn2 = [&expression, &expCtx, &vps]() -> double { - expression = - Expression::parseExpression(&expCtx, fromjson("{ $rand: {const: true} }"), vps); - const std::string& serialized1 = expression->serialize(false).getDocument().toString(); - ASSERT_TRUE(serialized1.find("{$const:") == 0); - return expression->evaluate({}, &expCtx.variables).getDouble(); - }; - assertRandomProperties(randFn2); + assertRandomProperties(randFn); } } // namespace ExpressionTests |