|
0
|
1 |
from django.db.models import Aggregate |
|
|
2 |
from django.contrib.gis.db.backend import SpatialBackend |
|
|
3 |
from django.contrib.gis.db.models.sql import GeomField |
|
|
4 |
|
|
|
5 |
class GeoAggregate(Aggregate): |
|
|
6 |
|
|
|
7 |
def add_to_query(self, query, alias, col, source, is_summary): |
|
|
8 |
if hasattr(source, 'geom_type'): |
|
|
9 |
# Doing additional setup on the Query object for spatial aggregates. |
|
|
10 |
aggregate = getattr(query.aggregates_module, self.name) |
|
|
11 |
|
|
|
12 |
# Adding a conversion class instance and any selection wrapping |
|
|
13 |
# SQL (e.g., needed by Oracle). |
|
|
14 |
if aggregate.conversion_class is GeomField: |
|
|
15 |
query.extra_select_fields[alias] = GeomField() |
|
|
16 |
if SpatialBackend.select: |
|
|
17 |
query.custom_select[alias] = SpatialBackend.select |
|
|
18 |
|
|
|
19 |
super(GeoAggregate, self).add_to_query(query, alias, col, source, is_summary) |
|
|
20 |
|
|
|
21 |
class Collect(GeoAggregate): |
|
|
22 |
name = 'Collect' |
|
|
23 |
|
|
|
24 |
class Extent(GeoAggregate): |
|
|
25 |
name = 'Extent' |
|
|
26 |
|
|
|
27 |
class MakeLine(GeoAggregate): |
|
|
28 |
name = 'MakeLine' |
|
|
29 |
|
|
|
30 |
class Union(GeoAggregate): |
|
|
31 |
name = 'Union' |