summaryrefslogtreecommitdiff
path: root/jstests/andor.js
blob: 4583608b48155720140ecdcc1a191a7cdd022505 (plain)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// SERVER-1089 Test and/or nesting

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

// not ok
function ok( q ) {
	assert.eq( 1, t.find( q ).itcount() );
}

t.save( {a:1} );

test = function() {
    
    ok( {a:1} );
    
    ok( {$and:[{a:1}]} );
    ok( {$or:[{a:1}]} );
    
    ok( {$and:[{$and:[{a:1}]}]} );
    ok( {$or:[{$or:[{a:1}]}]} );
    
    ok( {$and:[{$or:[{a:1}]}]} );
    ok( {$or:[{$and:[{a:1}]}]} );
    
    ok( {$and:[{$and:[{$or:[{a:1}]}]}]} );
    ok( {$and:[{$or:[{$and:[{a:1}]}]}]} );
    ok( {$or:[{$and:[{$and:[{a:1}]}]}]} );
    
    ok( {$or:[{$and:[{$or:[{a:1}]}]}]} );
    
    // now test $nor
    
    ok( {$and:[{a:1}]} );
    ok( {$nor:[{a:2}]} );
    
    ok( {$and:[{$and:[{a:1}]}]} );
    ok( {$nor:[{$nor:[{a:1}]}]} );
    
    ok( {$and:[{$nor:[{a:2}]}]} );
    ok( {$nor:[{$and:[{a:2}]}]} );
    
    ok( {$and:[{$and:[{$nor:[{a:2}]}]}]} );
    ok( {$and:[{$nor:[{$and:[{a:2}]}]}]} );
    ok( {$nor:[{$and:[{$and:[{a:2}]}]}]} );
    
    ok( {$nor:[{$and:[{$nor:[{a:1}]}]}]} );
    
}

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

// Test an inequality base match.

test = function() {
    
    ok( {a:{$ne:2}} );
    
    ok( {$and:[{a:{$ne:2}}]} );
    ok( {$or:[{a:{$ne:2}}]} );
    
    ok( {$and:[{$and:[{a:{$ne:2}}]}]} );
    ok( {$or:[{$or:[{a:{$ne:2}}]}]} );
    
    ok( {$and:[{$or:[{a:{$ne:2}}]}]} );
    ok( {$or:[{$and:[{a:{$ne:2}}]}]} );
    
    ok( {$and:[{$and:[{$or:[{a:{$ne:2}}]}]}]} );
    ok( {$and:[{$or:[{$and:[{a:{$ne:2}}]}]}]} );
    ok( {$or:[{$and:[{$and:[{a:{$ne:2}}]}]}]} );
    
    ok( {$or:[{$and:[{$or:[{a:{$ne:2}}]}]}]} );
    
    // now test $nor
    
    ok( {$and:[{a:{$ne:2}}]} );
    ok( {$nor:[{a:{$ne:1}}]} );
    
    ok( {$and:[{$and:[{a:{$ne:2}}]}]} );
    ok( {$nor:[{$nor:[{a:{$ne:2}}]}]} );
    
    ok( {$and:[{$nor:[{a:{$ne:1}}]}]} );
    ok( {$nor:[{$and:[{a:{$ne:1}}]}]} );
    
    ok( {$and:[{$and:[{$nor:[{a:{$ne:1}}]}]}]} );
    ok( {$and:[{$nor:[{$and:[{a:{$ne:1}}]}]}]} );
    ok( {$nor:[{$and:[{$and:[{a:{$ne:1}}]}]}]} );
    
    ok( {$nor:[{$and:[{$nor:[{a:{$ne:2}}]}]}]} );
    
}

t.drop();
t.save( {a:1} );
test();
t.ensureIndex( {a:1} );
test();

t.drop();
t.ensureIndex( {a:1} );
var e = t.find( {$and:[{a:1}]} ).explain();
// nested non singleton $or clauses currently ignored for indexing
assert.eq( e.indexBounds, t.find( {$and:[{a:1,$or:[{a:2},{a:3}]}]} ).explain().indexBounds );