summaryrefslogtreecommitdiff
path: root/tests/custom_lookups
diff options
context:
space:
mode:
authorThomas Chaumeny <t.chaumeny@gmail.com>2014-09-14 12:34:41 +0200
committerAnssi Kääriäinen <akaariai@gmail.com>2014-10-28 10:02:10 +0200
commit00aa562884a418c4ee20e223ab82c3455997ee7d (patch)
tree934393c39e5087bad689217003a1de59484e0000 /tests/custom_lookups
parent6b39401bafa955f4891700996aa666349fcdef74 (diff)
Fixed #23493 -- Added bilateral attribute to Transform
Diffstat (limited to 'tests/custom_lookups')
-rw-r--r--tests/custom_lookups/tests.py126
1 files changed, 124 insertions, 2 deletions
diff --git a/tests/custom_lookups/tests.py b/tests/custom_lookups/tests.py
index a965e5a4e8..d0f18c5d7b 100644
--- a/tests/custom_lookups/tests.py
+++ b/tests/custom_lookups/tests.py
@@ -17,7 +17,7 @@ class Div3Lookup(models.Lookup):
lhs, params = self.process_lhs(qn, connection)
rhs, rhs_params = self.process_rhs(qn, connection)
params.extend(rhs_params)
- return '%s %%%% 3 = %s' % (lhs, rhs), params
+ return '(%s) %%%% 3 = %s' % (lhs, rhs), params
def as_oracle(self, qn, connection):
lhs, params = self.process_lhs(qn, connection)
@@ -31,12 +31,32 @@ class Div3Transform(models.Transform):
def as_sql(self, qn, connection):
lhs, lhs_params = qn.compile(self.lhs)
- return '%s %%%% 3' % (lhs,), lhs_params
+ return '(%s) %%%% 3' % lhs, lhs_params
def as_oracle(self, qn, connection):
lhs, lhs_params = qn.compile(self.lhs)
return 'mod(%s, 3)' % lhs, lhs_params
+class Div3BilateralTransform(Div3Transform):
+ bilateral = True
+
+
+class Mult3BilateralTransform(models.Transform):
+ bilateral = True
+ lookup_name = 'mult3'
+
+ def as_sql(self, qn, connection):
+ lhs, lhs_params = qn.compile(self.lhs)
+ return '3 * (%s)' % lhs, lhs_params
+
+class UpperBilateralTransform(models.Transform):
+ bilateral = True
+ lookup_name = 'upper'
+
+ def as_sql(self, qn, connection):
+ lhs, lhs_params = qn.compile(self.lhs)
+ return 'UPPER(%s)' % lhs, lhs_params
+
class YearTransform(models.Transform):
lookup_name = 'year'
@@ -225,10 +245,112 @@ class LookupTests(TestCase):
self.assertQuerysetEqual(
baseqs.filter(age__div3__in=[0, 2]),
[a2, a3], lambda x: x)
+ self.assertQuerysetEqual(
+ baseqs.filter(age__div3__in=[2, 4]),
+ [a2], lambda x: x)
+ self.assertQuerysetEqual(
+ baseqs.filter(age__div3__gte=3),
+ [], lambda x: x)
+ self.assertQuerysetEqual(
+ baseqs.filter(age__div3__range=(1, 2)),
+ [a1, a2, a4], lambda x: x)
finally:
models.IntegerField._unregister_lookup(Div3Transform)
+class BilateralTransformTests(TestCase):
+
+ def test_bilateral_upper(self):
+ models.CharField.register_lookup(UpperBilateralTransform)
+ try:
+ Author.objects.bulk_create([
+ Author(name='Doe'),
+ Author(name='doe'),
+ Author(name='Foo'),
+ ])
+ self.assertQuerysetEqual(
+ Author.objects.filter(name__upper='doe'),
+ ["<Author: Doe>", "<Author: doe>"], ordered=False)
+ finally:
+ models.CharField._unregister_lookup(UpperBilateralTransform)
+
+ def test_bilateral_inner_qs(self):
+ models.CharField.register_lookup(UpperBilateralTransform)
+ try:
+ with self.assertRaises(NotImplementedError):
+ Author.objects.filter(name__upper__in=Author.objects.values_list('name'))
+ finally:
+ models.CharField._unregister_lookup(UpperBilateralTransform)
+
+ def test_div3_bilateral_extract(self):
+ models.IntegerField.register_lookup(Div3BilateralTransform)
+ try:
+ a1 = Author.objects.create(name='a1', age=1)
+ a2 = Author.objects.create(name='a2', age=2)
+ a3 = Author.objects.create(name='a3', age=3)
+ a4 = Author.objects.create(name='a4', age=4)
+ baseqs = Author.objects.order_by('name')
+ self.assertQuerysetEqual(
+ baseqs.filter(age__div3=2),
+ [a2], lambda x: x)
+ self.assertQuerysetEqual(
+ baseqs.filter(age__div3__lte=3),
+ [a3], lambda x: x)
+ self.assertQuerysetEqual(
+ baseqs.filter(age__div3__in=[0, 2]),
+ [a2, a3], lambda x: x)
+ self.assertQuerysetEqual(
+ baseqs.filter(age__div3__in=[2, 4]),
+ [a1, a2, a4], lambda x: x)
+ self.assertQuerysetEqual(
+ baseqs.filter(age__div3__gte=3),
+ [a1, a2, a3, a4], lambda x: x)
+ self.assertQuerysetEqual(
+ baseqs.filter(age__div3__range=(1, 2)),
+ [a1, a2, a4], lambda x: x)
+ finally:
+ models.IntegerField._unregister_lookup(Div3BilateralTransform)
+
+ def test_bilateral_order(self):
+ models.IntegerField.register_lookup(Mult3BilateralTransform)
+ models.IntegerField.register_lookup(Div3BilateralTransform)
+ try:
+ a1 = Author.objects.create(name='a1', age=1)
+ a2 = Author.objects.create(name='a2', age=2)
+ a3 = Author.objects.create(name='a3', age=3)
+ a4 = Author.objects.create(name='a4', age=4)
+ baseqs = Author.objects.order_by('name')
+
+ self.assertQuerysetEqual(
+ baseqs.filter(age__mult3__div3=42),
+ # mult3__div3 always leads to 0
+ [a1, a2, a3, a4], lambda x: x)
+ self.assertQuerysetEqual(
+ baseqs.filter(age__div3__mult3=42),
+ [a3], lambda x: x)
+ finally:
+ models.IntegerField._unregister_lookup(Mult3BilateralTransform)
+ models.IntegerField._unregister_lookup(Div3BilateralTransform)
+
+ def test_bilateral_fexpr(self):
+ models.IntegerField.register_lookup(Mult3BilateralTransform)
+ try:
+ a1 = Author.objects.create(name='a1', age=1, average_rating=3.2)
+ a2 = Author.objects.create(name='a2', age=2, average_rating=0.5)
+ a3 = Author.objects.create(name='a3', age=3, average_rating=1.5)
+ a4 = Author.objects.create(name='a4', age=4)
+ baseqs = Author.objects.order_by('name')
+ self.assertQuerysetEqual(
+ baseqs.filter(age__mult3=models.F('age')),
+ [a1, a2, a3, a4], lambda x: x)
+ self.assertQuerysetEqual(
+ # Same as age >= average_rating
+ baseqs.filter(age__mult3__gte=models.F('average_rating')),
+ [a2, a3], lambda x: x)
+ finally:
+ models.IntegerField._unregister_lookup(Mult3BilateralTransform)
+
+
class YearLteTests(TestCase):
def setUp(self):
models.DateField.register_lookup(YearTransform)