'use strict'; /** * explain_aggregate.js * * Runs explain() and aggregate() on a collection. * */ load('jstests/concurrency/fsm_libs/extend_workload.js'); // for extendWorkload load('jstests/concurrency/fsm_workloads/explain.js'); // for $config var $config = extendWorkload($config, function($config, $super) { function assertCursorStages(num, obj) { assertAlways(obj.stages, tojson(obj)); assertAlways.eq(num, obj.stages.length, tojson(obj.stages)); assertAlways(obj.stages[0].$cursor, tojson(obj.stages[0])); assertAlways(obj.stages[0].$cursor.hasOwnProperty('queryPlanner'), tojson(obj.stages[0].$cursor)); } $config.states = Object.extend({ explainMatch: function explainMatch(db, collName) { var res = db[collName].explain().aggregate([{$match: {i: this.nInserted / 2}}]); assertAlways.commandWorked(res); // stages reported: $cursor assertCursorStages(1, res); }, explainMatchProject: function explainMatchProject(db, collName) { var res = db[collName].explain().aggregate( [{$match: {i: this.nInserted / 3}}, {$project: {i: 1}}]); assertAlways.commandWorked(res); // stages reported: $cursor, $project assertCursorStages(2, res); } }, $super.states); $config.transitions = Object.extend( {explain: $config.data.assignEqualProbsToTransitions($config.states)}, $super.transitions); return $config; });