-
Notifications
You must be signed in to change notification settings - Fork 5.6k
/
key_many.js
118 lines (83 loc) · 4.42 KB
/
key_many.js
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
106
107
108
109
110
111
112
113
114
115
116
// key_many.js
// values have to be sorted
types =
[ { name : "string" , values : [ "allan" , "bob" , "eliot" , "joe" , "mark" , "sara" ] , keyfield: "k" } ,
{ name : "double" , values : [ 1.2 , 3.5 , 4.5 , 4.6 , 6.7 , 9.9 ] , keyfield : "a" } ,
{ name : "string_id" , values : [ "allan" , "bob" , "eliot" , "joe" , "mark" , "sara" ] , keyfield : "_id" },
{ name : "embedded" , values : [ "allan" , "bob" , "eliot" , "joe" , "mark" , "sara" ] , keyfield : "a.b" } ,
{ name : "embedded 2" , values : [ "allan" , "bob" , "eliot" , "joe" , "mark" , "sara" ] , keyfield : "a.b.c" } ,
{ name : "object" , values : [ {a:1, b:1.2}, {a:1, b:3.5}, {a:1, b:4.5}, {a:2, b:1.2}, {a:2, b:3.5}, {a:2, b:4.5} ] , keyfield : "o" } ,
]
s = new ShardingTest( "key_many" , 2 );
s.adminCommand( { enablesharding : "test" } )
db = s.getDB( "test" );
primary = s.getServer( "test" ).getDB( "test" );
seconday = s.getOther( primary ).getDB( "test" );
function makeObjectDotted( v ){
var o = {};
o[curT.keyfield] = v;
return o;
}
function makeObject( v ){
var o = {};
var p = o;
var keys = curT.keyfield.split('.');
for(var i=0; i<keys.length-1; i++){
p[keys[i]] = {};
p = p[keys[i]];
}
p[keys[i]] = v;
return o;
}
function getKey( o ){
var keys = curT.keyfield.split('.');
for(var i=0; i<keys.length; i++){
o = o[keys[i]];
}
return o;
}
for ( var i=0; i<types.length; i++ ){
curT = types[i]; //global
print("\n\n#### Now Testing " + curT.name + " ####\n\n");
var shortName = "foo_" + curT.name;
var longName = "test." + shortName;
var c = db[shortName];
s.adminCommand( { shardcollection : longName , key : makeObjectDotted( 1 ) } );
assert.eq( 1 , s.config.chunks.find( { ns : longName } ).count() , curT.name + " sanity check A" );
var unsorted = Array.shuffle( Object.extend( [] , curT.values ) );
c.insert( makeObject( unsorted[0] ) );
for ( var x=1; x<unsorted.length; x++ )
c.save( makeObject( unsorted[x] ) );
assert.eq( 6 , c.find().count() , curT.name + " basic count" );
s.adminCommand( { split : longName , find : makeObjectDotted( curT.values[3] ) } );
s.adminCommand( { split : longName , find : makeObjectDotted( curT.values[3] ) } );
s.adminCommand( { split : longName , find : makeObjectDotted( curT.values[3] ) } );
s.adminCommand( { movechunk : longName , find : makeObjectDotted( curT.values[3] ) , to : seconday.getMongo().name } );
s.printChunks();
assert.eq( 3 , primary[shortName].find().toArray().length , curT.name + " primary count" );
assert.eq( 3 , seconday[shortName].find().toArray().length , curT.name + " secondary count" );
assert.eq( 6 , c.find().toArray().length , curT.name + " total count" );
assert.eq( 6 , c.find().sort( makeObjectDotted( 1 ) ).toArray().length , curT.name + " total count sorted" );
assert.eq( 6 , c.find().sort( makeObjectDotted( 1 ) ).count() , curT.name + " total count with count()" );
assert.eq( curT.values , c.find().sort( makeObjectDotted( 1 ) ).toArray().map( getKey ) , curT.name + " sort 1" );
assert.eq( curT.values.reverse() , c.find().sort( makeObjectDotted( -1 ) ).toArray().map( getKey ) , curT.name + " sort 2" );
assert.eq( 0 , c.find( { xx : 17 } ).sort( { zz : 1 } ).count() , curT.name + " xx 0a " );
assert.eq( 0 , c.find( { xx : 17 } ).sort( makeObjectDotted( 1 ) ).count() , curT.name + " xx 0b " );
assert.eq( 0 , c.find( { xx : 17 } ).count() , curT.name + " xx 0c " );
assert.eq( 0 , c.find( { xx : { $exists : true } } ).count() , curT.name + " xx 1 " );
c.update( makeObjectDotted( curT.values[3] ) , { $set : { xx : 17 } } );
assert.eq( 1 , c.find( { xx : { $exists : true } } ).count() , curT.name + " xx 2 " );
assert.eq( curT.values[3] , getKey( c.findOne( { xx : 17 } ) ) , curT.name + " xx 3 " );
c.ensureIndex( { _id : 1 } , { unique : true } );
assert.eq( null , db.getLastError() , curT.name + " creating _id index should be ok" );
// multi update
var mysum = 0;
c.find().forEach( function(z){ mysum += z.xx || 0; } );
assert.eq( 17 , mysum, curT.name + " multi update pre" );
c.update( {} , { $inc : { xx : 1 } } , false , true );
var mysum = 0;
c.find().forEach( function(z){ mysum += z.xx || 0; } );
assert.eq( 23 , mysum, curT.name + " multi update" );
// TODO remove
}
s.stop();