diff options
Diffstat (limited to 'src/mongo/db/pipeline/document_source_match.cpp')
-rw-r--r-- | src/mongo/db/pipeline/document_source_match.cpp | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/src/mongo/db/pipeline/document_source_match.cpp b/src/mongo/db/pipeline/document_source_match.cpp index 8cef470c453..e34d9f2d1a5 100644 --- a/src/mongo/db/pipeline/document_source_match.cpp +++ b/src/mongo/db/pipeline/document_source_match.cpp @@ -34,6 +34,7 @@ #include "mongo/db/matcher/expression_algo.h" #include "mongo/db/matcher/expression_array.h" #include "mongo/db/matcher/expression_leaf.h" +#include "mongo/db/matcher/expression_parser.h" #include "mongo/db/matcher/extensions_callback_noop.h" #include "mongo/db/pipeline/document.h" #include "mongo/db/pipeline/expression.h" @@ -196,30 +197,31 @@ Document redactSafePortionDollarOps(BSONObj expr) { continue; } - switch (BSONObj::MatchType(field.getGtLtOp(BSONObj::Equality))) { + switch (*MatchExpressionParser::parsePathAcceptingKeyword(field, + PathAcceptingKeyword::EQUALITY)) { // These are always ok - case BSONObj::opTYPE: - case BSONObj::opREGEX: - case BSONObj::opOPTIONS: - case BSONObj::opMOD: - case BSONObj::opBITS_ALL_SET: - case BSONObj::opBITS_ALL_CLEAR: - case BSONObj::opBITS_ANY_SET: - case BSONObj::opBITS_ANY_CLEAR: + case PathAcceptingKeyword::TYPE: + case PathAcceptingKeyword::REGEX: + case PathAcceptingKeyword::OPTIONS: + case PathAcceptingKeyword::MOD: + case PathAcceptingKeyword::BITS_ALL_SET: + case PathAcceptingKeyword::BITS_ALL_CLEAR: + case PathAcceptingKeyword::BITS_ANY_SET: + case PathAcceptingKeyword::BITS_ANY_CLEAR: output[field.fieldNameStringData()] = Value(field); break; // These are ok if the type of the rhs is allowed in comparisons - case BSONObj::LTE: - case BSONObj::GTE: - case BSONObj::LT: - case BSONObj::GT: + case PathAcceptingKeyword::LESS_THAN_OR_EQUAL: + case PathAcceptingKeyword::GREATER_THAN_OR_EQUAL: + case PathAcceptingKeyword::LESS_THAN: + case PathAcceptingKeyword::GREATER_THAN: if (isTypeRedactSafeInComparison(field.type())) output[field.fieldNameStringData()] = Value(field); break; // $in must be all-or-nothing (like $or). Can't include subset of elements. - case BSONObj::opIN: { + case PathAcceptingKeyword::IN_EXPR: { bool allOk = true; BSONForEach(elem, field.Obj()) { if (!isTypeRedactSafeInComparison(elem.type())) { @@ -234,7 +236,7 @@ Document redactSafePortionDollarOps(BSONObj expr) { break; } - case BSONObj::opALL: { + case PathAcceptingKeyword::ALL: { // $all can include subset of elements (like $and). vector<Value> matches; BSONForEach(elem, field.Obj()) { @@ -249,7 +251,7 @@ Document redactSafePortionDollarOps(BSONObj expr) { break; } - case BSONObj::opELEM_MATCH: { + case PathAcceptingKeyword::ELEM_MATCH: { BSONObj subIn = field.Obj(); Document subOut; if (subIn.firstElementFieldName()[0] == '$') { @@ -265,20 +267,20 @@ Document redactSafePortionDollarOps(BSONObj expr) { } // These are never allowed - case BSONObj::Equality: // This actually means unknown - case BSONObj::opNEAR: - case BSONObj::NE: - case BSONObj::opSIZE: - case BSONObj::NIN: - case BSONObj::opEXISTS: - case BSONObj::opWITHIN: - case BSONObj::opGEO_INTERSECTS: - case BSONObj::opINTERNAL_SCHEMA_MIN_ITEMS: - case BSONObj::opINTERNAL_SCHEMA_MAX_ITEMS: - case BSONObj::opINTERNAL_SCHEMA_UNIQUE_ITEMS: - case BSONObj::opINTERNAL_SCHEMA_OBJECT_MATCH: - case BSONObj::opINTERNAL_SCHEMA_MIN_LENGTH: - case BSONObj::opINTERNAL_SCHEMA_MAX_LENGTH: + case PathAcceptingKeyword::EQUALITY: // This actually means unknown + case PathAcceptingKeyword::GEO_NEAR: + case PathAcceptingKeyword::NOT_EQUAL: + case PathAcceptingKeyword::SIZE: + case PathAcceptingKeyword::NOT_IN: + case PathAcceptingKeyword::EXISTS: + case PathAcceptingKeyword::WITHIN: + case PathAcceptingKeyword::GEO_INTERSECTS: + case PathAcceptingKeyword::INTERNAL_SCHEMA_MIN_ITEMS: + case PathAcceptingKeyword::INTERNAL_SCHEMA_MAX_ITEMS: + case PathAcceptingKeyword::INTERNAL_SCHEMA_UNIQUE_ITEMS: + case PathAcceptingKeyword::INTERNAL_SCHEMA_OBJECT_MATCH: + case PathAcceptingKeyword::INTERNAL_SCHEMA_MIN_LENGTH: + case PathAcceptingKeyword::INTERNAL_SCHEMA_MAX_LENGTH: continue; } } |