summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/expression_test.cpp
diff options
context:
space:
mode:
authorKshitij Gupta <kshitij.gupta@mongodb.com>2020-07-15 15:06:01 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-01-24 14:27:29 +0000
commit23973e8051d03576f83adf10b0f39c711e03d08d (patch)
tree3c8d9c2f259d5e180d40c14893fd444d274b8893 /src/mongo/db/pipeline/expression_test.cpp
parent63fa196dd22e3e075ebfc250acf2a0c62b73997a (diff)
downloadmongo-r4.2.24-rc0.tar.gz
SERVER-49214: Add $toHashedIndexKey expression.r4.2.24-rc0
(cherry picked from commit d57e17494ceade881013e2e99606cc92d4a38605) (cherry picked from commit 3f3f5cc03a6587f9d0cfc3bdcb3f8aa13fe2356c)
Diffstat (limited to 'src/mongo/db/pipeline/expression_test.cpp')
-rw-r--r--src/mongo/db/pipeline/expression_test.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/mongo/db/pipeline/expression_test.cpp b/src/mongo/db/pipeline/expression_test.cpp
index 54a959e0d0f..dd74505263b 100644
--- a/src/mongo/db/pipeline/expression_test.cpp
+++ b/src/mongo/db/pipeline/expression_test.cpp
@@ -31,6 +31,7 @@
#include "mongo/bson/bsonmisc.h"
#include "mongo/config.h"
+#include "mongo/db/hasher.h"
#include "mongo/db/jsobj.h"
#include "mongo/db/json.h"
#include "mongo/db/pipeline/accumulator.h"
@@ -6450,4 +6451,93 @@ TEST(ExpressionSubtractTest, OverflowLong) {
ASSERT_EQ(result.getType(), BSONType::NumberDouble);
ASSERT_EQ(result.getDouble(), static_cast<double>(minLong) * -1);
}
+
+namespace ExpressionToHashedIndexKeyTest {
+
+TEST(ExpressionToHashedIndexKeyTest, StringInputSucceeds) {
+ intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ const BSONObj obj = BSON("$toHashedIndexKey"
+ << "hashThisStringLiteral"_sd);
+ auto expression = Expression::parseExpression(expCtx, obj, expCtx->variablesParseState);
+ Value result = expression->evaluate({}, &(expCtx->variables));
+ ASSERT_VALUE_EQ(result, Value::createIntOrLong(-5776344739422278694));
+}
+
+TEST(ExpressionToHashedIndexKeyTest, IntInputSucceeds) {
+ intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ const BSONObj obj = BSON("$toHashedIndexKey" << 123);
+ auto expression = Expression::parseExpression(expCtx, obj, expCtx->variablesParseState);
+ Value result = expression->evaluate({}, &(expCtx->variables));
+ ASSERT_VALUE_EQ(result, Value::createIntOrLong(-6548868637522515075));
+}
+
+TEST(ExpressionToHashedIndexKeyTest, TimestampInputSucceeds) {
+ intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ const BSONObj obj = BSON("$toHashedIndexKey" << Timestamp(0, 0));
+ auto expression = Expression::parseExpression(expCtx, obj, expCtx->variablesParseState);
+ Value result = expression->evaluate({}, &(expCtx->variables));
+ ASSERT_VALUE_EQ(result, Value::createIntOrLong(-7867208682377458672));
+}
+
+TEST(ExpressionToHashedIndexKeyTest, ObjectIdInputSucceeds) {
+ intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ const BSONObj obj = BSON("$toHashedIndexKey" << OID("47cc67093475061e3d95369d"));
+ auto expression = Expression::parseExpression(expCtx, obj, expCtx->variablesParseState);
+ Value result = expression->evaluate({}, &(expCtx->variables));
+ ASSERT_VALUE_EQ(result, Value::createIntOrLong(1576265281381834298));
+}
+
+TEST(ExpressionToHashedIndexKeyTest, DateInputSucceeds) {
+ intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ const BSONObj obj = BSON("$toHashedIndexKey" << Date_t());
+ auto expression = Expression::parseExpression(expCtx, obj, expCtx->variablesParseState);
+ Value result = expression->evaluate({}, &(expCtx->variables));
+ ASSERT_VALUE_EQ(result, Value::createIntOrLong(-1178696894582842035));
+}
+
+TEST(ExpressionToHashedIndexKeyTest, MissingInputValueSucceeds) {
+ intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ const BSONObj obj = BSON("$toHashedIndexKey"
+ << "$missingField");
+ auto expression = Expression::parseExpression(expCtx, obj, expCtx->variablesParseState);
+ Value result = expression->evaluate({}, &(expCtx->variables));
+ ASSERT_VALUE_EQ(result, Value::createIntOrLong(2338878944348059895));
+}
+
+TEST(ExpressionToHashedIndexKeyTest, NullInputSucceeds) {
+ intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ const BSONObj obj = BSON("$toHashedIndexKey" << BSONNULL);
+ auto expression = Expression::parseExpression(expCtx, obj, expCtx->variablesParseState);
+ Value result = expression->evaluate({}, &(expCtx->variables));
+ ASSERT_VALUE_EQ(result, Value::createIntOrLong(2338878944348059895));
+}
+
+TEST(ExpressionToHashedIndexKeyTest, ExpressionInputSucceeds) {
+ intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ const BSONObj obj = BSON("$toHashedIndexKey" << BSON("$pow" << BSON_ARRAY(2 << 4)));
+ auto expression = Expression::parseExpression(expCtx, obj, expCtx->variablesParseState);
+ Value result = expression->evaluate({}, &(expCtx->variables));
+ ASSERT_VALUE_EQ(result, Value::createIntOrLong(2598032665634823220));
+}
+
+TEST(ExpressionToHashedIndexKeyTest, UndefinedInputSucceeds) {
+ intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ const BSONObj obj = BSON("$toHashedIndexKey" << BSONUndefined);
+ auto expression = Expression::parseExpression(expCtx, obj, expCtx->variablesParseState);
+ Value result = expression->evaluate({}, &(expCtx->variables));
+ ASSERT_VALUE_EQ(result, Value::createIntOrLong(40158834000849533LL));
+}
+
+TEST(ExpressionToHashedIndexKeyTest, DoesAddInputDependencies) {
+ intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
+ const BSONObj obj = BSON("$toHashedIndexKey"
+ << "$someValue");
+ auto expression = Expression::parseExpression(expCtx, obj, expCtx->variablesParseState);
+
+ DepsTracker deps;
+ expression->addDependencies(&deps);
+ ASSERT_EQ(deps.fields.count("someValue"), 1u);
+ ASSERT_EQ(deps.fields.size(), 1u);
+}
+} // namespace ExpressionToHashedIndexKeyTest
} // namespace ExpressionTests