summaryrefslogtreecommitdiff
path: root/src/mongo/db/query/fle/range_predicate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/query/fle/range_predicate.cpp')
-rw-r--r--src/mongo/db/query/fle/range_predicate.cpp34
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.