Moved check_aggregate_support to BaseSpatialOperations

This commit is contained in:
Claude Paroz 2015-01-14 13:36:32 +01:00
parent 9801d419b9
commit 67bcae1e58
7 changed files with 11 additions and 21 deletions

View File

@ -102,6 +102,11 @@ class BaseSpatialOperations(object):
"""
raise NotImplementedError('subclasses of BaseSpatialOperations must provide a geo_db_placeholder() method')
def check_aggregate_support(self, aggregate):
if aggregate.contains_aggregate == 'gis':
return aggregate.name in self.valid_aggregates
return super(BaseSpatialOperations, self).check_aggregate_support(aggregate)
# Spatial SQL Construction
def spatial_aggregate_sql(self, agg):
raise NotImplementedError('Aggregate support not implemented for this spatial backend.')

View File

@ -4,7 +4,7 @@ from django.contrib.gis.db.backends.utils import SpatialOperator
from django.db.backends.mysql.operations import DatabaseOperations
class MySQLOperations(DatabaseOperations, BaseSpatialOperations):
class MySQLOperations(BaseSpatialOperations, DatabaseOperations):
mysql = True
name = 'mysql'

View File

@ -52,7 +52,7 @@ class SDORelate(SpatialOperator):
return super(SDORelate, self).as_sql(connection, lookup, template_params, sql_params)
class OracleOperations(DatabaseOperations, BaseSpatialOperations):
class OracleOperations(BaseSpatialOperations, DatabaseOperations):
name = 'oracle'
oracle = True

View File

@ -43,7 +43,7 @@ class PostGISDistanceOperator(PostGISOperator):
return super(PostGISDistanceOperator, self).as_sql(connection, lookup, template_params, sql_params)
class PostGISOperations(DatabaseOperations, BaseSpatialOperations):
class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
name = 'postgis'
postgis = True
geography = True
@ -179,14 +179,6 @@ class PostGISOperations(DatabaseOperations, BaseSpatialOperations):
version = vtup[1:]
return version
def check_aggregate_support(self, aggregate):
"""
Checks if the given aggregate name is supported (that is, if it's
in `self.valid_aggregates`).
"""
agg_name = aggregate.__class__.__name__
return agg_name in self.valid_aggregates
def convert_extent(self, box, srid):
"""
Returns a 4-tuple extent for the `Extent` aggregate by converting

View File

@ -13,7 +13,7 @@ from django.utils import six
from django.utils.functional import cached_property
class SpatiaLiteOperations(DatabaseOperations, BaseSpatialOperations):
class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations):
name = 'spatialite'
spatialite = True
version_regex = re.compile(r'^(?P<major>\d)\.(?P<minor1>\d)\.(?P<minor2>\d+)')
@ -121,15 +121,6 @@ class SpatiaLiteOperations(DatabaseOperations, BaseSpatialOperations):
def geojson(self):
return 'AsGeoJSON' if self.spatial_version >= (3, 0, 0) else None
def check_aggregate_support(self, aggregate):
"""
Checks if the given aggregate name is supported (that is, if it's
in `self.valid_aggregates`).
"""
super(SpatiaLiteOperations, self).check_aggregate_support(aggregate)
agg_name = aggregate.__class__.__name__
return agg_name in self.valid_aggregates
def convert_extent(self, box, srid):
"""
Convert the polygon data received from Spatialite to min/max values.

View File

@ -7,6 +7,7 @@ __all__ = ['Collect', 'Extent', 'Extent3D', 'MakeLine', 'Union']
class GeoAggregate(Aggregate):
template = None
function = None
contains_aggregate = 'gis'
is_extent = False
def as_sql(self, compiler, connection):

View File

@ -224,6 +224,7 @@ class BaseDatabaseFeatures(object):
def supports_stddev(self):
"""Confirm support for STDDEV and related stats functions."""
class StdDevPop(object):
contains_aggregate = True
sql_function = 'STDDEV_POP'
try: