Projet

Général

Profil

0006-dj22-do-not-backport-jsonb-key-transforms-51516.patch

Benjamin Dauvergne, 01 mars 2021 15:06

Télécharger (4,61 ko)

Voir les différences:

Subject: [PATCH 6/9] dj22: do not backport jsonb key transforms (#51516)

 zoo/zoo_data/lookups.py | 102 ++++++++++++++++++++--------------------
 1 file changed, 51 insertions(+), 51 deletions(-)
zoo/zoo_data/lookups.py
14 14
# You should have received a copy of the GNU Affero General Public License
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17
from django.contrib.postgres.fields import jsonb
17
import django
18

  
18 19
from django.db.models import Transform, TextField, DateField
19 20

  
20
from django.conf import settings
21

  
22

  
23
class KeyTransform(Transform):
24
    operator = '->'
25
    nested_operator = '#>'
26

  
27
    def __init__(self, key_name, *args, **kwargs):
28
        super(KeyTransform, self).__init__(*args, **kwargs)
29
        self.key_name = key_name
30

  
31
    def as_sql(self, compiler, connection):
32
        key_transforms = [self.key_name]
33
        previous = self.lhs
34
        while isinstance(previous, KeyTransform):
35
            key_transforms.insert(0, previous.key_name)
36
            previous = previous.lhs
37
        lhs, params = compiler.compile(previous)
38
        if len(key_transforms) > 1:
39
            return "(%s %s %%s)" % (lhs, self.nested_operator), [key_transforms] + params
40
        try:
41
            int(self.key_name)
42
        except ValueError:
43
            lookup = "'%s'" % self.key_name
44
        else:
45
            lookup = "%s" % self.key_name
46
        return "(%s %s %s)" % (lhs, self.operator, lookup), params
47

  
48

  
49
jsonb.KeyTransform = KeyTransform
50

  
51

  
52
class KeyTextTransform(KeyTransform):
53
    operator = '->>'
54
    nested_operator = '#>>'
55
    _output_field = TextField()
56

  
57

  
58
class KeyTransformTextLookupMixin(object):
59
    """
60
    Mixin for combining with a lookup expecting a text lhs from a JSONField
61
    key lookup. Make use of the ->> operator instead of casting key values to
62
    text and performing the lookup on the resulting representation.
63
    """
64
    def __init__(self, key_transform, *args, **kwargs):
65
        assert isinstance(key_transform, KeyTransform)
66
        key_text_transform = KeyTextTransform(
67
            key_transform.key_name, *key_transform.source_expressions, **key_transform.extra
68
        )
69
        super(KeyTransformTextLookupMixin, self).__init__(key_text_transform, *args, **kwargs)
21
from django.contrib.postgres.fields import jsonb
22
try:
23
    from django.contrib.postgres.fields.jsonb import KeyTransform, KeyTransformTextLookupMixin
24
except ImportError:
25
    # backport from Django 2.x
26
    class KeyTransform(Transform):
27
        operator = '->'
28
        nested_operator = '#>'
29

  
30
        def __init__(self, key_name, *args, **kwargs):
31
            super(KeyTransform, self).__init__(*args, **kwargs)
32
            self.key_name = key_name
33

  
34
        def as_sql(self, compiler, connection):
35
            key_transforms = [self.key_name]
36
            previous = self.lhs
37
            while isinstance(previous, KeyTransform):
38
                key_transforms.insert(0, previous.key_name)
39
                previous = previous.lhs
40
            lhs, params = compiler.compile(previous)
41
            if len(key_transforms) > 1:
42
                return "(%s %s %%s)" % (lhs, self.nested_operator), [key_transforms] + params
43
            try:
44
                int(self.key_name)
45
            except ValueError:
46
                lookup = "'%s'" % self.key_name
47
            else:
48
                lookup = "%s" % self.key_name
49
            return "(%s %s %s)" % (lhs, self.operator, lookup), params
50

  
51
    jsonb.KeyTransform = KeyTransform
52

  
53
    class KeyTextTransform(KeyTransform):
54
        operator = '->>'
55
        nested_operator = '#>>'
56
        _output_field = TextField()
57

  
58
    class KeyTransformTextLookupMixin(object):
59
        """
60
        Mixin for combining with a lookup expecting a text lhs from a JSONField
61
        key lookup. Make use of the ->> operator instead of casting key values to
62
        text and performing the lookup on the resulting representation.
63
        """
64
        def __init__(self, key_transform, *args, **kwargs):
65
            assert isinstance(key_transform, KeyTransform)
66
            key_text_transform = KeyTextTransform(
67
                key_transform.key_name, *key_transform.source_expressions, **key_transform.extra
68
            )
69
            super(KeyTransformTextLookupMixin, self).__init__(key_text_transform, *args, **kwargs)
70 70

  
71 71

  
72 72
class Lower(Transform):
73
-