from types import UnicodeType def gqn(val): """ The geographic quote name function; used for quoting tables and geometries (they use single rather than the double quotes of the backend quotename function). """ if isinstance(val, basestring): if isinstance(val, UnicodeType): val = val.encode('ascii') return "'%s'" % val else: return str(val) class SpatialOperation(object): """ Base class for generating spatial SQL. """ def __init__(self, function='', operator='', result='', beg_subst='', end_subst=''): self.function = function self.operator = operator self.result = result self.beg_subst = beg_subst try: # Try and put the operator and result into to the # end substitution. self.end_subst = end_subst % (operator, result) except TypeError: self.end_subst = end_subst @property def sql_subst(self): return ''.join([self.beg_subst, self.end_subst]) def as_sql(self, geo_col): return self.sql_subst % self.params(geo_col) def params(self, geo_col): return (geo_col, self.operator) class SpatialFunction(SpatialOperation): """ Base class for generating spatial SQL related to a function. """ def __init__(self, func, beg_subst='%s(%s, %%s', end_subst=')', result='', operator=''): # Getting the function prefix. kwargs = {'function' : func, 'operator' : operator, 'result' : result, 'beg_subst' : beg_subst, 'end_subst' : end_subst,} super(SpatialFunction, self).__init__(**kwargs) def params(self, geo_col): return (self.function, geo_col)