diff options
Diffstat (limited to 'jstests/core/existsa.js')
-rw-r--r-- | jstests/core/existsa.js | 100 |
1 files changed, 52 insertions, 48 deletions
diff --git a/jstests/core/existsa.js b/jstests/core/existsa.js index 0d2472ca328..466a5e94a63 100644 --- a/jstests/core/existsa.js +++ b/jstests/core/existsa.js @@ -3,99 +3,103 @@ t = db.jstests_existsa; t.drop(); -t.save( {} ); -t.save( { a:1 } ); -t.save( { a:{ x:1 }, b:1 } ); +t.save({}); +t.save({a: 1}); +t.save({a: {x: 1}, b: 1}); /** Configure testing of an index { <indexKeyField>:1 }. */ -function setIndex( _indexKeyField ) { +function setIndex(_indexKeyField) { indexKeyField = _indexKeyField; indexKeySpec = {}; - indexKeySpec[ indexKeyField ] = 1; - t.ensureIndex( indexKeySpec, { sparse:true } ); + indexKeySpec[indexKeyField] = 1; + t.ensureIndex(indexKeySpec, {sparse: true}); } -setIndex( 'a' ); +setIndex('a'); /** @return count when hinting the index to use. */ -function hintedCount( query ) { - return t.find( query ).hint( indexKeySpec ).itcount(); +function hintedCount(query) { + return t.find(query).hint(indexKeySpec).itcount(); } /** The query field does not exist and the sparse index is not used without a hint. */ -function assertMissing( query, expectedMissing, expectedIndexedMissing ) { +function assertMissing(query, expectedMissing, expectedIndexedMissing) { expectedMissing = expectedMissing || 1; expectedIndexedMissing = expectedIndexedMissing || 0; - assert.eq( expectedMissing, t.count( query ) ); + assert.eq(expectedMissing, t.count(query)); // We also shouldn't get a different count depending on whether // an index is used or not. - assert.eq( expectedIndexedMissing, hintedCount( query ) ); + assert.eq(expectedIndexedMissing, hintedCount(query)); } /** The query field exists and the sparse index is used without a hint. */ -function assertExists( query, expectedExists ) { +function assertExists(query, expectedExists) { expectedExists = expectedExists || 2; - assert.eq( expectedExists, t.count( query ) ); + assert.eq(expectedExists, t.count(query)); // An $exists:true predicate generates no index filters. Add another predicate on the index key // to trigger use of the index. andClause = {}; - andClause[ indexKeyField ] = { $ne:null }; - Object.extend( query, { $and:[ andClause ] } ); - assert.eq( expectedExists, t.count( query ) ); - assert.eq( expectedExists, hintedCount( query ) ); + andClause[indexKeyField] = { + $ne: null + }; + Object.extend(query, {$and: [andClause]}); + assert.eq(expectedExists, t.count(query)); + assert.eq(expectedExists, hintedCount(query)); } /** The query field exists and the sparse index is not used without a hint. */ -function assertExistsUnindexed( query, expectedExists ) { +function assertExistsUnindexed(query, expectedExists) { expectedExists = expectedExists || 2; - assert.eq( expectedExists, t.count( query ) ); + assert.eq(expectedExists, t.count(query)); // Even with another predicate on the index key, the sparse index is disallowed. andClause = {}; - andClause[ indexKeyField ] = { $ne:null }; - Object.extend( query, { $and:[ andClause ] } ); - assert.eq( expectedExists, t.count( query ) ); - assert.eq( expectedExists, hintedCount( query ) ); + andClause[indexKeyField] = { + $ne: null + }; + Object.extend(query, {$and: [andClause]}); + assert.eq(expectedExists, t.count(query)); + assert.eq(expectedExists, hintedCount(query)); } // $exists:false queries match the proper number of documents and disallow the sparse index. -assertMissing( { a:{ $exists:false } } ); -assertMissing( { a:{ $not:{ $exists:true } } } ); -assertMissing( { $and:[ { a:{ $exists:false } } ] } ); -assertMissing( { $or:[ { a:{ $exists:false } } ] } ); -assertMissing( { $nor:[ { a:{ $exists:true } } ] } ); -assertMissing( { 'a.x':{ $exists:false } }, 2, 1 ); +assertMissing({a: {$exists: false}}); +assertMissing({a: {$not: {$exists: true}}}); +assertMissing({$and: [{a: {$exists: false}}]}); +assertMissing({$or: [{a: {$exists: false}}]}); +assertMissing({$nor: [{a: {$exists: true}}]}); +assertMissing({'a.x': {$exists: false}}, 2, 1); // Currently a sparse index is disallowed even if the $exists:false query is on a different field. -assertMissing( { b:{ $exists:false } }, 2, 1 ); -assertMissing( { b:{ $exists:false }, a:{ $ne:6 } }, 2, 1 ); -assertMissing( { b:{ $not:{ $exists:true } } }, 2, 1 ); +assertMissing({b: {$exists: false}}, 2, 1); +assertMissing({b: {$exists: false}, a: {$ne: 6}}, 2, 1); +assertMissing({b: {$not: {$exists: true}}}, 2, 1); // Top level $exists:true queries match the proper number of documents // and use the sparse index on { a : 1 }. -assertExists( { a:{ $exists:true } } ); +assertExists({a: {$exists: true}}); // Nested $exists queries match the proper number of documents and disallow the sparse index. -assertExistsUnindexed( { $nor:[ { a:{ $exists:false } } ] } ); -assertExistsUnindexed( { $nor:[ { 'a.x':{ $exists:false } } ] }, 1 ); -assertExistsUnindexed( { a:{ $not:{ $exists:false } } } ); +assertExistsUnindexed({$nor: [{a: {$exists: false}}]}); +assertExistsUnindexed({$nor: [{'a.x': {$exists: false}}]}, 1); +assertExistsUnindexed({a: {$not: {$exists: false}}}); // Nested $exists queries disallow the sparse index in some cases where it is not strictly // necessary to do so. (Descriptive tests.) -assertExistsUnindexed( { $nor:[ { b:{ $exists:false } } ] }, 1 ); // Unindexed field. -assertExists( { $or:[ { a:{ $exists:true } } ] } ); // $exists:true not $exists:false. +assertExistsUnindexed({$nor: [{b: {$exists: false}}]}, 1); // Unindexed field. +assertExists({$or: [{a: {$exists: true}}]}); // $exists:true not $exists:false. // Behavior is similar with $elemMatch. t.drop(); -t.save( { a:[ {} ] } ); -t.save( { a:[ { b:1 } ] } ); -t.save( { a:[ { b:1 } ] } ); -setIndex( 'a.b' ); +t.save({a: [{}]}); +t.save({a: [{b: 1}]}); +t.save({a: [{b: 1}]}); +setIndex('a.b'); -assertMissing( { a:{ $elemMatch:{ b:{ $exists:false } } } } ); +assertMissing({a: {$elemMatch: {b: {$exists: false}}}}); // A $elemMatch predicate is treated as nested, and the index should be used for $exists:true. -assertExists( { a:{ $elemMatch:{ b:{ $exists:true } } } } ); +assertExists({a: {$elemMatch: {b: {$exists: true}}}}); // A non sparse index will not be disallowed. t.drop(); -t.save( {} ); -t.ensureIndex( { a:1 } ); -assert.eq( 1, t.find( { a:{ $exists:false } } ).itcount() ); +t.save({}); +t.ensureIndex({a: 1}); +assert.eq(1, t.find({a: {$exists: false}}).itcount()); |