Files
mongo/jstests/with_mongot/e2e/explain_execution_stats/search_explain.js
Zac 591928c619 SERVER-108478 JS formatted by prettier and remove clang-format (#39656)
GitOrigin-RevId: 6c8f6aded47f260aa4f7c231b17dae3302cb1e04
2025-08-21 17:27:09 +00:00

105 lines
3.2 KiB
JavaScript

/**
* Tests explain for $search.
* @tags: [
* requires_fcv_81,
* ]
*/
import {createSearchIndex, dropSearchIndex} from "jstests/libs/search.js";
import {verifyE2ESearchExplainOutput} from "jstests/with_mongot/e2e_lib/explain_utils.js";
const coll = db[jsTestName()];
coll.drop();
const numFireDocs = 10000;
let docs = [];
for (let i = 0; i < numFireDocs; i++) {
docs.push({_id: i, a: i % 1000, element: "fire"});
}
const numWaterDocs = 15;
for (let i = numFireDocs; i < numFireDocs + numWaterDocs; i++) {
docs.push({_id: i, a: i % 1000, element: "water"});
}
assert.commandWorked(coll.insertMany(docs));
createSearchIndex(coll, {name: "search-index", definition: {"mappings": {"dynamic": true}}});
const fireSearchQuery = {
$search: {
index: "search-index",
text: {query: "fire", path: ["element"]},
},
};
const waterSearchQuery = {
$search: {
index: "search-index",
text: {query: "water", path: ["element"]},
},
};
function runExplainTest(verbosity) {
// Since there are only 15 water documents, no getMore is issued.
let result = coll.explain(verbosity).aggregate([waterSearchQuery]);
verifyE2ESearchExplainOutput({
explainOutput: result,
stageType: "$_internalSearchMongotRemote",
verbosity,
nReturned: NumberLong(numWaterDocs),
});
verifyE2ESearchExplainOutput({
explainOutput: result,
stageType: "$_internalSearchIdLookup",
verbosity,
nReturned: NumberLong(numWaterDocs),
});
// There are 10,000 fire docs, so getMore's are issued.
result = coll.explain(verbosity).aggregate([fireSearchQuery]);
verifyE2ESearchExplainOutput({
explainOutput: result,
stageType: "$_internalSearchMongotRemote",
verbosity,
nReturned: NumberLong(numFireDocs),
});
verifyE2ESearchExplainOutput({
explainOutput: result,
stageType: "$_internalSearchIdLookup",
verbosity,
nReturned: NumberLong(numFireDocs),
});
// Test with $$SEARCH_META variable.
result = coll.explain(verbosity).aggregate([
fireSearchQuery,
{
$project: {
"_id": 0,
"ref_id": "$_id",
"searchMeta": "$$SEARCH_META",
},
},
]);
verifyE2ESearchExplainOutput({
explainOutput: result,
stageType: "$_internalSearchMongotRemote",
verbosity,
nReturned: NumberLong(numFireDocs),
});
verifyE2ESearchExplainOutput({
explainOutput: result,
stageType: "$_internalSearchIdLookup",
verbosity,
nReturned: NumberLong(numFireDocs),
});
// On a sharded cluster, $setVariableFromSubPipeline should be inserted.
if (result.hasOwnProperty("splitPipeline") && result["splitPipeline"] !== null) {
let mergingPipeline = result.splitPipeline.mergerPart;
assert.eq(["$mergeCursors"], Object.keys(mergingPipeline[0]));
assert.eq(["$setVariableFromSubPipeline"], Object.keys(mergingPipeline[1]));
}
}
runExplainTest("queryPlanner");
runExplainTest("executionStats");
runExplainTest("allPlansExecution");
dropSearchIndex(coll, {name: "search-index"});