Skip to content

Commit 3c4627f

Browse files
committed
Resolve value as direct value.
1 parent 18afe4e commit 3c4627f

File tree

1 file changed

+52
-44
lines changed

1 file changed

+52
-44
lines changed

django_mongodb_backend/expressions/search.py

Lines changed: 52 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ def get_source_expressions(self):
8181

8282
@staticmethod
8383
def cast_as_value(value):
84+
if value is None:
85+
return None
8486
return Value(value) if not hasattr(value, "resolve_expression") else value
8587

8688
@staticmethod
@@ -131,14 +133,14 @@ def get_search_fields(self, compiler, connection):
131133
def search_operator(self, compiler, connection):
132134
params = {
133135
"path": self.path.as_mql(compiler, connection, as_path=True),
134-
"query": self.query.as_mql(compiler, connection),
136+
"query": self.query.value,
135137
}
136138
if self.score is not None:
137139
params["score"] = self.score.as_mql(compiler, connection)
138140
if self.fuzzy is not None:
139-
params["fuzzy"] = self.fuzzy.as_mql(compiler, connection)
141+
params["fuzzy"] = self.fuzzy.value
140142
if self.token_order is not None:
141-
params["tokenOrder"] = self.token_order.as_mql(compiler, connection)
143+
params["tokenOrder"] = self.token_order.value
142144
return {"autocomplete": params}
143145

144146

@@ -161,7 +163,7 @@ def set_source_expressions(self, exprs):
161163
def search_operator(self, compiler, connection):
162164
params = {
163165
"path": self.path.as_mql(compiler, connection, as_path=True),
164-
"value": self.value.as_mql(compiler, connection),
166+
"value": self.value.value,
165167
}
166168
if self.score is not None:
167169
params["score"] = self.score.as_mql(compiler, connection)
@@ -211,10 +213,10 @@ def set_source_expressions(self, exprs):
211213
def search_operator(self, compiler, connection):
212214
params = {
213215
"path": self.path.as_mql(compiler, connection, as_path=True),
214-
"value": self.value.as_mql(compiler, connection),
216+
"value": self.value.value,
215217
}
216218
if self.score is not None:
217-
params["score"] = self.score.definitions
219+
params["score"] = self.score.as_mql(compiler, connection)
218220
return {"in": params}
219221

220222

@@ -239,14 +241,14 @@ def set_source_expressions(self, exprs):
239241
def search_operator(self, compiler, connection):
240242
params = {
241243
"path": self.path.as_mql(compiler, connection, as_path=True),
242-
"query": self.query.as_mql(compiler, connection),
244+
"query": self.query.value,
243245
}
244246
if self.score is not None:
245247
params["score"] = self.score.as_mql(compiler, connection)
246248
if self.slop is not None:
247-
params["slop"] = self.slop.as_mql(compiler, connection)
249+
params["slop"] = self.slop.value
248250
if self.synonyms is not None:
249-
params["synonyms"] = self.synonyms.as_mql(compiler, connection)
251+
params["synonyms"] = self.synonyms.value
250252
return {"phrase": params}
251253

252254

@@ -269,10 +271,10 @@ def set_source_expressions(self, exprs):
269271
def search_operator(self, compiler, connection):
270272
params = {
271273
"defaultPath": self.path.as_mql(compiler, connection, as_path=True),
272-
"query": self.query.as_mql(compiler, connection),
274+
"query": self.query.value,
273275
}
274276
if self.score is not None:
275-
params["score"] = self.score.definitions
277+
params["score"] = self.score.as_mql(compiler, connection)
276278
return {"queryString": params}
277279

278280

@@ -300,15 +302,15 @@ def search_operator(self, compiler, connection):
300302
"path": self.path.as_mql(compiler, connection, as_path=True),
301303
}
302304
if self.score is not None:
303-
params["score"] = self.score.definitions
305+
params["score"] = self.score.as_mql(compiler, connection)
304306
if self.lt is not None:
305-
params["lt"] = self.lt.as_mql(compiler, connection)
307+
params["lt"] = self.lt.value
306308
if self.lte is not None:
307-
params["lte"] = self.lte.as_mql(compiler, connection)
309+
params["lte"] = self.lte.value
308310
if self.gt is not None:
309-
params["gt"] = self.gt.as_mql(compiler, connection)
311+
params["gt"] = self.gt.value
310312
if self.gte is not None:
311-
params["gte"] = self.gte.as_mql(compiler, connection)
313+
params["gte"] = self.gte.value
312314
return {"range": params}
313315

314316

@@ -332,12 +334,12 @@ def set_source_expressions(self, exprs):
332334
def search_operator(self, compiler, connection):
333335
params = {
334336
"path": self.path.as_mql(compiler, connection, as_path=True),
335-
"query": self.query.as_mql(compiler, connection, as_path=True),
337+
"query": self.query.value,
336338
}
337339
if self.score:
338-
params["score"] = self.score.definitions
340+
params["score"] = self.score.as_mql(compiler, connection)
339341
if self.allow_analyzed_field is not None:
340-
params["allowAnalyzedField"] = self.allow_analyzed_field
342+
params["allowAnalyzedField"] = self.allow_analyzed_field.value
341343
return {"regex": params}
342344

343345

@@ -363,16 +365,16 @@ def set_source_expressions(self, exprs):
363365
def search_operator(self, compiler, connection):
364366
params = {
365367
"path": self.path.as_mql(compiler, connection, as_path=True),
366-
"query": self.query.as_mql(compiler, connection, as_path=True),
368+
"query": self.query.value,
367369
}
368370
if self.score:
369-
params["score"] = self.score.definitions
371+
params["score"] = self.score.as_mql(compiler, connection)
370372
if self.fuzzy is not None:
371-
params["fuzzy"] = self.fuzzy
373+
params["fuzzy"] = self.fuzzy.value
372374
if self.match_criteria is not None:
373-
params["matchCriteria"] = self.match_criteria
375+
params["matchCriteria"] = self.match_criteria.value
374376
if self.synonyms is not None:
375-
params["synonyms"] = self.synonyms
377+
params["synonyms"] = self.synonyms.value
376378
return {"text": params}
377379

378380

@@ -396,12 +398,12 @@ def set_source_expressions(self, exprs):
396398
def search_operator(self, compiler, connection):
397399
params = {
398400
"path": self.path.as_mql(compiler, connection, as_path=True),
399-
"query": self.query.as_mql(compiler, connection, as_path=True),
401+
"query": self.query.value,
400402
}
401403
if self.score:
402-
params["score"] = self.score.definitions
404+
params["score"] = self.score.query.as_mql(compiler, connection)
403405
if self.allow_analyzed_field is not None:
404-
params["allowAnalyzedField"] = self.allow_analyzed_field
406+
params["allowAnalyzedField"] = self.allow_analyzed_field.value
405407
return {"wildcard": params}
406408

407409

@@ -425,11 +427,11 @@ def set_source_expressions(self, exprs):
425427
def search_operator(self, compiler, connection):
426428
params = {
427429
"path": self.path.as_mql(compiler, connection, as_path=True),
428-
"relation": self.relation,
429-
"geometry": self.geometry,
430+
"relation": self.relation.value,
431+
"geometry": self.geometry.value,
430432
}
431433
if self.score:
432-
params["score"] = self.score.definitions
434+
params["score"] = self.score.as_mql(compiler, connection)
433435
return {"geoShape": params}
434436

435437

@@ -453,10 +455,10 @@ def set_source_expressions(self, exprs):
453455
def search_operator(self, compiler, connection):
454456
params = {
455457
"path": self.path.as_mql(compiler, connection, as_path=True),
456-
self.kind: self.geo_object,
458+
self.kind.value: self.geo_object.value,
457459
}
458460
if self.score:
459-
params["score"] = self.score.definitions
461+
params["score"] = self.score.as_mql(compiler, connection)
460462
return {"geoWithin": params}
461463

462464

@@ -474,10 +476,10 @@ def set_source_expressions(self, exprs):
474476

475477
def search_operator(self, compiler, connection):
476478
params = {
477-
"like": self.documents,
479+
"like": self.documents.as_mql(compiler, connection),
478480
}
479481
if self.score:
480-
params["score"] = self.score.definitions
482+
params["score"] = self.score.as_mql(compiler, connection)
481483
return {"moreLikeThis": params}
482484

483485
def get_search_fields(self, compiler, connection):
@@ -507,7 +509,7 @@ def __init__(
507509
def get_search_fields(self, compiler, connection):
508510
fields = set()
509511
for clause in self.must + self.should + self.filter + self.must_not:
510-
fields.update(clause.get_search_fields())
512+
fields.update(clause.get_search_fields(compiler, connection))
511513
return fields
512514

513515
def resolve_expression(
@@ -532,13 +534,19 @@ def resolve_expression(
532534
def search_operator(self, compiler, connection):
533535
params = {}
534536
if self.must:
535-
params["must"] = [clause.search_operator() for clause in self.must]
537+
params["must"] = [clause.search_operator(compiler, connection) for clause in self.must]
536538
if self.must_not:
537-
params["mustNot"] = [clause.search_operator() for clause in self.must_not]
539+
params["mustNot"] = [
540+
clause.search_operator(compiler, connection) for clause in self.must_not
541+
]
538542
if self.should:
539-
params["should"] = [clause.search_operator() for clause in self.should]
543+
params["should"] = [
544+
clause.search_operator(compiler, connection) for clause in self.should
545+
]
540546
if self.filter:
541-
params["filter"] = [clause.search_operator() for clause in self.filter]
547+
params["filter"] = [
548+
clause.search_operator(compiler, connection) for clause in self.filter
549+
]
542550
if self.minimum_should_match is not None:
543551
params["minimumShouldMatch"] = self.minimum_should_match
544552
return {"compound": params}
@@ -650,15 +658,15 @@ def _get_query_index(self, fields, compiler):
650658

651659
def as_mql(self, compiler, connection):
652660
params = {
653-
"index": self._get_query_index(self.get_search_fields(), compiler),
661+
"index": self._get_query_index(self.get_search_fields(compiler, connection), compiler),
654662
"path": self.path.as_mql(compiler, connection, as_path=True),
655-
"queryVector": self.query_vector.as_mql(compiler, connection),
656-
"limit": self.limit.as_mql(compiler, connection),
663+
"queryVector": self.query_vector.value,
664+
"limit": self.limit.value,
657665
}
658666
if self.num_candidates is not None:
659-
params["numCandidates"] = self.num_candidates.as_mql(compiler, connection)
667+
params["numCandidates"] = self.num_candidates.value
660668
if self.exact is not None:
661-
params["exact"] = self.exact.as_mql(compiler, connection)
669+
params["exact"] = self.exact.value
662670
if self.filter is not None:
663671
params["filter"] = self.filter.as_mql(compiler, connection)
664672
return {"$vectorSearch": params}

0 commit comments

Comments
 (0)