1
- function checkConsistency ( rule , collection , agg ) {
2
- var r = db . getCollection ( collection ) . aggregate ( agg ) . toArray ( ) ;
1
+ function checkConsistency ( rule , collection , agg , sample = false ) {
2
+ agg . push ( { $count :"c" } ) ;
3
+ if ( sample ) {
4
+ var c = db . WAREHOUSE . count ( ) ;
5
+ var start = Math . round ( Math . random ( ) * c ) ;
6
+ var firstStage = { $match :{ } } ;
7
+ var wid = "W_ID" ;
8
+ var did = "D_ID" ;
9
+ if ( collection == "NEW_ORDER" ) {
10
+ wid = "NO_" + wid ;
11
+ did = "NO_" + did ;
12
+ } else if ( collection == "WAREHOUSE" ) {
13
+ did = collection [ 0 ] + "_" + did ;
14
+ } else if ( collection == "DISTRICT" ) {
15
+ wid = collection [ 0 ] + "_" + wid ;
16
+ } else {
17
+ wid = collection [ 0 ] + "_" + wid ;
18
+ did = collection [ 0 ] + "_" + did ;
19
+ }
20
+ firstStage [ "$match" ] [ wid ] = start ;
21
+ /* firstStage["$match"][did]=(start%10)+1; */
22
+ agg . unshift ( firstStage ) ;
23
+ }
24
+ var r = db . getCollection ( collection ) . aggregate ( agg , { maxTimeMS :60000 } ) . toArray ( ) ;
3
25
if ( r . length != 0 ) {
4
26
print ( "Consistency rule " + rule + " failed with count " + r [ 0 ] [ "c" ] ) ;
5
27
}
@@ -8,117 +30,115 @@ function checkConsistency(rule, collection, agg) {
8
30
c = [ ] ;
9
31
c [ 1 ] = { r :"1" , c :"WAREHOUSE" , pipeline : [
10
32
{ $lookup :{
11
- from :"DISTRICT" ,
12
- as :"d" ,
13
- localField :"W_ID" ,
33
+ from :"DISTRICT" ,
34
+ as :"d" ,
35
+ localField :"W_ID" ,
14
36
foreignField :"D_W_ID" } } ,
15
37
{ $match :{ $expr :{ $ne :[ 0 , { $toLong :{ $subtract :[ "$W_YTD" , { $sum :"$d.D_YTD" } ] } } ] } } } ,
16
- { $count :"c" }
17
38
] } ;
18
39
// consistency check 2
19
40
c [ 2 ] = { r :"2" , c :"DISTRICT" , pipeline : [
20
41
{ $project :{ w :"$D_W_ID" , d :"$D_ID" , next :"$D_NEXT_O_ID" } } ,
21
42
{ $lookup :{ from :"ORDERS" , as :"maxOID" , let :{ w :"$w" , d :"$d" } , pipeline :[
22
43
{ $match :{ $expr :{ $and :[ { $eq :[ "$$w" , "$O_W_ID" ] } , { $eq :[ "$$d" , "$O_D_ID" ] } ] } } } ,
23
- { $group :{ _id :0 , maxO :{ $max :"$O_ID" } } } ] } } ,
24
- { $unwind :"$maxOID" } ,
44
+ { $sort :{ "O_ID" :- 1 } } ,
45
+ { $limit :1 } ,
46
+ { $group :{ _id :0 , maxO :{ $first :"$O_ID" } } } ] } } ,
47
+ { $unwind :"$maxOID" } ,
25
48
{ $lookup :{ from :"NEW_ORDER" , as :"maxNOID" , let :{ w :"$w" , d :"$d" } , pipeline :[
26
49
{ $match :{ $expr :{ $and :[ { $eq :[ "$$w" , "$NO_W_ID" ] } , { $eq :[ "$$d" , "$NO_D_ID" ] } ] } } } ,
50
+ { $sort :{ "NO_O_ID" :- 1 } } ,
51
+ { $limit :1 } ,
27
52
{ $group :{ _id :0 , maxO :{ $max :"$NO_O_ID" } } } ] } } ,
28
- { $unwind :"$maxNOID" } ,
53
+ { $unwind :"$maxNOID" } ,
29
54
{ $match :{ $or :[ { $expr :{ $ne :[ "$maxOID.maxO" , "$maxNOID.maxO" ] } } , { $expr :{ $ne :[ "$maxOID.maxO" , { $subtract :[ "$next" , 1 ] } ] } } ] } } ,
30
- { $count :"c" }
31
55
] } ;
32
56
// consistency check 3
33
- c [ 3 ] = { r :"3" , c :"NEW_ORDER" , pipeline :[
57
+ c [ 3 ] = { r :"3" , c :"NEW_ORDER" , pipeline :[
34
58
{ $group :{ _id :{ w :"$NO_W_ID" , d :"$NO_D_ID" } , min :{ $min :"$NO_O_ID" } , max :{ $max :"$NO_O_ID" } , count :{ $sum :1 } } } ,
35
59
{ $project :{ count :1 , diff :{ $add :[ 1 , { $subtract :[ "$max" , "$min" ] } ] } } } ,
36
60
{ $match :{ $expr :{ $ne :[ "$count" , "$diff" ] } } } ,
37
- { $count :"c" }
38
61
] } ;
39
62
// consistency check 4
40
- c [ 4 ] = { r :"4" , c :"ORDERS" , pipeline :[
63
+ c [ 4 ] = { r :"4" , c :"ORDERS" , pipeline :[
41
64
{ $sort :{ O_W_ID :1 , O_D_ID :1 } } ,
65
+ { $limit :10000 } ,
42
66
{ $group :{ _id :{ w :"$O_W_ID" , d :"$O_D_ID" } , O_CLs :{ $sum :"$O_OL_CNT" } , OL_CLs :{ $sum :{ $size :"$ORDER_LINE" } } } } ,
43
67
{ $match :{ $expr :{ $ne :[ "$O_CLs" , "$OL_CLs" ] } } } ,
44
- { $count :"c" }
45
68
] } ;
46
69
// consistency check 5
47
- c [ 5 ] = { r :"5" , c :"ORDERS" , pipeline :[
70
+ c [ 5 ] = { r :"5" , c :"ORDERS" , pipeline :[
48
71
{ $match :{ O_CARRIER_ID :0 } } ,
72
+ { $sort :{ O_ID :- 1 } } ,
73
+ { $limit :10000 } ,
49
74
{ $lookup :{ from :"NEW_ORDER" , as :"NO_count" , let :{ w :"$O_W_ID" , d :"$O_D_ID" , o :"$O_ID" } , pipeline :[
50
75
{ $match :{ $expr :{ $and :[ { $eq :[ "$$w" , "$NO_W_ID" ] } , { $eq :[ "$$d" , "$NO_D_ID" ] } , { $eq :[ "$$o" , "$NO_O_ID" ] } ] } } } ,
51
76
{ $count :"c" } ] } } ,
52
77
{ $addFields :{ count :{ $ifNull :[ { $arrayElemAt :[ "$NO_count.c" , 0 ] } , 0 ] } } } ,
53
78
{ $match :{ "count" :{ $ne :1 } } } ,
54
- { $count :"c" }
55
79
] } ;
56
80
// consistency check 6
57
- c [ 6 ] = { r :"6" , c :"ORDERS" , pipeline :[
81
+ c [ 6 ] = { r :"6" , c :"ORDERS" , pipeline :[
82
+ { $limit :10000 } ,
58
83
{ $match :{ $expr :{ $ne :[ "$O_OL_CNT" , { $size :"$ORDER_LINE" } ] } } } ,
59
- { $count :"c" }
60
84
] } ;
61
85
// consistency check 7
62
- c [ 7 ] = { r :"7" , c :"ORDERS" , pipeline :[
86
+ c [ 7 ] = { r :"7" , c :"ORDERS" , pipeline :[
87
+ { $limit :10000 } ,
63
88
{ $match :{ O_CARRIER_ID :{ $ne :0 } , "ORDER_LINE.OL_DELIVERY_D" :null } } ,
64
- { $count :"c" }
65
89
] } ;
66
- // consistency
67
- c [ 8 ] = { r :"8" , c :"HISTORY" , pipeline :[
68
- { $group :{ _id :"$H_W_ID" , sum :{ $sum :{ $toDecimal :"$H_AMOUNT" } } } } ,
90
+ // consistency
91
+ c [ 8 ] = { r :"8" , c :"HISTORY" , pipeline :[
92
+ { $group :{ _id :"$H_W_ID" , sum :{ $sum :{ $toDecimal :"$H_AMOUNT" } } } } ,
69
93
{ $lookup :{ from :"WAREHOUSE" , localField :"_id" , foreignField :"W_ID" , as :"w" } } ,
70
- { $match :{ $expr :{ $ne :[ 0 , { $toLong :{ $subtract :[ "$sum" , { $arrayElemAt :[ "$w.W_YTD" , 0 ] } ] } } ] } } } ,
71
- { $count :"c" }
94
+ { $match :{ $expr :{ $ne :[ 0 , { $toLong :{ $subtract :[ "$sum" , { $arrayElemAt :[ "$w.W_YTD" , 0 ] } ] } } ] } } } ,
72
95
] } ;
73
96
// consistency check 9
74
- c [ 9 ] = { r :"9" , c :"HISTORY" , pipeline :[
75
- { $group :{ _id :{ w :"$H_W_ID" , d :"$H_D_ID" } , sum :{ $sum :{ $toDecimal :"$H_AMOUNT" } } } } ,
76
- { $lookup :{ from :"DISTRICT" , as :"d" , let :{ w : "$_id.w" , d :"$_id.d" } , pipeline :[
77
- { $match : { $expr : { $and : [ { $eq : [ "$$w" , "$D_W_ID" ] } , { $eq :[ "$$d" , "$D_ID" ] } ] } } } ,
78
- { $group :{ _id :0 , sum :{ $sum :{ $toDecimal :"$D_YTD" } } } } ] } } ,
97
+ c [ 9 ] = { r :"9" , c :"HISTORY" , pipeline :[
98
+ { $group :{ _id :{ w :"$H_W_ID" , d :"$H_D_ID" } , sum :{ $sum :{ $toDecimal :"$H_AMOUNT" } } } } ,
99
+ { $lookup :{ from :"DISTRICT" , as :"d" , let :{ w : "$_id.w" , d :"$_id.d" } , pipeline :[
100
+ { $match : { $expr : { $and : [ { $eq : [ "$$w" , "$D_W_ID" ] } , { $eq :[ "$$d" , "$D_ID" ] } ] } } } ,
101
+ { $group :{ _id :0 , sum :{ $sum :{ $toDecimal :"$D_YTD" } } } } ] } } ,
79
102
{ $match :{ $expr :{ $ne :[ { $toLong :"$sum" } , { $toLong :{ $arrayElemAt :[ "$d.sum" , 0 ] } } ] } } } ,
80
- { $count :"c" }
81
103
] } ;
82
104
// *** consistency check 10 don't run unless there is an index
83
105
/* adding one warehouse filter to limit checking, needed to add index to HISTORY.H_W_ID,etc to make reasonably fast even on one */
84
- c [ 10 ] = { r :"10" , c :"CUSTOMER" , pipeline :[
85
- { $match :{ C_W_ID :1 } } ,
86
- { $lookup :{ from :"ORDERS" , as :"o" , let :{ w : "$C_W_ID" , d :"$C_D_ID" , c :"$C_ID" } , pipeline :[
87
- { $match : { O_CARRIER_ID :{ $ne :0 } , $expr : { $and : [ { $eq : [ "$$w" , "$O_W_ID" ] } , { $eq :[ "$$d" , "$O_D_ID" ] } , { $eq :[ "$$c" , "$O_C_ID" ] } ] } } } ,
106
+ c [ 10 ] = { r :"10" , c :"CUSTOMER" , pipeline :[
107
+ { $match :{ C_W_ID :1 , C_D_ID : 1 , C_ID : { $lt : 100 , $gt : 80 } } } ,
108
+ { $lookup :{ from :"ORDERS" , as :"o" , let :{ w : "$C_W_ID" , d :"$C_D_ID" , c :"$C_ID" } , pipeline :[
109
+ { $match : { O_CARRIER_ID :{ $ne :0 } , $expr : { $and : [ { $eq : [ "$$w" , "$O_W_ID" ] } , { $eq :[ "$$d" , "$O_D_ID" ] } , { $eq :[ "$$c" , "$O_C_ID" ] } ] } } } ,
88
110
{ $group :{ _id :0 , sum :{ $sum :{ $sum :"$ORDER_LINE.OL_AMOUNT" } } } } ] } } ,
89
- { $lookup :{ from :"HISTORY" , as :"h" , let :{ w : "$C_W_ID" , d :"$C_D_ID" , c :"$C_ID" } , pipeline :[
90
- { $match : { $expr : { $and : [ { $eq : [ "$$w" , "$H_W_ID" ] } , { $eq :[ "$$d" , "$H_D_ID" ] } , { $eq :[ "$$c" , "$H_C_ID" ] } ] } } } ,
91
- { $group :{ _id :0 , sum :{ $sum :"$H_AMOUNT" } } } ] } } ,
111
+ { $lookup :{ from :"HISTORY" , as :"h" , let :{ w : "$C_W_ID" , d :"$C_D_ID" , c :"$C_ID" } , pipeline :[
112
+ { $match : { $expr : { $and : [ { $eq : [ "$$w" , "$H_W_ID" ] } , { $eq :[ "$$d" , "$H_D_ID" ] } , { $eq :[ "$$c" , "$H_C_ID" ] } ] } } } ,
113
+ { $group :{ _id :0 , sum :{ $sum :"$H_AMOUNT" } } } ] } } ,
92
114
{ $project :{ C_BALANCE :1 , OSUM :{ $ifNull :[ { $arrayElemAt :[ "$o.sum" , 0 ] } , 0 ] } , HSUM :{ $arrayElemAt :[ "$h.sum" , 0 ] } , _id :0 , C_ID :1 , C_W_ID :1 , C_D_ID :1 } } ,
93
115
{ $match :{ $expr :{ $ne :[ "$C_BALANCE" , { $subtract :[ "$OSUM" , "$HSUM" ] } ] } } } ,
94
- { $count :"c" }
95
116
] } ;
96
117
// *** consistency check 11 Correct when first loaded!
97
- c [ 11 ] = { r :"11" , c :"DISTRICT" , pipeline :[
98
- { $project :{ w :"$D_W_ID" , d :"$D_ID" } } ,
118
+ c [ 11 ] = { r :"11" , c :"DISTRICT" , pipeline :[
119
+ { $project :{ w :"$D_W_ID" , d :"$D_ID" } } ,
99
120
{ $lookup :{ from :"ORDERS" , as :"o" , let :{ w :"$w" , d :"$d" } , pipeline :[
100
121
{ $match :{ $expr :{ $and :[ { $eq :[ "$$w" , "$O_W_ID" ] } , { $eq :[ "$$d" , "$O_D_ID" ] } ] } } } ,
101
122
{ $count :"c" } ] } } ,
102
- { $unwind :"$o" } ,
123
+ { $unwind :"$o" } ,
103
124
{ $lookup :{ from :"NEW_ORDER" , as :"no" , let :{ w :"$w" , d :"$d" } , pipeline :[
104
125
{ $match :{ $expr :{ $and :[ { $eq :[ "$$w" , "$NO_W_ID" ] } , { $eq :[ "$$d" , "$NO_D_ID" ] } ] } } } ,
105
126
{ $count :"c" } ] } } ,
106
127
{ $unwind :"$no" } ,
107
128
{ $match :{ $expr :{ $ne :[ 2100 , { $subtract :[ "$o.c" , "$no.c" ] } ] } } } ,
108
- { $count :"c" }
109
129
] } ;
110
130
// consistency check 12
111
- c [ 12 ] = { r :"12" , c :"CUSTOMER" , pipeline :[
112
- { $lookup :{ from :"ORDERS" , as :"o" , let :{ w : "$C_W_ID" , d :"$C_D_ID" , c :"$C_ID" } , pipeline :[
113
- { $match : { O_CARRIER_ID :{ $ne :0 } , $expr : { $and : [ { $eq : [ "$$w" , "$O_W_ID" ] } , { $eq :[ "$$d" , "$O_D_ID" ] } , { $eq :[ "$$c" , "$O_C_ID" ] } ] } } } ,
131
+ c [ 12 ] = { r :"12" , c :"CUSTOMER" , pipeline :[
132
+ { $lookup :{ from :"ORDERS" , as :"o" , let :{ w : "$C_W_ID" , d :"$C_D_ID" , c :"$C_ID" } , pipeline :[
133
+ { $match : { O_CARRIER_ID :{ $ne :0 } , $expr : { $and : [ { $eq : [ "$$w" , "$O_W_ID" ] } , { $eq :[ "$$d" , "$O_D_ID" ] } , { $eq :[ "$$c" , "$O_C_ID" ] } ] } } } ,
114
134
{ $group :{ _id :0 , sum :{ $sum :{ $sum :"$ORDER_LINE.OL_AMOUNT" } } } } ] } } ,
115
135
{ $project :{ C_BALANCE :1 , C_YTD_PAYMENT :1 , OLSUM :{ $ifNull :[ { $arrayElemAt :[ "$o.sum" , 0 ] } , 0 ] } } } ,
116
136
{ $match :{ $expr :{ $ne :[ 0 , { $toLong :{ $subtract :[ "$OLSUM" , { $add :[ "$C_BALANCE" , "$C_YTD_PAYMENT" ] } ] } } ] } } } ,
117
- { $count :"c" }
118
137
] } ;
119
138
120
- for ( i = 1 ; i < 13 ; i ++ ) {
139
+ for ( i = 1 ; i < 13 ; i ++ ) {
121
140
print ( "" + new ISODate ( ) + " Checking " + i ) ;
122
- checkConsistency ( c [ i ] . r , c [ i ] . c , c [ i ] . pipeline ) ;
141
+ if ( i == 10 ) continue ;
142
+ checkConsistency ( c [ i ] . r , c [ i ] . c , c [ i ] . pipeline , true ) ;
123
143
}
124
144
0 commit comments