MCPcopy
hub / github.com/django/django / KeyTransform

Class KeyTransform

django/db/models/fields/json.py:474–515  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

472
473
474class KeyTransform(ProcessJSONLHSMixin, Transform):
475 postgres_operator = "->"
476 postgres_nested_operator = "#>"
477
478 def __init__(self, key_name, *args, **kwargs):
479 super().__init__(*args, **kwargs)
480 self.key_name = str(key_name)
481
482 def preprocess_lhs(self, compiler, connection):
483 key_transforms = [self.key_name]
484 previous = self.lhs
485 while isinstance(previous, KeyTransform):
486 key_transforms.insert(0, previous.key_name)
487 previous = previous.lhs
488 lhs, params = compiler.compile(previous)
489 if connection.vendor == "oracle":
490 # Escape string-formatting.
491 key_transforms = [key.replace("%", "%%") for key in key_transforms]
492 return lhs, params, key_transforms
493
494 def as_mysql(self, compiler, connection):
495 lhs, params, key_transforms = self.preprocess_lhs(compiler, connection)
496 return self._process_as_mysql(lhs, params, connection, key_transforms)
497
498 def as_oracle(self, compiler, connection):
499 lhs, params, key_transforms = self.preprocess_lhs(compiler, connection)
500 return self._process_as_oracle(lhs, params, connection, key_transforms)
501
502 def as_postgresql(self, compiler, connection):
503 lhs, params, key_transforms = self.preprocess_lhs(compiler, connection)
504 if len(key_transforms) > 1:
505 sql = "(%s %s %%s)" % (lhs, self.postgres_nested_operator)
506 return sql, (*params, key_transforms)
507 try:
508 lookup = int(self.key_name)
509 except ValueError:
510 lookup = self.key_name
511 return "(%s %s %%s)" % (lhs, self.postgres_operator), (*params, lookup)
512
513 def as_sqlite(self, compiler, connection):
514 lhs, params, key_transforms = self.preprocess_lhs(compiler, connection)
515 return self._process_as_sqlite(lhs, params, connection, key_transforms)
516
517
518class KeyTextTransform(KeyTransform):

Calls

no outgoing calls