diff options
| author | Fabian Schindler <fabian.schindler.strauss@gmail.com> | 2017-07-10 16:53:29 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-08-24 08:30:11 -0400 |
| commit | da0fb5b1ec89a747459ab64482f3202cb452c068 (patch) | |
| tree | d9dd3a5c8f8bef46e7bc3ae9bfaff7ce81b21b2f /django | |
| parent | a8bb49355698a5f7c7d25e06cad2571faa7af9a7 (diff) | |
Fixed #28380 -- Excluded null geometries in SpatiaLite geometry lookups.
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/gis/db/backends/spatialite/operations.py | 28 |
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'), } |
