Files
mongo/jstests/libs/query/join_utils.js
HanaPearlman e1e305c573 SERVER-116535: Prepare jstests for join reordering with cycles (#45974)
GitOrigin-RevId: f27c587200d4d9d00df563ae7eafad2ca00f0df6
2026-01-13 18:36:44 +00:00

41 lines
1.7 KiB
JavaScript

/**
* Utility functions for join optimization tests.
*/
import {getQueryPlanner} from "jstests/libs/query/analyze_plan.js";
import {runWithParamsAllNonConfigNodes} from "jstests/noPassthrough/libs/server_parameter_helpers.js";
// Runs the given test case with join optimization enabled and disabled, verifies that the results
// match expectedResults with UNORDERED comparison, and checks whether the join optimizer was used as expected.
export function runTestWithUnorderedComparison({
description,
coll,
pipeline,
expectedResults,
expectedUsedJoinOptimization,
additionalJoinParams = {},
}) {
print(`Running test: ${description} with additional join params ${additionalJoinParams}`);
const originalResults = runWithParamsAllNonConfigNodes(db, {internalEnableJoinOptimization: false}, () => {
return coll.aggregate(pipeline).toArray();
});
assert.sameMembers(originalResults, expectedResults);
const joinParams = {internalEnableJoinOptimization: true, ...additionalJoinParams};
const joinOptResults = runWithParamsAllNonConfigNodes(db, joinParams, () => {
return coll.aggregate(pipeline).toArray();
});
assert.sameMembers(joinOptResults, expectedResults);
const explain = runWithParamsAllNonConfigNodes(db, joinParams, () => {
return coll.explain().aggregate(pipeline);
});
print(`Explain: ${tojson(explain)}`);
const winningPlan = getQueryPlanner(explain).winningPlan;
const usedJoinOptimization = winningPlan.hasOwnProperty("usedJoinOptimization")
? winningPlan.usedJoinOptimization
: false;
assert.eq(expectedUsedJoinOptimization, usedJoinOptimization, winningPlan);
}