|
@@ -65,7 +65,7 @@ class Transform(RegisterLookupMixin):
|
|
|
self.lhs = lhs
|
|
|
self.init_lookups = lookups[:]
|
|
|
|
|
|
- def as_sql(self, qn, connection):
|
|
|
+ def as_sql(self, compiler, connection):
|
|
|
raise NotImplementedError
|
|
|
|
|
|
@cached_property
|
|
@@ -101,7 +101,7 @@ class Lookup(RegisterLookupMixin):
|
|
|
value = transform(value, lookups)
|
|
|
return value
|
|
|
|
|
|
- def batch_process_rhs(self, qn, connection, rhs=None):
|
|
|
+ def batch_process_rhs(self, compiler, connection, rhs=None):
|
|
|
if rhs is None:
|
|
|
rhs = self.rhs
|
|
|
if self.bilateral_transforms:
|
|
@@ -110,7 +110,7 @@ class Lookup(RegisterLookupMixin):
|
|
|
value = QueryWrapper('%s',
|
|
|
[self.lhs.output_field.get_db_prep_value(p, connection)])
|
|
|
value = self.apply_bilateral_transforms(value)
|
|
|
- sql, sql_params = qn.compile(value)
|
|
|
+ sql, sql_params = compiler.compile(value)
|
|
|
sqls.append(sql)
|
|
|
sqls_params.extend(sql_params)
|
|
|
else:
|
|
@@ -127,11 +127,11 @@ class Lookup(RegisterLookupMixin):
|
|
|
'%s', self.lhs.output_field.get_db_prep_lookup(
|
|
|
self.lookup_name, value, connection, prepared=True))
|
|
|
|
|
|
- def process_lhs(self, qn, connection, lhs=None):
|
|
|
+ def process_lhs(self, compiler, connection, lhs=None):
|
|
|
lhs = lhs or self.lhs
|
|
|
- return qn.compile(lhs)
|
|
|
+ return compiler.compile(lhs)
|
|
|
|
|
|
- def process_rhs(self, qn, connection):
|
|
|
+ def process_rhs(self, compiler, connection):
|
|
|
value = self.rhs
|
|
|
if self.bilateral_transforms:
|
|
|
if self.rhs_is_direct_value():
|
|
@@ -148,7 +148,7 @@ class Lookup(RegisterLookupMixin):
|
|
|
if hasattr(value, 'get_compiler'):
|
|
|
value = value.get_compiler(connection=connection)
|
|
|
if hasattr(value, 'as_sql'):
|
|
|
- sql, params = qn.compile(value)
|
|
|
+ sql, params = compiler.compile(value)
|
|
|
return '(' + sql + ')', params
|
|
|
if hasattr(value, '_as_sql'):
|
|
|
sql, params = value._as_sql(connection=connection)
|
|
@@ -175,14 +175,14 @@ class Lookup(RegisterLookupMixin):
|
|
|
cols.extend(self.rhs.get_group_by_cols())
|
|
|
return cols
|
|
|
|
|
|
- def as_sql(self, qn, connection):
|
|
|
+ def as_sql(self, compiler, connection):
|
|
|
raise NotImplementedError
|
|
|
|
|
|
|
|
|
class BuiltinLookup(Lookup):
|
|
|
- def process_lhs(self, qn, connection, lhs=None):
|
|
|
+ def process_lhs(self, compiler, connection, lhs=None):
|
|
|
lhs_sql, params = super(BuiltinLookup, self).process_lhs(
|
|
|
- qn, connection, lhs)
|
|
|
+ compiler, connection, lhs)
|
|
|
field_internal_type = self.lhs.output_field.get_internal_type()
|
|
|
db_type = self.lhs.output_field.db_type(connection=connection)
|
|
|
lhs_sql = connection.ops.field_cast_sql(
|
|
@@ -190,9 +190,9 @@ class BuiltinLookup(Lookup):
|
|
|
lhs_sql = connection.ops.lookup_cast(self.lookup_name) % lhs_sql
|
|
|
return lhs_sql, params
|
|
|
|
|
|
- def as_sql(self, qn, connection):
|
|
|
- lhs_sql, params = self.process_lhs(qn, connection)
|
|
|
- rhs_sql, rhs_params = self.process_rhs(qn, connection)
|
|
|
+ def as_sql(self, compiler, connection):
|
|
|
+ lhs_sql, params = self.process_lhs(compiler, connection)
|
|
|
+ rhs_sql, rhs_params = self.process_rhs(compiler, connection)
|
|
|
params.extend(rhs_params)
|
|
|
rhs_sql = self.get_rhs_op(connection, rhs_sql)
|
|
|
return '%s %s' % (lhs_sql, rhs_sql), params
|
|
@@ -247,7 +247,7 @@ default_lookups['lte'] = LessThanOrEqual
|
|
|
class In(BuiltinLookup):
|
|
|
lookup_name = 'in'
|
|
|
|
|
|
- def process_rhs(self, qn, connection):
|
|
|
+ def process_rhs(self, compiler, connection):
|
|
|
if self.rhs_is_direct_value():
|
|
|
# rhs should be an iterable, we use batch_process_rhs
|
|
|
# to prepare/transform those values
|
|
@@ -255,23 +255,23 @@ class In(BuiltinLookup):
|
|
|
if not rhs:
|
|
|
from django.db.models.sql.datastructures import EmptyResultSet
|
|
|
raise EmptyResultSet
|
|
|
- sqls, sqls_params = self.batch_process_rhs(qn, connection, rhs)
|
|
|
+ sqls, sqls_params = self.batch_process_rhs(compiler, connection, rhs)
|
|
|
placeholder = '(' + ', '.join(sqls) + ')'
|
|
|
return (placeholder, sqls_params)
|
|
|
else:
|
|
|
- return super(In, self).process_rhs(qn, connection)
|
|
|
+ return super(In, self).process_rhs(compiler, connection)
|
|
|
|
|
|
def get_rhs_op(self, connection, rhs):
|
|
|
return 'IN %s' % rhs
|
|
|
|
|
|
- def as_sql(self, qn, connection):
|
|
|
+ def as_sql(self, compiler, connection):
|
|
|
max_in_list_size = connection.ops.max_in_list_size()
|
|
|
if self.rhs_is_direct_value() and (max_in_list_size and
|
|
|
len(self.rhs) > max_in_list_size):
|
|
|
# This is a special case for Oracle which limits the number of elements
|
|
|
# which can appear in an 'IN' clause.
|
|
|
- lhs, lhs_params = self.process_lhs(qn, connection)
|
|
|
- rhs, rhs_params = self.batch_process_rhs(qn, connection)
|
|
|
+ lhs, lhs_params = self.process_lhs(compiler, connection)
|
|
|
+ rhs, rhs_params = self.batch_process_rhs(compiler, connection)
|
|
|
in_clause_elements = ['(']
|
|
|
params = []
|
|
|
for offset in xrange(0, len(rhs_params), max_in_list_size):
|
|
@@ -288,7 +288,7 @@ class In(BuiltinLookup):
|
|
|
in_clause_elements.append(')')
|
|
|
return ''.join(in_clause_elements), params
|
|
|
else:
|
|
|
- return super(In, self).as_sql(qn, connection)
|
|
|
+ return super(In, self).as_sql(compiler, connection)
|
|
|
|
|
|
|
|
|
default_lookups['in'] = In
|
|
@@ -348,21 +348,21 @@ class Range(BuiltinLookup):
|
|
|
def get_rhs_op(self, connection, rhs):
|
|
|
return "BETWEEN %s AND %s" % (rhs[0], rhs[1])
|
|
|
|
|
|
- def process_rhs(self, qn, connection):
|
|
|
+ def process_rhs(self, compiler, connection):
|
|
|
if self.rhs_is_direct_value():
|
|
|
# rhs should be an iterable of 2 values, we use batch_process_rhs
|
|
|
# to prepare/transform those values
|
|
|
- return self.batch_process_rhs(qn, connection)
|
|
|
+ return self.batch_process_rhs(compiler, connection)
|
|
|
else:
|
|
|
- return super(Range, self).process_rhs(qn, connection)
|
|
|
+ return super(Range, self).process_rhs(compiler, connection)
|
|
|
|
|
|
default_lookups['range'] = Range
|
|
|
|
|
|
|
|
|
class DateLookup(BuiltinLookup):
|
|
|
- def process_lhs(self, qn, connection, lhs=None):
|
|
|
+ def process_lhs(self, compiler, connection, lhs=None):
|
|
|
from django.db.models import DateTimeField
|
|
|
- lhs, params = super(DateLookup, self).process_lhs(qn, connection, lhs)
|
|
|
+ lhs, params = super(DateLookup, self).process_lhs(compiler, connection, lhs)
|
|
|
if isinstance(self.lhs.output_field, DateTimeField):
|
|
|
tzname = timezone.get_current_timezone_name() if settings.USE_TZ else None
|
|
|
sql, tz_params = connection.ops.datetime_extract_sql(self.extract_type, lhs, tzname)
|
|
@@ -413,8 +413,8 @@ default_lookups['second'] = Second
|
|
|
class IsNull(BuiltinLookup):
|
|
|
lookup_name = 'isnull'
|
|
|
|
|
|
- def as_sql(self, qn, connection):
|
|
|
- sql, params = qn.compile(self.lhs)
|
|
|
+ def as_sql(self, compiler, connection):
|
|
|
+ sql, params = compiler.compile(self.lhs)
|
|
|
if self.rhs:
|
|
|
return "%s IS NULL" % sql, params
|
|
|
else:
|
|
@@ -425,9 +425,9 @@ default_lookups['isnull'] = IsNull
|
|
|
class Search(BuiltinLookup):
|
|
|
lookup_name = 'search'
|
|
|
|
|
|
- def as_sql(self, qn, connection):
|
|
|
- lhs, lhs_params = self.process_lhs(qn, connection)
|
|
|
- rhs, rhs_params = self.process_rhs(qn, connection)
|
|
|
+ def as_sql(self, compiler, connection):
|
|
|
+ lhs, lhs_params = self.process_lhs(compiler, connection)
|
|
|
+ rhs, rhs_params = self.process_rhs(compiler, connection)
|
|
|
sql_template = connection.ops.fulltext_search_sql(field_name=lhs)
|
|
|
return sql_template, lhs_params + rhs_params
|
|
|
|
|
@@ -437,12 +437,12 @@ default_lookups['search'] = Search
|
|
|
class Regex(BuiltinLookup):
|
|
|
lookup_name = 'regex'
|
|
|
|
|
|
- def as_sql(self, qn, connection):
|
|
|
+ def as_sql(self, compiler, connection):
|
|
|
if self.lookup_name in connection.operators:
|
|
|
- return super(Regex, self).as_sql(qn, connection)
|
|
|
+ return super(Regex, self).as_sql(compiler, connection)
|
|
|
else:
|
|
|
- lhs, lhs_params = self.process_lhs(qn, connection)
|
|
|
- rhs, rhs_params = self.process_rhs(qn, connection)
|
|
|
+ lhs, lhs_params = self.process_lhs(compiler, connection)
|
|
|
+ rhs, rhs_params = self.process_rhs(compiler, connection)
|
|
|
sql_template = connection.ops.regex_lookup(self.lookup_name)
|
|
|
return sql_template % (lhs, rhs), lhs_params + rhs_params
|
|
|
default_lookups['regex'] = Regex
|