Skip to content

Commit 660cf87

Browse files
committed
maybe fix oracle tests?
1 parent 99ff8d3 commit 660cf87

File tree

15 files changed

+2412
-1445
lines changed

15 files changed

+2412
-1445
lines changed

FlagSizeBenchmark.png

36.9 KB
Loading

benchmarks.json

Lines changed: 797 additions & 0 deletions
Large diffs are not rendered by default.

django_enum/fields.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@
4545
NonStrictSelect,
4646
NonStrictSelectMultiple,
4747
)
48-
from django_enum.query import HasAllFlagsLookup, HasAnyFlagsLookup
48+
from django_enum.query import ( # HasAllFlagsExtraBigLookup,; HasAnyFlagsExtraBigLookup
49+
HasAllFlagsLookup,
50+
HasAnyFlagsLookup,
51+
)
4952
from django_enum.utils import (
5053
SupportedPrimitive,
5154
choices,
@@ -1291,3 +1294,7 @@ class ExtraBigIntegerFlagField(FlagField, EnumExtraBigIntegerField):
12911294

12921295
def contribute_to_class(self, cls, name, call_base=True, **kwargs):
12931296
BinaryField.contribute_to_class(self, cls, name, **kwargs)
1297+
1298+
1299+
# ExtraBigIntegerFlagField.register_lookup(HasAnyFlagsExtraBigLookup)
1300+
# ExtraBigIntegerFlagField.register_lookup(HasAllFlagsExtraBigLookup)

django_enum/query.py

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
"""
22
Specialized has_any and has_all query lookups for flag enumerations.
33
"""
4+
#from django.core.exceptions import FieldError
45
from django.db.models.lookups import Exact
56

7+
#from django_enum.utils import get_set_bits
8+
69

710
class HasAllFlagsLookup(Exact): # pylint: disable=W0223
811
"""
@@ -17,15 +20,57 @@ def process_lhs(self, compiler, connection, lhs=None):
1720
lhs_sql, lhs_params = super().process_lhs(compiler, connection, lhs)
1821
rhs_sql, rhs_params = super().process_rhs(compiler, connection)
1922
if self.rhs:
20-
return ' & '.join(
21-
(lhs_sql, rhs_sql)
22-
), [*lhs_params, *rhs_params]
23+
return (
24+
'BITAND(%s, %s)'
25+
if connection.vendor == 'oracle'
26+
else '%s & %s'
27+
) % (lhs_sql, rhs_sql), [*lhs_params, *rhs_params]
2328
return lhs_sql, lhs_params
2429

2530
def get_rhs_op(self, connection, rhs):
2631
return connection.operators['exact'] % rhs
2732

2833

34+
# class ExtraBigFlagMixin:
35+
#
36+
# def get_prep_lookup(self):
37+
# return self.lhs.output_field.to_python(super().get_prep_lookup())
38+
#
39+
# def get_rhs_op(self, connection, rhs):
40+
# if connection.vendor == 'postgresql':
41+
# return connection.operators['exact'] % '1'
42+
# raise FieldError(
43+
# f'{connection.vendor} does not support {self.lookup_name} on '
44+
# f'ExtraBigIntegerFlagFields.'
45+
# )
46+
47+
48+
# class HasAllFlagsExtraBigLookup(
49+
# ExtraBigFlagMixin,
50+
# HasAllFlagsLookup
51+
# ): # pylint: disable=W0223
52+
# """
53+
# Support for bitwise has_all lookup on extra big integers (>64 bits) stored
54+
# as binary columns.
55+
#
56+
# get_bit(, 0) AND get_bit(, 7) = 1;
57+
# """
58+
#
59+
# def process_lhs(self, compiler, connection, lhs=None):
60+
# lhs_sql, lhs_params = Exact.process_lhs(self, compiler, connection, lhs)
61+
# rhs_sql, rhs_params = Exact.process_rhs(self, compiler, connection)
62+
# bits = get_set_bits(rhs_params[0])
63+
# if self.rhs:
64+
# ret = ' AND '.join(
65+
# [
66+
# f'get_bit({lhs_sql}, %s)' for _ in range(len(bits))
67+
# ]
68+
# ), bits
69+
# print(ret)
70+
# return ret
71+
# return lhs_sql, lhs_params
72+
73+
2974
class HasAnyFlagsLookup(HasAllFlagsLookup): # pylint: disable=W0223
3075
"""
3176
Extend Exact lookup to support lookup on has any flags. This bitwise ANDs
@@ -42,3 +87,32 @@ def process_rhs(self, compiler, connection):
4287

4388
def get_rhs_op(self, connection, rhs):
4489
return connection.operators['gt' if self.rhs else 'exact'] % rhs
90+
91+
92+
# class HasAnyFlagsExtraBigLookup(
93+
# ExtraBigFlagMixin,
94+
# HasAnyFlagsLookup
95+
# ): # pylint: disable=W0223
96+
# """
97+
# Support for bitwise has_any lookup on extra big integers (>64 bits) stored
98+
# as binary columns.
99+
# """
100+
#
101+
# def process_lhs(self, compiler, connection, lhs=None):
102+
# lhs_sql, lhs_params = Exact.process_lhs(self, compiler, connection, lhs)
103+
# rhs_sql, rhs_params = Exact.process_rhs(self, compiler, connection)
104+
# bits = get_set_bits(rhs_params[0])
105+
# if self.rhs:
106+
# ret = ' OR '.join(
107+
# [
108+
# f'get_bit({lhs_sql}, %s)' for _ in range(len(bits))
109+
# ]
110+
# ), [*bits, 1]
111+
# print(ret)
112+
# return ret
113+
# return lhs_sql, lhs_params
114+
#
115+
# def process_rhs(self, compiler, connection):
116+
# rhs_sql, rhs_params = Exact.process_rhs(self, compiler, connection)
117+
# rhs_params[0] = 0
118+
# return rhs_sql, rhs_params

0 commit comments

Comments
 (0)