diff options
Diffstat (limited to 'src/mongo/db/pipeline/expression.cpp')
-rw-r--r-- | src/mongo/db/pipeline/expression.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/mongo/db/pipeline/expression.cpp b/src/mongo/db/pipeline/expression.cpp index ea28f3e13cc..437fe7d9d45 100644 --- a/src/mongo/db/pipeline/expression.cpp +++ b/src/mongo/db/pipeline/expression.cpp @@ -41,6 +41,7 @@ #include <vector> #include "mongo/db/commands/feature_compatibility_version_documentation.h" +#include "mongo/db/hasher.h" #include "mongo/db/jsobj.h" #include "mongo/db/pipeline/document.h" #include "mongo/db/pipeline/expression_context.h" @@ -6233,4 +6234,35 @@ Value ExpressionRegexMatch::evaluate(const Document& root, Variables* variables) return executionState.nullish() ? Value(false) : Value(execute(&executionState) > 0); } +/* ------------------------- ExpressionToHashedIndexKey -------------------------- */ +REGISTER_EXPRESSION_WITH_MIN_VERSION( + toHashedIndexKey, + ExpressionToHashedIndexKey::parse, + ServerGlobalParams::FeatureCompatibility::Version::kFullyUpgradedTo42); + +boost::intrusive_ptr<Expression> ExpressionToHashedIndexKey::parse( + const boost::intrusive_ptr<ExpressionContext>& expCtx, + BSONElement expr, + const VariablesParseState& vps) { + return new ExpressionToHashedIndexKey(expCtx, parseOperand(expCtx, expr, vps)); +} + +Value ExpressionToHashedIndexKey::evaluate(const Document& root, Variables* variables) const { + Value inpVal(_children[0]->evaluate(root, variables)); + if (inpVal.missing()) { + inpVal = Value(BSONNULL); + } + + return Value(BSONElementHasher::hash64(BSON("" << inpVal).firstElement(), + BSONElementHasher::DEFAULT_HASH_SEED)); +} + +Value ExpressionToHashedIndexKey::serialize(bool explain) const { + return Value(DOC("$toHashedIndexKey" << _children[0]->serialize(explain))); +} + +void ExpressionToHashedIndexKey::_doAddDependencies(DepsTracker* deps) const { + _children[0]->addDependencies(deps); +} + } // namespace mongo |