File: orp.js

package info (click to toggle)
mongodb 1%3A2.4.10-5
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 82,464 kB
  • sloc: cpp: 740,225; ansic: 152,098; sh: 13,820; python: 11,864; makefile: 1,012; perl: 922; pascal: 617; java: 452; lisp: 222; asm: 174
file content (48 lines) | stat: -rw-r--r-- 1,771 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Delete and update work properly when the document to be modified is the first of a new unindexed
// $or clause.  SERVER-5198

t = db.jstests_orp;
t.drop();

function verifyExpectedQueryPlan( query ) {
    explain = t.find( query ).explain();
    assert.eq( 'BtreeCursor a_1', explain.clauses[ 0 ].cursor );
    assert.eq( 'BasicCursor', explain.clauses[ 1 ].cursor );
}

function checkAdvanceWithWriteOp( writeOp ) {
    t.drop();
   
    for( i = 0; i < 120; ++i ) {
        t.insert( { a:119-i, b:2 } );
    }

    t.ensureIndex( { a:1 } );

    // The presence of an index on the b field causes the query below to generate query plans for
    // each $or clause iteratively rather than run a simple unindexed query plan.
    t.ensureIndex( { c:1, b:1 } );

    // The cursors traversed for this $or query will be a:1, $natural:1.  The second clause will run
    // as an unindexed scan because no index has b as its first field.  The a:119 document will
    // be the last document of the first clause and the first document of the (unindexed) second
    // clause.
    query = { $or:[ { a:{ $gte:0 } }, { b:2 } ] };
    verifyExpectedQueryPlan( query );
    writeOp( query );
    assert( !db.getLastError() );
    assert.eq( 120, db.getLastErrorObj().n );
}

// Remove.
checkAdvanceWithWriteOp( function( query ) { t.remove( query ); } );
// The documents were removed.
assert.eq( 0, t.count() );
assert.eq( 0, t.find().itcount() );

// Update - add a large field so the document will move.
big = new Array( 10000 ).toString();
checkAdvanceWithWriteOp( function( query ) { t.update( query, { $push:{ z:big } }, false,
                                                      true ); } );
// The documents were updated.
assert.eq( 120, t.count( { z:{ $size:1 } } ) );