MCPcopy
hub / github.com/django/django / IndexExpression

Class IndexExpression

django/db/models/indexes.py:307–391  ·  view source on GitHub ↗

Order and wrap expressions for CREATE INDEX statements.

Source from the content-addressed store, hash-verified

305
306
307class IndexExpression(Func):
308 """Order and wrap expressions for CREATE INDEX statements."""
309
310 template = "%(expressions)s"
311 wrapper_classes = (OrderBy, Collate)
312
313 def set_wrapper_classes(self, connection=None):
314 # Some databases (e.g. MySQL) treats COLLATE as an indexed expression.
315 if connection and connection.features.collate_as_index_expression:
316 self.wrapper_classes = tuple(
317 [
318 wrapper_cls
319 for wrapper_cls in self.wrapper_classes
320 if wrapper_cls is not Collate
321 ]
322 )
323
324 @classmethod
325 def register_wrappers(cls, *wrapper_classes):
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,

Callers 5

setUpMethod · 0.90
create_sqlMethod · 0.85

Calls

no outgoing calls

Tested by 3

setUpMethod · 0.72