MCPcopy
hub / github.com/django/django / resolve_expression

Method resolve_expression

django/db/models/indexes.py:328–387  ·  view source on GitHub ↗
(
        self,
        query=None,
        allow_joins=True,
        reuse=None,
        summarize=False,
        for_save=False,
    )

Source from the content-addressed store, hash-verified

326 cls.wrapper_classes = wrapper_classes
327
328 def resolve_expression(
329 self,
330 query=None,
331 allow_joins=True,
332 reuse=None,
333 summarize=False,
334 for_save=False,
335 ):
336 expressions = list(self.flatten())
337 # Split expressions and wrappers.
338 index_expressions, wrappers = partition(
339 lambda e: isinstance(e, self.wrapper_classes),
340 expressions,
341 )
342 wrapper_types = [type(wrapper) for wrapper in wrappers]
343 if len(wrapper_types) != len(set(wrapper_types)):
344 raise ValueError(
345 "Multiple references to %s can't be used in an indexed "
346 "expression."
347 % ", ".join(
348 [wrapper_cls.__qualname__ for wrapper_cls in self.wrapper_classes]
349 )
350 )
351 if expressions[1 : len(wrappers) + 1] != wrappers:
352 raise ValueError(
353 "%s must be topmost expressions in an indexed expression."
354 % ", ".join(
355 [wrapper_cls.__qualname__ for wrapper_cls in self.wrapper_classes]
356 )
357 )
358 # Wrap expressions in parentheses if they are not column references.
359 root_expression = index_expressions[1]
360 resolve_root_expression = root_expression.resolve_expression(
361 query,
362 allow_joins,
363 reuse,
364 summarize,
365 for_save,
366 )
367 if not isinstance(resolve_root_expression, Col):
368 root_expression = Func(root_expression, template="(%(expressions)s)")
369
370 if wrappers:
371 # Order wrappers and set their expressions.
372 wrappers = sorted(
373 wrappers,
374 key=lambda w: self.wrapper_classes.index(type(w)),
375 )
376 wrappers = [wrapper.copy() for wrapper in wrappers]
377 for i, wrapper in enumerate(wrappers[:-1]):
378 wrapper.set_source_expressions([wrappers[i + 1]])
379 # Set the root expression on the deepest wrapper.
380 wrappers[-1].set_source_expressions([root_expression])
381 self.set_source_expressions([wrappers[0]])
382 else:
383 # Use the root expression, if there are no wrappers.
384 self.set_source_expressions([root_expression])
385 return super().resolve_expression(

Callers 1

create_sqlMethod · 0.45

Calls 7

partitionFunction · 0.90
FuncClass · 0.90
flattenMethod · 0.45
joinMethod · 0.45
indexMethod · 0.45
copyMethod · 0.45

Tested by

no test coverage detected