33import re
44
55import abnf
6+ import pymongo .database
67from bson .son import SON
78from flask import abort , request , url_for
89
9- from odata_server import edm
10+ from odata_server import edm , settings
1011
1112from .common import crop_result , format_key_predicate
1213from .flask import add_odata_annotations
@@ -148,9 +149,9 @@ def process_common_expr(tree, filters, entity_type, prefix, joinop="andExpr"):
148149 regex_literal = re .escape (parse_primitive_literal (args [1 ].children [0 ]))
149150 if methodExpr .name == "containsMethodCallExpr" :
150151 filters [- 1 ][field ] = {
151- "$regex" : "(?!{})" . format ( regex_literal )
152- if negation
153- else regex_literal
152+ "$regex" : (
153+ "(?!{})" . format ( regex_literal ) if negation else regex_literal
154+ )
154155 }
155156 elif methodExpr .name == "startsWithMethodCallExpr" :
156157 filters [- 1 ][field ] = {
@@ -398,7 +399,14 @@ def prepare_anonymous_result(result, RootEntitySet, expand_details, prefix):
398399 return expand_result (RootEntitySet , expand_details , croped_result , prefix = prefix )
399400
400401
401- def get_collection (mongo , RootEntitySet , subject , prefers , filters = None , count = False ):
402+ def get_collection (
403+ db : pymongo .database .Database ,
404+ RootEntitySet ,
405+ subject ,
406+ prefers ,
407+ filters = None ,
408+ count = False ,
409+ ):
402410 qs = parse_qs (request .query_string )
403411 anonymous = not isinstance (subject , edm .EntitySet )
404412
@@ -440,7 +448,7 @@ def get_collection(mongo, RootEntitySet, subject, prefers, filters=None, count=F
440448 orderby = parse_orderby (qs .get ("$orderby" , "" ))
441449
442450 # Get the results
443- mongo_collection = mongo .get_collection (RootEntitySet .mongo_collection )
451+ mongo_collection = db .get_collection (RootEntitySet .mongo_collection )
444452 if prefix :
445453 seq_filter = {"Seq" : filters .pop ("Seq" )} if "Seq" in filters else None
446454 pipeline = [
@@ -464,19 +472,29 @@ def get_collection(mongo, RootEntitySet, subject, prefers, filters=None, count=F
464472 pipeline .append ({"$project" : projection })
465473 pipeline .append ({"$skip" : offset })
466474 pipeline .append ({"$limit" : limit })
467- results = mongo_collection .aggregate (pipeline )
475+ results = mongo_collection .aggregate (
476+ pipeline , maxTimeMS = settings .MONGO_SEARCH_MAX_TIME_MS
477+ )
468478 else :
469- cursor = mongo_collection .find (filters , projection )
479+ cursor = mongo_collection .find (filters , projection ).max_time_ms (
480+ settings .MONGO_SEARCH_MAX_TIME_MS
481+ )
470482 if len (orderby ) > 0 :
471483 cursor = cursor .sort (orderby )
472484 results = cursor .skip (offset ).limit (limit )
473485
474486 if count :
475487 if prefix == "" :
476- count = mongo_collection .count_documents (filters )
488+ count = mongo_collection .count_documents (
489+ filters , maxTimeMS = settings .MONGO_COUNT_MAX_TIME_MS
490+ )
477491 else :
478492 basepipeline .append ({"$count" : "count" })
479- result = tuple (mongo_collection .aggregate (basepipeline ))
493+ result = tuple (
494+ mongo_collection .aggregate (
495+ basepipeline , maxTimeMS = settings .MONGO_COUNT_MAX_TIME_MS
496+ )
497+ )
480498 count = 0 if len (result ) == 0 else result [0 ]["count" ]
481499 odata_count = count
482500 else :
0 commit comments