| 472 | |
| 473 | |
| 474 | class 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 | |
| 518 | class KeyTextTransform(KeyTransform): |
no outgoing calls