// testcount is a wrapper around runCount that // - sets up a countStage // - runs it // - asserts count is not trivial // - asserts nCounted is equal to expected_n // - asserts nSkipped is correct void testCount(const CountRequest& request, int expected_n = kDocuments, bool indexed = false) { setup(); getLocs(); unique_ptr<WorkingSet> ws(new WorkingSet); StatusWithMatchExpression statusWithMatcher = MatchExpressionParser::parse(request.getQuery()); ASSERT(statusWithMatcher.isOK()); unique_ptr<MatchExpression> expression = std::move(statusWithMatcher.getValue()); PlanStage* scan; if (indexed) { scan = createIndexScan(expression.get(), ws.get()); } else { scan = createCollScan(expression.get(), ws.get()); } CountStage countStage(&_txn, _coll, request, ws.get(), scan); const CountStats* stats = runCount(countStage); ASSERT_FALSE(stats->trivialCount); ASSERT_EQUALS(stats->nCounted, expected_n); ASSERT_EQUALS(stats->nSkipped, request.getSkip()); }
CountStage::CountStage(OperationContext* txn, Collection* collection, const CountRequest& request, WorkingSet* ws, PlanStage* child) : _txn(txn), _collection(collection), _request(request), _leftToSkip(request.getSkip()), _ws(ws), _child(child), _commonStats(kStageType) { }
CountStage::CountStage(OperationContext* txn, Collection* collection, const CountRequest& request, WorkingSet* ws, PlanStage* child) : PlanStage(kStageType), _txn(txn), _collection(collection), _request(request), _leftToSkip(request.getSkip()), _ws(ws) { if (child) _children.emplace_back(child); }