File: sortl.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 (53 lines) | stat: -rw-r--r-- 1,682 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
49
50
51
52
53
// When one plan among candidate plans of mixed ordering types is cached, and then replayed, and the
// remaining plans are then attempted, those remaining plans are iterated properly for their
// ordering type.  SERVER-5301

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

t.ensureIndex( { a:1 } );
t.ensureIndex( { b:1 } );

function recordIndex( index, query, sort ) {
    // Run a query that records the desired index.
    t.find( query ).sort( sort ).explain();
    // Check that the desired index is recorded.
    assert.eq( 'BtreeCursor ' + index,
              t.find( query ).sort( sort ).explain( true ).oldPlan.cursor );
}

function checkBOrdering( result ) {
    for( i = 1; i < result.length; ++i ) {
        assert.lt( result[ i - 1 ].b, result[ i ].b );
    }
}

// An out of order plan is recorded, then an in order plan takes over.
t.save( { a:1 } );
big = new Array( 1000000 ).toString();
for( i = 0; i < 40; ++i ) {
    t.save( { a:2, b:i, c:big } );
}

recordIndex( 'a_1', { a:1 }, { b:1 } );
result = t.find( { a:2 }, { a:1, b:1 } ).sort( { b:1 } ).toArray();
assert.eq( 40, result.length );
checkBOrdering( result );

// An optimal in order plan is recorded and reused.
recordIndex( 'b_1', { b:{ $gte:0 } }, { b:1 } );
result = t.find( { b:{ $gte:0 } }, { b:1 } ).sort( { b:1 } ).toArray();
assert.eq( 40, result.length );
checkBOrdering( result );

t.remove();

// An in order plan is recorded, then an out of order plan is added.
for( i = 0; i < 20; ++i ) {
    t.save( { a:1, b:19-i } );
}

recordIndex( 'b_1', { a:1, b:{ $gte:19 } }, { b:1 } );
result = t.find( { a:1, b:{ $gte:0 } } ).sort( { b:1 } ).toArray();
assert.eq( 20, result.length );
checkBOrdering( result );