/django/contrib/gis/db/backends/mysql/operations.py
https://code.google.com/p/mango-py/ · Python · 65 lines · 53 code · 9 blank · 3 comment · 4 complexity · 5de72ca7ee87ff813615439a956fa2ca MD5 · raw file
- from django.db.backends.mysql.base import DatabaseOperations
- from django.contrib.gis.db.backends.adapter import WKTAdapter
- from django.contrib.gis.db.backends.base import BaseSpatialOperations
- class MySQLOperations(DatabaseOperations, BaseSpatialOperations):
- compiler_module = 'django.contrib.gis.db.models.sql.compiler'
- mysql = True
- name = 'mysql'
- select = 'AsText(%s)'
- from_wkb = 'GeomFromWKB'
- from_text = 'GeomFromText'
- Adapter = WKTAdapter
- Adaptor = Adapter # Backwards-compatibility alias.
- geometry_functions = {
- 'bbcontains' : 'MBRContains', # For consistency w/PostGIS API
- 'bboverlaps' : 'MBROverlaps', # .. ..
- 'contained' : 'MBRWithin', # .. ..
- 'contains' : 'MBRContains',
- 'disjoint' : 'MBRDisjoint',
- 'equals' : 'MBREqual',
- 'exact' : 'MBREqual',
- 'intersects' : 'MBRIntersects',
- 'overlaps' : 'MBROverlaps',
- 'same_as' : 'MBREqual',
- 'touches' : 'MBRTouches',
- 'within' : 'MBRWithin',
- }
- gis_terms = dict([(term, None) for term in geometry_functions.keys() + ['isnull']])
- def geo_db_type(self, f):
- return f.geom_type
- def get_geom_placeholder(self, value, srid):
- """
- The placeholder here has to include MySQL's WKT constructor. Because
- MySQL does not support spatial transformations, there is no need to
- modify the placeholder based on the contents of the given value.
- """
- if hasattr(value, 'expression'):
- placeholder = '%s.%s' % tuple(map(self.quote_name, value.cols[value.expression]))
- else:
- placeholder = '%s(%%s)' % self.from_text
- return placeholder
- def spatial_lookup_sql(self, lvalue, lookup_type, value, field, qn):
- alias, col, db_type = lvalue
- geo_col = '%s.%s' % (qn(alias), qn(col))
- lookup_info = self.geometry_functions.get(lookup_type, False)
- if lookup_info:
- return "%s(%s, %s)" % (lookup_info, geo_col,
- self.get_geom_placeholder(value, field.srid))
- # TODO: Is this really necessary? MySQL can't handle NULL geometries
- # in its spatial indexes anyways.
- if lookup_type == 'isnull':
- return "%s IS %sNULL" % (geo_col, (not value and 'NOT ' or ''))
- raise TypeError("Got invalid lookup_type: %s" % repr(lookup_type))