diff options
Diffstat (limited to 'src/mongo/db/matcher/expression_leaf.h')
-rw-r--r-- | src/mongo/db/matcher/expression_leaf.h | 50 |
1 files changed, 37 insertions, 13 deletions
diff --git a/src/mongo/db/matcher/expression_leaf.h b/src/mongo/db/matcher/expression_leaf.h index 015dae13010..4359b6f1c3c 100644 --- a/src/mongo/db/matcher/expression_leaf.h +++ b/src/mongo/db/matcher/expression_leaf.h @@ -812,12 +812,20 @@ public: std::string name() const; - void setInputParamId(InputParamId paramId) { - _inputParamId = paramId; + void setBitPositionsParamId(InputParamId paramId) { + _bitPositionsParamId = paramId; } - boost::optional<InputParamId> getInputParamId() const { - return _inputParamId; + void setBitMaskParamId(InputParamId paramId) { + _bitMaskParamId = paramId; + } + + boost::optional<InputParamId> getBitPositionsParamId() const { + return _bitPositionsParamId; + } + + boost::optional<InputParamId> getBitMaskParamId() const { + return _bitMaskParamId; } private: @@ -852,7 +860,11 @@ private: // Used to perform bit tests against numbers using a single bitwise operation. uint64_t _bitMask = 0; - boost::optional<InputParamId> _inputParamId; + // When this expression is parameterized, we require two parmeter markers, not one: a parameter + // marker for the vector of bit positions and a second for the bitmask. The runtime plan + // needs both values so that it can operate against either BinData or numerical inputs. + boost::optional<InputParamId> _bitPositionsParamId; + boost::optional<InputParamId> _bitMaskParamId; }; class BitsAllSetMatchExpression : public BitTestMatchExpression { @@ -881,8 +893,11 @@ public: if (getTag()) { bitTestMatchExpression->setTag(getTag()->clone()); } - if (getInputParamId()) { - bitTestMatchExpression->setInputParamId(*getInputParamId()); + if (getBitPositionsParamId()) { + bitTestMatchExpression->setBitPositionsParamId(*getBitPositionsParamId()); + } + if (getBitMaskParamId()) { + bitTestMatchExpression->setBitMaskParamId(*getBitMaskParamId()); } return bitTestMatchExpression; } @@ -922,8 +937,11 @@ public: if (getTag()) { bitTestMatchExpression->setTag(getTag()->clone()); } - if (getInputParamId()) { - bitTestMatchExpression->setInputParamId(*getInputParamId()); + if (getBitPositionsParamId()) { + bitTestMatchExpression->setBitPositionsParamId(*getBitPositionsParamId()); + } + if (getBitMaskParamId()) { + bitTestMatchExpression->setBitMaskParamId(*getBitMaskParamId()); } return bitTestMatchExpression; } @@ -963,8 +981,11 @@ public: if (getTag()) { bitTestMatchExpression->setTag(getTag()->clone()); } - if (getInputParamId()) { - bitTestMatchExpression->setInputParamId(*getInputParamId()); + if (getBitPositionsParamId()) { + bitTestMatchExpression->setBitPositionsParamId(*getBitPositionsParamId()); + } + if (getBitMaskParamId()) { + bitTestMatchExpression->setBitMaskParamId(*getBitMaskParamId()); } return bitTestMatchExpression; } @@ -1004,8 +1025,11 @@ public: if (getTag()) { bitTestMatchExpression->setTag(getTag()->clone()); } - if (getInputParamId()) { - bitTestMatchExpression->setInputParamId(*getInputParamId()); + if (getBitPositionsParamId()) { + bitTestMatchExpression->setBitPositionsParamId(*getBitPositionsParamId()); + } + if (getBitMaskParamId()) { + bitTestMatchExpression->setBitMaskParamId(*getBitMaskParamId()); } return bitTestMatchExpression; } |