PageRenderTime 425ms CodeModel.GetById 202ms app.highlight 19ms RepoModel.GetById 132ms app.codeStats 0ms

/django/contrib/gis/db/backends/mysql/operations.py

https://code.google.com/p/mango-py/
Python | 65 lines | 54 code | 8 blank | 3 comment | 6 complexity | 5de72ca7ee87ff813615439a956fa2ca MD5 | raw file
 1from django.db.backends.mysql.base import DatabaseOperations
 2
 3from django.contrib.gis.db.backends.adapter import WKTAdapter
 4from django.contrib.gis.db.backends.base import BaseSpatialOperations
 5
 6class MySQLOperations(DatabaseOperations, BaseSpatialOperations):
 7
 8    compiler_module = 'django.contrib.gis.db.models.sql.compiler'
 9    mysql = True
10    name = 'mysql'
11    select = 'AsText(%s)'
12    from_wkb = 'GeomFromWKB'
13    from_text = 'GeomFromText'
14
15    Adapter = WKTAdapter
16    Adaptor = Adapter # Backwards-compatibility alias.
17
18    geometry_functions = {
19        'bbcontains' : 'MBRContains', # For consistency w/PostGIS API
20        'bboverlaps' : 'MBROverlaps', # .. ..
21        'contained' : 'MBRWithin',    # .. ..
22        'contains' : 'MBRContains',
23        'disjoint' : 'MBRDisjoint',
24        'equals' : 'MBREqual',
25        'exact' : 'MBREqual',
26        'intersects' : 'MBRIntersects',
27        'overlaps' : 'MBROverlaps',
28        'same_as' : 'MBREqual',
29        'touches' : 'MBRTouches',
30        'within' : 'MBRWithin',
31        }
32
33    gis_terms = dict([(term, None) for term in geometry_functions.keys() + ['isnull']])
34
35    def geo_db_type(self, f):
36        return f.geom_type
37
38    def get_geom_placeholder(self, value, srid):
39        """
40        The placeholder here has to include MySQL's WKT constructor.  Because
41        MySQL does not support spatial transformations, there is no need to
42        modify the placeholder based on the contents of the given value.
43        """
44        if hasattr(value, 'expression'):
45            placeholder = '%s.%s' % tuple(map(self.quote_name, value.cols[value.expression]))
46        else:
47            placeholder = '%s(%%s)' % self.from_text
48        return placeholder
49
50    def spatial_lookup_sql(self, lvalue, lookup_type, value, field, qn):
51        alias, col, db_type = lvalue
52
53        geo_col = '%s.%s' % (qn(alias), qn(col))
54
55        lookup_info = self.geometry_functions.get(lookup_type, False)
56        if lookup_info:
57            return "%s(%s, %s)" % (lookup_info, geo_col,
58                                   self.get_geom_placeholder(value, field.srid))
59
60        # TODO: Is this really necessary? MySQL can't handle NULL geometries
61        #  in its spatial indexes anyways.
62        if lookup_type == 'isnull':
63            return "%s IS %sNULL" % (geo_col, (not value and 'NOT ' or ''))
64
65        raise TypeError("Got invalid lookup_type: %s" % repr(lookup_type))