diff options
Diffstat (limited to 'src/mongo/db/query/fle/range_predicate.cpp')
-rw-r--r-- | src/mongo/db/query/fle/range_predicate.cpp | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/mongo/db/query/fle/range_predicate.cpp b/src/mongo/db/query/fle/range_predicate.cpp index 7c9be5c90fa..0ebf33790fc 100644 --- a/src/mongo/db/query/fle/range_predicate.cpp +++ b/src/mongo/db/query/fle/range_predicate.cpp @@ -29,7 +29,11 @@ #include "range_predicate.h" +#include <iterator> + #include "mongo/crypto/encryption_fields_gen.h" +#include "mongo/crypto/fle_crypto.h" +#include "mongo/crypto/fle_tags.h" #include "mongo/db/matcher/expression_leaf.h" #include "mongo/db/query/fle/encrypted_predicate.h" @@ -39,29 +43,33 @@ REGISTER_ENCRYPTED_MATCH_PREDICATE_REWRITE_WITH_FLAG(BETWEEN, RangePredicate, gFeatureFlagFLE2Range); -// TODO: SERVER-67206 Generate tags for range payload. std::vector<PrfBlock> RangePredicate::generateTags(BSONValue payload) const { - return {}; + auto parsedPayload = parseFindPayload<ParsedFindRangePayload>(payload); + std::vector<PrfBlock> tags; + for (auto& edge : parsedPayload.edges) { + auto tagsForEdge = readTags(*_rewriter->getEscReader(), + *_rewriter->getEccReader(), + edge.esc, + edge.ecc, + edge.edc, + parsedPayload.maxCounter); + tags.insert(tags.end(), + std::make_move_iterator(tagsForEdge.begin()), + std::make_move_iterator(tagsForEdge.end())); + } + return tags; } std::unique_ptr<MatchExpression> RangePredicate::rewriteToTagDisjunction( MatchExpression* expr) const { invariant(expr->matchType() == MatchExpression::BETWEEN); auto betExpr = static_cast<BetweenMatchExpression*>(expr); - auto ffp = betExpr->rhs(); + auto payload = betExpr->rhs(); - if (!isPayload(ffp)) { + if (!isPayload(payload)) { return nullptr; } - - auto obj = toBSONArray(generateTags(ffp)); - auto tags = std::vector<BSONElement>(); - obj.elems(tags); - auto inExpr = std::make_unique<InMatchExpression>(kSafeContent); - inExpr->setBackingBSON(std::move(obj)); - auto status = inExpr->setEqualities(std::move(tags)); - uassertStatusOK(status); - return inExpr; + return makeTagDisjunction(toBSONArray(generateTags(payload))); } // TODO: SERVER-67209 Server-side rewrite for agg expressions with $between. |