SERVER-113442: Add PathArrayness to ExpCtx in find_cmd for main collection (#43741)

GitOrigin-RevId: 65ff07f82713f35638925be185ce4847b9e3603b
This commit is contained in:
Naafiyan Ahmed 2025-12-09 18:53:58 -05:00 committed by MongoDB Bot
parent b74a970571
commit 1044486adf
6 changed files with 38 additions and 17 deletions

View File

@ -73,6 +73,7 @@
#include "mongo/db/query/client_cursor/cursor_response.h" #include "mongo/db/query/client_cursor/cursor_response.h"
#include "mongo/db/query/collation/collator_factory_interface.h" #include "mongo/db/query/collation/collator_factory_interface.h"
#include "mongo/db/query/collation/collator_interface.h" #include "mongo/db/query/collation/collator_interface.h"
#include "mongo/db/query/collection_query_info.h"
#include "mongo/db/query/compiler/parsers/matcher/expression_parser.h" #include "mongo/db/query/compiler/parsers/matcher/expression_parser.h"
#include "mongo/db/query/explain.h" #include "mongo/db/query/explain.h"
#include "mongo/db/query/explain_diagnostic_printer.h" #include "mongo/db/query/explain_diagnostic_printer.h"
@ -188,10 +189,13 @@ std::unique_ptr<CanonicalQuery> parseQueryAndBeginOperation(
const auto& collection = collOrViewAcquisition.getCollectionPtr(); const auto& collection = collOrViewAcquisition.getCollectionPtr();
const auto* collator = collection ? collection->getDefaultCollator() : nullptr; const auto* collator = collection ? collection->getDefaultCollator() : nullptr;
auto expCtx = ExpressionContextBuilder{} auto expCtx =
.fromRequest(opCtx, *findCommand, collator, allowDiskUseByDefault.load()) ExpressionContextBuilder{}
.tmpDir(boost::filesystem::path(storageGlobalParams.dbpath) / "_tmp") .fromRequest(opCtx, *findCommand, collator, allowDiskUseByDefault.load())
.build(); .tmpDir(boost::filesystem::path(storageGlobalParams.dbpath) / "_tmp")
.mainCollPathArrayness(
collection ? CollectionQueryInfo::get(collection).getPathArrayness() : nullptr)
.build();
expCtx->startExpressionCounters(); expCtx->startExpressionCounters();
auto parsedRequest = uassertStatusOK(parsed_find_command::parse( auto parsedRequest = uassertStatusOK(parsed_find_command::parse(
expCtx, expCtx,
@ -521,6 +525,9 @@ public:
.fromRequest(opCtx, *_cmdRequest, collator, allowDiskUseByDefault.load()) .fromRequest(opCtx, *_cmdRequest, collator, allowDiskUseByDefault.load())
.explain(verbosity) .explain(verbosity)
.tmpDir(boost::filesystem::path(storageGlobalParams.dbpath) / "_tmp") .tmpDir(boost::filesystem::path(storageGlobalParams.dbpath) / "_tmp")
.mainCollPathArrayness(
collectionPtr ? CollectionQueryInfo::get(collectionPtr).getPathArrayness()
: nullptr)
.build(); .build();
expCtx->startExpressionCounters(); expCtx->startExpressionCounters();

View File

@ -48,6 +48,7 @@
#include "mongo/db/pipeline/variables.h" #include "mongo/db/pipeline/variables.h"
#include "mongo/db/query/collation/collation_spec.h" #include "mongo/db/query/collation/collation_spec.h"
#include "mongo/db/query/collation/collator_interface.h" #include "mongo/db/query/collation/collator_interface.h"
#include "mongo/db/query/compiler/metadata/path_arrayness.h"
#include "mongo/db/query/datetime/date_time_support.h" #include "mongo/db/query/datetime/date_time_support.h"
#include "mongo/db/query/explain_options.h" #include "mongo/db/query/explain_options.h"
#include "mongo/db/query/query_feature_flags_gen.h" #include "mongo/db/query/query_feature_flags_gen.h"
@ -1019,6 +1020,17 @@ public:
return _featureFlagMqlJsEngineGap.get(VersionContext::getDecoration(getOperationContext())); return _featureFlagMqlJsEngineGap.get(VersionContext::getDecoration(getOperationContext()));
} }
const PathArrayness& getMainCollPathArrayness() const {
// mainCollPathArrayness will be unset in cases where we do not do a collection acquisition,
// e.g. if running on a 'mongos'. In this case, we return an empty instance of
// 'PathArrayness' that denotes all paths as arrays.
if (!_params.mainCollPathArrayness) {
static const auto kEmptyPathArrayness = PathArrayness();
return kEmptyPathArrayness;
}
return *_params.mainCollPathArrayness;
}
protected: protected:
struct ExpressionContextParams { struct ExpressionContextParams {
OperationContext* opCtx = nullptr; OperationContext* opCtx = nullptr;
@ -1160,6 +1172,10 @@ protected:
// Indicates that the query is replanned after being rate-limited. // Indicates that the query is replanned after being rate-limited.
bool wasRateLimited = false; bool wasRateLimited = false;
// The PathArrayness information for the main collection. This may remain unset if a
// collection acquisition is not possible, e.g. when running on mongos.
std::shared_ptr<const PathArrayness> mainCollPathArrayness = nullptr;
}; };
ExpressionContextParams _params; ExpressionContextParams _params;

View File

@ -392,6 +392,12 @@ ExpressionContextBuilder& ExpressionContextBuilder::tailableMode(TailableModeEnu
return *this; return *this;
} }
ExpressionContextBuilder& ExpressionContextBuilder::mainCollPathArrayness(
std::shared_ptr<const PathArrayness> mainCollPathArrayness) {
params.mainCollPathArrayness = mainCollPathArrayness;
return *this;
}
ExpressionContextBuilder& ExpressionContextBuilder::fromRequest( ExpressionContextBuilder& ExpressionContextBuilder::fromRequest(
OperationContext* operationContext, OperationContext* operationContext,
const FindCommandRequest& request, const FindCommandRequest& request,

View File

@ -105,6 +105,8 @@ public:
boost::optional<std::pair<NamespaceString, std::vector<BSONObj>>>); boost::optional<std::pair<NamespaceString, std::vector<BSONObj>>>);
ExpressionContextBuilder& originalNs(NamespaceString); ExpressionContextBuilder& originalNs(NamespaceString);
ExpressionContextBuilder& isHybridSearch(bool); ExpressionContextBuilder& isHybridSearch(bool);
ExpressionContextBuilder& mainCollPathArrayness(
std::shared_ptr<const PathArrayness> mainCollPathArrayness);
/** /**
* Add kSessionTransactionsTableNamespace, and kRsOplogNamespace * Add kSessionTransactionsTableNamespace, and kRsOplogNamespace

View File

@ -29,6 +29,8 @@
#include "mongo/db/query/compiler/metadata/path_arrayness.h" #include "mongo/db/query/compiler/metadata/path_arrayness.h"
#include "mongo/logv2/log.h"
#include <stack> #include <stack>
using namespace mongo::multikey_paths; using namespace mongo::multikey_paths;
@ -126,10 +128,4 @@ void PathArrayness::TrieNode::insertPath(const FieldPath& path,
// Recursively invoke the remaining path. // Recursively invoke the remaining path.
_children.at(fieldNameToInsert).insertPath(path, multikeyPath, ++depth); _children.at(fieldNameToInsert).insertPath(path, multikeyPath, ++depth);
} }
PathArrayness build(std::vector<IndexEntry> entries) {
PathArrayness root;
return root;
}
} // namespace mongo } // namespace mongo

View File

@ -29,8 +29,8 @@
#pragma once #pragma once
#include "mongo/db/index/multikey_paths.h"
#include "mongo/db/pipeline/field_path.h" #include "mongo/db/pipeline/field_path.h"
#include "mongo/db/query/compiler/metadata/index_entry.h"
#include "mongo/util/modules.h" #include "mongo/util/modules.h"
namespace mongo { namespace mongo {
@ -140,10 +140,4 @@ private:
*/ */
TrieNode _root; TrieNode _root;
}; };
/**
* Build an arrayness trie from a given vector of index entries.
*/
PathArrayness build(std::vector<IndexEntry> entries);
} // namespace mongo } // namespace mongo