summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSvilen Mihaylov <svilen.mihaylov@mongodb.com>2020-06-15 10:11:14 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-06-16 16:37:45 +0000
commit336636a95cf29ef9b2641a4dc768b585e845bd6b (patch)
tree3466c786ac081d2a4a92ae28a8264175d281cbc4
parent1854bf07a1af64792822ca5df2ce8b9821fd6b3a (diff)
downloadmongo-336636a95cf29ef9b2641a4dc768b585e845bd6b.tar.gz
SERVER-48464 Remove {$rand:{const:true}}
-rw-r--r--jstests/aggregation/expressions/rand.js22
-rw-r--r--src/mongo/db/pipeline/expression.cpp30
-rw-r--r--src/mongo/db/pipeline/expression_test.cpp18
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