// 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());
    }
Beispiel #2
0
 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) { }
Beispiel #3
0
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);
}