33from django .db .models .expressions import F , Value
44
55
6+ def cast_as_value (value ):
7+ if value is None :
8+ return None
9+ return Value (value ) if not hasattr (value , "resolve_expression" ) else value
10+
11+
12+ def cast_as_field (path ):
13+ return F (path ) if isinstance (path , str ) else path
14+
15+
616class Operator :
717 AND = "AND"
818 OR = "OR"
@@ -87,16 +97,6 @@ def as_sql(self, compiler, connection):
8797 def get_source_expressions (self ):
8898 return []
8999
90- @staticmethod
91- def cast_as_value (value ):
92- if value is None :
93- return None
94- return Value (value ) if not hasattr (value , "resolve_expression" ) else value
95-
96- @staticmethod
97- def cast_as_field (path ):
98- return F (path ) if isinstance (path , str ) else path
99-
100100 def _get_indexed_fields (self , mappings ):
101101 for field , definition in mappings .get ("fields" , {}).items ():
102102 yield field
@@ -145,10 +145,10 @@ class SearchAutocomplete(SearchExpression):
145145 """
146146
147147 def __init__ (self , path , query , fuzzy = None , token_order = None , score = None ):
148- self .path = self . cast_as_field (path )
149- self .query = self . cast_as_value (query )
150- self .fuzzy = self . cast_as_value (fuzzy )
151- self .token_order = self . cast_as_value (token_order )
148+ self .path = cast_as_field (path )
149+ self .query = cast_as_value (query )
150+ self .fuzzy = cast_as_value (fuzzy )
151+ self .token_order = cast_as_value (token_order )
152152 self .score = score
153153 super ().__init__ ()
154154
@@ -197,8 +197,8 @@ class SearchEquals(SearchExpression):
197197 """
198198
199199 def __init__ (self , path , value , score = None ):
200- self .path = self . cast_as_field (path )
201- self .value = self . cast_as_value (value )
200+ self .path = cast_as_field (path )
201+ self .value = cast_as_value (value )
202202 self .score = score
203203 super ().__init__ ()
204204
@@ -242,7 +242,7 @@ class SearchExists(SearchExpression):
242242 """
243243
244244 def __init__ (self , path , score = None ):
245- self .path = self . cast_as_field (path )
245+ self .path = cast_as_field (path )
246246 self .score = score
247247 super ().__init__ ()
248248
@@ -266,8 +266,8 @@ def search_operator(self, compiler, connection):
266266
267267class SearchIn (SearchExpression ):
268268 def __init__ (self , path , value , score = None ):
269- self .path = self . cast_as_field (path )
270- self .value = self . cast_as_value (value )
269+ self .path = cast_as_field (path )
270+ self .value = cast_as_value (value )
271271 self .score = score
272272 super ().__init__ ()
273273
@@ -314,10 +314,10 @@ class SearchPhrase(SearchExpression):
314314 """
315315
316316 def __init__ (self , path , query , slop = None , synonyms = None , score = None ):
317- self .path = self . cast_as_field (path )
318- self .query = self . cast_as_value (query )
319- self .slop = self . cast_as_value (slop )
320- self .synonyms = self . cast_as_value (synonyms )
317+ self .path = cast_as_field (path )
318+ self .query = cast_as_value (query )
319+ self .slop = cast_as_value (slop )
320+ self .synonyms = cast_as_value (synonyms )
321321 self .score = score
322322 super ().__init__ ()
323323
@@ -366,8 +366,8 @@ class SearchQueryString(SearchExpression):
366366 """
367367
368368 def __init__ (self , path , query , score = None ):
369- self .path = self . cast_as_field (path )
370- self .query = self . cast_as_value (query )
369+ self .path = cast_as_field (path )
370+ self .query = cast_as_value (query )
371371 self .score = score
372372 super ().__init__ ()
373373
@@ -414,11 +414,11 @@ class SearchRange(SearchExpression):
414414 """
415415
416416 def __init__ (self , path , lt = None , lte = None , gt = None , gte = None , score = None ):
417- self .path = self . cast_as_field (path )
418- self .lt = self . cast_as_value (lt )
419- self .lte = self . cast_as_value (lte )
420- self .gt = self . cast_as_value (gt )
421- self .gte = self . cast_as_value (gte )
417+ self .path = cast_as_field (path )
418+ self .lt = cast_as_value (lt )
419+ self .lte = cast_as_value (lte )
420+ self .gt = cast_as_value (gt )
421+ self .gte = cast_as_value (gte )
422422 self .score = score
423423 super ().__init__ ()
424424
@@ -471,9 +471,9 @@ class SearchRegex(SearchExpression):
471471 """
472472
473473 def __init__ (self , path , query , allow_analyzed_field = None , score = None ):
474- self .path = self . cast_as_field (path )
475- self .query = self . cast_as_value (query )
476- self .allow_analyzed_field = self . cast_as_value (allow_analyzed_field )
474+ self .path = cast_as_field (path )
475+ self .query = cast_as_value (query )
476+ self .allow_analyzed_field = cast_as_value (allow_analyzed_field )
477477 self .score = score
478478 super ().__init__ ()
479479
@@ -522,11 +522,11 @@ class SearchText(SearchExpression):
522522 """
523523
524524 def __init__ (self , path , query , fuzzy = None , match_criteria = None , synonyms = None , score = None ):
525- self .path = self . cast_as_field (path )
526- self .query = self . cast_as_value (query )
527- self .fuzzy = self . cast_as_value (fuzzy )
528- self .match_criteria = self . cast_as_value (match_criteria )
529- self .synonyms = self . cast_as_value (synonyms )
525+ self .path = cast_as_field (path )
526+ self .query = cast_as_value (query )
527+ self .fuzzy = cast_as_value (fuzzy )
528+ self .match_criteria = cast_as_value (match_criteria )
529+ self .synonyms = cast_as_value (synonyms )
530530 self .score = score
531531 super ().__init__ ()
532532
@@ -579,9 +579,9 @@ class SearchWildcard(SearchExpression):
579579 """
580580
581581 def __init__ (self , path , query , allow_analyzed_field = None , score = None ):
582- self .path = self . cast_as_field (path )
583- self .query = self . cast_as_value (query )
584- self .allow_analyzed_field = self . cast_as_value (allow_analyzed_field )
582+ self .path = cast_as_field (path )
583+ self .query = cast_as_value (query )
584+ self .allow_analyzed_field = cast_as_value (allow_analyzed_field )
585585 self .score = score
586586 super ().__init__ ()
587587
@@ -628,9 +628,9 @@ class SearchGeoShape(SearchExpression):
628628 """
629629
630630 def __init__ (self , path , relation , geometry , score = None ):
631- self .path = self . cast_as_field (path )
632- self .relation = self . cast_as_value (relation )
633- self .geometry = self . cast_as_value (geometry )
631+ self .path = cast_as_field (path )
632+ self .relation = cast_as_value (relation )
633+ self .geometry = cast_as_value (geometry )
634634 self .score = score
635635 super ().__init__ ()
636636
@@ -677,9 +677,9 @@ class SearchGeoWithin(SearchExpression):
677677 """
678678
679679 def __init__ (self , path , kind , geo_object , score = None ):
680- self .path = self . cast_as_field (path )
681- self .kind = self . cast_as_value (kind )
682- self .geo_object = self . cast_as_value (geo_object )
680+ self .path = cast_as_field (path )
681+ self .kind = cast_as_value (kind )
682+ self .geo_object = cast_as_value (geo_object )
683683 self .score = score
684684 super ().__init__ ()
685685
@@ -722,7 +722,7 @@ class SearchMoreLikeThis(SearchExpression):
722722 """
723723
724724 def __init__ (self , documents , score = None ):
725- self .documents = self . cast_as_value (documents )
725+ self .documents = cast_as_value (documents )
726726 self .score = score
727727 super ().__init__ ()
728728
@@ -929,12 +929,12 @@ def __init__(
929929 exact = None ,
930930 filter = None ,
931931 ):
932- self .path = self . cast_as_field (path )
933- self .query_vector = self . cast_as_value (query_vector )
934- self .limit = self . cast_as_value (limit )
935- self .num_candidates = self . cast_as_value (num_candidates )
936- self .exact = self . cast_as_value (exact )
937- self .filter = self . cast_as_value (filter )
932+ self .path = cast_as_field (path )
933+ self .query_vector = cast_as_value (query_vector )
934+ self .limit = cast_as_value (limit )
935+ self .num_candidates = cast_as_value (num_candidates )
936+ self .exact = cast_as_value (exact )
937+ self .filter = cast_as_value (filter )
938938 super ().__init__ ()
939939
940940 def __invert__ (self ):
@@ -1001,8 +1001,11 @@ def as_mql(self, compiler, connection):
10011001 return {"$vectorSearch" : params }
10021002
10031003
1004- class SearchScoreOption :
1004+ class SearchScoreOption ( Expression ) :
10051005 """Class to mutate scoring on a search operation"""
10061006
10071007 def __init__ (self , definitions = None ):
10081008 self .definitions = definitions
1009+
1010+ def as_mql (self , compiler , connection ):
1011+ return self .definitions
0 commit comments