@@ -170,31 +170,8 @@ def _convert_write_result(operation, command, result):
170
170
('$snapshot' , 'snapshot' )])
171
171
172
172
173
- def _gen_explain_command (
174
- coll , spec , projection , skip , limit , batch_size ,
175
- options , read_concern , session , client ):
176
- """Generate an explain command document."""
177
- cmd = _gen_find_command (coll , spec , projection , skip , limit , batch_size ,
178
- options , session = None , client = None )
179
- if read_concern .level :
180
- explain = SON ([('explain' , cmd ), ('readConcern' , read_concern .document )])
181
- else :
182
- explain = SON ([('explain' , cmd )])
183
-
184
- if session :
185
- explain ['lsid' ] = session ._use_lsid ()
186
- if (session .options .causal_consistency
187
- and session .operation_time is not None ):
188
- explain .setdefault (
189
- 'readConcern' , {})['afterClusterTime' ] = session .operation_time
190
-
191
- client ._send_cluster_time (explain , session )
192
- return explain
193
-
194
-
195
173
def _gen_find_command (coll , spec , projection , skip , limit , batch_size , options ,
196
- session , client , read_concern = DEFAULT_READ_CONCERN ,
197
- collation = None ):
174
+ read_concern , collation = None ):
198
175
"""Generate a find command document."""
199
176
cmd = SON ([('find' , coll )])
200
177
if '$query' in spec :
@@ -225,29 +202,17 @@ def _gen_find_command(coll, spec, projection, skip, limit, batch_size, options,
225
202
cmd .update ([(opt , True )
226
203
for opt , val in _OPTIONS .items ()
227
204
if options & val ])
228
- if session :
229
- cmd ['lsid' ] = session ._use_lsid ()
230
- if (session .options .causal_consistency
231
- and session .operation_time is not None ):
232
- cmd .setdefault (
233
- 'readConcern' , {})['afterClusterTime' ] = session .operation_time
234
- if client :
235
- client ._send_cluster_time (cmd , session )
236
205
return cmd
237
206
238
207
239
- def _gen_get_more_command (cursor_id , coll , batch_size , max_await_time_ms ,
240
- session , client ):
208
+ def _gen_get_more_command (cursor_id , coll , batch_size , max_await_time_ms ):
241
209
"""Generate a getMore command document."""
242
210
cmd = SON ([('getMore' , cursor_id ),
243
211
('collection' , coll )])
244
212
if batch_size :
245
213
cmd ['batchSize' ] = batch_size
246
214
if max_await_time_ms is not None :
247
215
cmd ['maxTimeMS' ] = max_await_time_ms
248
- if session :
249
- cmd ['lsid' ] = session ._use_lsid ()
250
- client ._send_cluster_time (cmd , session )
251
216
return cmd
252
217
253
218
@@ -299,23 +264,32 @@ def use_command(self, sock_info, exhaust):
299
264
300
265
return use_find_cmd
301
266
302
- def as_command (self ):
267
+ def as_command (self , sock_info ):
303
268
"""Return a find command document for this query.
304
269
305
270
Should be called *after* get_message.
306
271
"""
307
- if '$explain' in self .spec :
272
+ explain = '$explain' in self .spec
273
+ cmd = _gen_find_command (
274
+ self .coll , self .spec , self .fields , self .ntoskip ,
275
+ self .limit , self .batch_size , self .flags , self .read_concern ,
276
+ self .collation )
277
+ if explain :
308
278
self .name = 'explain'
309
- return _gen_explain_command (
310
- self .coll , self .spec , self .fields , self .ntoskip ,
311
- self .limit , self .batch_size , self .flags ,
312
- self .read_concern , self .session , self .client ), self .db
313
- return _gen_find_command (self .coll , self .spec , self .fields ,
314
- self .ntoskip , self .limit , self .batch_size ,
315
- self .flags , self .session , self .client ,
316
- self .read_concern , self .collation ), self .db
317
-
318
- def get_message (self , set_slave_ok , is_mongos , use_cmd = False ):
279
+ cmd = SON ([('explain' , cmd )])
280
+ session = self .session
281
+ if session :
282
+ cmd ['lsid' ] = session ._use_lsid ()
283
+ # Explain does not support readConcern.
284
+ if (not explain and session .options .causal_consistency
285
+ and session .operation_time is not None ):
286
+ cmd .setdefault (
287
+ 'readConcern' , {})[
288
+ 'afterClusterTime' ] = session .operation_time
289
+ sock_info .send_cluster_time (cmd , session , self .client )
290
+ return cmd , self .db
291
+
292
+ def get_message (self , set_slave_ok , sock_info , use_cmd = False ):
319
293
"""Get a query message, possibly setting the slaveOk bit."""
320
294
if set_slave_ok :
321
295
# Set the slaveOk bit.
@@ -328,7 +302,7 @@ def get_message(self, set_slave_ok, is_mongos, use_cmd=False):
328
302
329
303
if use_cmd :
330
304
ns = _UJOIN % (self .db , "$cmd" )
331
- spec = self .as_command ()[0 ]
305
+ spec = self .as_command (sock_info )[0 ]
332
306
ntoreturn = - 1 # All DB commands return 1 document
333
307
else :
334
308
# OP_QUERY treats ntoreturn of -1 and 1 the same, return
@@ -341,7 +315,7 @@ def get_message(self, set_slave_ok, is_mongos, use_cmd=False):
341
315
else :
342
316
ntoreturn = self .limit
343
317
344
- if is_mongos :
318
+ if sock_info . is_mongos :
345
319
spec = _maybe_add_read_preference (spec ,
346
320
self .read_preference )
347
321
@@ -372,22 +346,25 @@ def use_command(self, sock_info, exhaust):
372
346
sock_info .validate_session (self .client , self .session )
373
347
return sock_info .max_wire_version >= 4 and not exhaust
374
348
375
- def as_command (self ):
349
+ def as_command (self , sock_info ):
376
350
"""Return a getMore command document for this query."""
377
- return _gen_get_more_command (self .cursor_id , self .coll ,
378
- self .ntoreturn ,
379
- self .max_await_time_ms ,
380
- self .session ,
381
- self .client ), self .db
351
+ cmd = _gen_get_more_command (self .cursor_id , self .coll ,
352
+ self .ntoreturn ,
353
+ self .max_await_time_ms )
354
+
355
+ if self .session :
356
+ cmd ['lsid' ] = self .session ._use_lsid ()
357
+ sock_info .send_cluster_time (cmd , self .session , self .client )
358
+ return cmd , self .db
382
359
383
- def get_message (self , dummy0 , dummy1 , use_cmd = False ):
360
+ def get_message (self , dummy0 , sock_info , use_cmd = False ):
384
361
"""Get a getmore message."""
385
362
386
363
ns = _UJOIN % (self .db , self .coll )
387
364
388
365
if use_cmd :
389
366
ns = _UJOIN % (self .db , "$cmd" )
390
- spec = self .as_command ()[0 ]
367
+ spec = self .as_command (sock_info )[0 ]
391
368
392
369
return query (0 , ns , 0 , - 1 , spec , None , self .codec_options )
393
370
@@ -401,20 +378,20 @@ def use_command(self, socket_info, exhaust):
401
378
402
379
return False
403
380
404
- def get_message (self , set_slave_ok , is_mongos , use_cmd = False ):
381
+ def get_message (self , set_slave_ok , sock_info , use_cmd = False ):
405
382
# Always pass False for use_cmd.
406
- return super (_RawBatchQuery , self ).get_message (set_slave_ok , is_mongos ,
407
- False )
383
+ return super (_RawBatchQuery , self ).get_message (
384
+ set_slave_ok , sock_info , False )
408
385
409
386
410
387
class _RawBatchGetMore (_GetMore ):
411
388
def use_command (self , socket_info , exhaust ):
412
389
return False
413
390
414
- def get_message (self , set_slave_ok , is_mongos , use_cmd = False ):
391
+ def get_message (self , set_slave_ok , sock_info , use_cmd = False ):
415
392
# Always pass False for use_cmd.
416
- return super (_RawBatchGetMore , self ).get_message (set_slave_ok , is_mongos ,
417
- False )
393
+ return super (_RawBatchGetMore , self ).get_message (
394
+ set_slave_ok , sock_info , False )
418
395
419
396
420
397
class _CursorAddress (tuple ):
@@ -982,21 +959,19 @@ def unpack(cls, msg):
982
959
983
960
984
961
def _first_batch (sock_info , db , coll , query , ntoreturn ,
985
- slave_ok , codec_options , read_preference , cmd , listeners ,
986
- session ):
962
+ slave_ok , codec_options , read_preference , cmd , listeners ):
987
963
"""Simple query helper for retrieving a first (and possibly only) batch."""
988
964
query = _Query (
989
965
0 , db , coll , 0 , query , None , codec_options ,
990
- read_preference , ntoreturn , 0 , DEFAULT_READ_CONCERN , None , session ,
966
+ read_preference , ntoreturn , 0 , DEFAULT_READ_CONCERN , None , None ,
991
967
None )
992
968
993
969
name = next (iter (cmd ))
994
970
publish = listeners .enabled_for_commands
995
971
if publish :
996
972
start = datetime .datetime .now ()
997
973
998
- request_id , msg , max_doc_size = query .get_message (slave_ok ,
999
- sock_info .is_mongos )
974
+ request_id , msg , max_doc_size = query .get_message (slave_ok , sock_info )
1000
975
1001
976
if publish :
1002
977
encoding_duration = datetime .datetime .now () - start
0 commit comments