summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorFabian Schindler <fabian.schindler.strauss@gmail.com>2017-07-10 16:53:29 +0200
committerTim Graham <timograham@gmail.com>2017-08-24 08:30:11 -0400
commitda0fb5b1ec89a747459ab64482f3202cb452c068 (patch)
treed9dd3a5c8f8bef46e7bc3ae9bfaff7ce81b21b2f /django
parenta8bb49355698a5f7c7d25e06cad2571faa7af9a7 (diff)
Fixed #28380 -- Excluded null geometries in SpatiaLite geometry lookups.
Diffstat (limited to 'django')
-rw-r--r--django/contrib/gis/db/backends/spatialite/operations.py28
1 files changed, 17 insertions, 11 deletions
diff --git a/django/contrib/gis/db/backends/spatialite/operations.py b/django/contrib/gis/db/backends/spatialite/operations.py
index 449e6dcacf..0b5911c83d 100644
--- a/django/contrib/gis/db/backends/spatialite/operations.py
+++ b/django/contrib/gis/db/backends/spatialite/operations.py
@@ -17,6 +17,12 @@ from django.utils.functional import cached_property
from django.utils.version import get_version_tuple
+class SpatialiteNullCheckOperator(SpatialOperator):
+ def as_sql(self, connection, lookup, template_params, sql_params):
+ sql, params = super().as_sql(connection, lookup, template_params, sql_params)
+ return '%s > 0' % sql, params
+
+
class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations):
name = 'spatialite'
spatialite = True
@@ -33,15 +39,15 @@ class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations):
gis_operators = {
# Binary predicates
- 'equals': SpatialOperator(func='Equals'),
- 'disjoint': SpatialOperator(func='Disjoint'),
- 'touches': SpatialOperator(func='Touches'),
- 'crosses': SpatialOperator(func='Crosses'),
- 'within': SpatialOperator(func='Within'),
- 'overlaps': SpatialOperator(func='Overlaps'),
- 'contains': SpatialOperator(func='Contains'),
- 'intersects': SpatialOperator(func='Intersects'),
- 'relate': SpatialOperator(func='Relate'),
+ 'equals': SpatialiteNullCheckOperator(func='Equals'),
+ 'disjoint': SpatialiteNullCheckOperator(func='Disjoint'),
+ 'touches': SpatialiteNullCheckOperator(func='Touches'),
+ 'crosses': SpatialiteNullCheckOperator(func='Crosses'),
+ 'within': SpatialiteNullCheckOperator(func='Within'),
+ 'overlaps': SpatialiteNullCheckOperator(func='Overlaps'),
+ 'contains': SpatialiteNullCheckOperator(func='Contains'),
+ 'intersects': SpatialiteNullCheckOperator(func='Intersects'),
+ 'relate': SpatialiteNullCheckOperator(func='Relate'),
# Returns true if B's bounding box completely contains A's bounding box.
'contained': SpatialOperator(func='MbrWithin'),
# Returns true if A's bounding box completely contains B's bounding box.
@@ -49,8 +55,8 @@ class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations):
# Returns true if A's bounding box overlaps B's bounding box.
'bboverlaps': SpatialOperator(func='MbrOverlaps'),
# These are implemented here as synonyms for Equals
- 'same_as': SpatialOperator(func='Equals'),
- 'exact': SpatialOperator(func='Equals'),
+ 'same_as': SpatialiteNullCheckOperator(func='Equals'),
+ 'exact': SpatialiteNullCheckOperator(func='Equals'),
# Distance predicates
'dwithin': SpatialOperator(func='PtDistWithin'),
}