1
1
from sqlalchemy import func
2
- from sqlalchemy .sql .expression import FunctionElement
3
- from sqlalchemy .types import UserDefinedType
2
+ from sqlalchemy .sql .expression import FunctionElement , ClauseElement , Executable
3
+ # from sqlalchemy.types import UserDefinedType
4
4
from sqlalchemy .ext .compiler import compiles
5
5
6
6
9
9
# function to pull from the database
10
10
def compiles_as_bound (cls ):
11
11
12
+ @compiles (cls )
13
+ def compile_function (element , compiler , ** kw ):
14
+ return None
15
+
12
16
@compiles (cls , 'postgresql' )
13
17
def compile_function (element , compiler , ** kw ):
14
18
val = "%s(%s)" % (element .name , compiler .process (element .clauses .clauses [0 ]))
15
19
#ST_AsText("\"ODM2\".\"SamplingFeatures\".\"FeatureGeometry\"")
16
20
return val
17
21
18
- @compiles (cls ) # , 'mysql')
22
+ @compiles (cls , 'mysql' )
19
23
def compile_function (element , compiler , ** kw ):
20
24
val = "%s(%s)" % (element .name .lower ().split ('_' )[1 ], compiler .process (element .clauses .clauses [0 ]))
21
25
#astext("`ODM2`.`SamplingFeatures`.`FeatureGeometry`")
@@ -24,12 +28,15 @@ def compile_function(element, compiler, **kw):
24
28
25
29
@compiles (cls , 'sqlite' )
26
30
def compile_function (element , compiler , ** kw ):
27
- return "%s(%s)" % (element .name .split ('_' )[- 1 ], compiler .process (element .clauses .clauses [0 ]))
28
- #return ST_AsText(samplingfeatures.featuregeometry)
31
+ #ST_AsText(samplingfeatures.featuregeometry)
32
+ #assuming the user is using spatialite
33
+ #return "%s(%s)"%(element.name.split('_')[-1], compiler.process(element.clauses.clauses[0]))
34
+ #what if user does not have a spatial db?
35
+ return "%s" % compiler .process (element .clauses .clauses [0 ])
29
36
30
37
@compiles (cls , 'mssql' )
31
38
def compile_function (element , compiler , ** kw ):
32
- #[SamplingFeatures_1 ].[FeatureGeometry].STAsText()
39
+ #[SamplingFeatures ].[FeatureGeometry].STAsText()
33
40
return "%s.%s()" % (compiler .process (element .clauses .clauses [0 ]), element .name .replace ('_' , '' ) )
34
41
35
42
return cls
@@ -55,23 +62,30 @@ def compile_function(element, compiler, **kw):
55
62
# GeomFromText("POINT(30 10)")
56
63
# GeomFromText(:featuregeometry)
57
64
58
- val = "%s(%s)" % (name , element .clauses . clauses [ 0 ] )
65
+ val = "%s(%s)" % (name , compiler . process ( element .bindelement ) )
59
66
return val
60
67
61
68
@compiles (cls , 'sqlite' )
62
69
def compile_function (element , compiler , ** kw ):
63
70
name = element .name .split ('_' )[- 1 ]
64
71
#return "%s(%s)" % (element.name.replace('_', ''), "'POINT (30 10)'")
72
+ #assuming the user is using spatialite
73
+ #return "%s(%s)"%(name, "'POINT(30 10)'")
65
74
66
- return "%s(%s)" % (name , "'POINT(30 10)'" )
75
+ #what if user does not have a spatial?
76
+ # >>> self.bindtemplate
77
+ # '?'
78
+ # (BindParameter('featuregeometry', None, type_=Geometry()),)
79
+ # >>> dialect.paramstyle
80
+ #print compiler.bindtemplate
81
+ return "%s(%s)" % (name , '' )
67
82
68
83
@compiles (cls , 'mssql' )
69
84
def compile_function (element , compiler , ** kw ):
70
85
#return "Geometry::%s(%s, 0)"%(element.name.replace('_', ''), "'POINT (30 10)'")
71
86
name = "Geometry::%s" % element .name .replace ('_' , '' )
72
- return "%s(%s,0)" % (name , "'POINT(30 10)'" )
73
-
74
87
88
+ return "%s(%s,0)" % (name , "'POINT(30 10)'" )
75
89
76
90
return cls
77
91
@@ -81,6 +95,8 @@ def compile_function(element, compiler, **kw):
81
95
class ST_GeomFromText (FunctionElement ):
82
96
name = "ST_GeomFromText"
83
97
98
+
99
+
84
100
@compiles_as_bound
85
101
class ST_AsText (FunctionElement ):
86
102
name = 'ST_AsText'
@@ -89,7 +105,8 @@ class ST_AsText(FunctionElement):
89
105
class ST_AsBinary (FunctionElement ):
90
106
name = 'ST_AsBinary'
91
107
92
- from sqlalchemy import String , type_coerce
108
+
109
+
93
110
class Geometry (GeometryBase ):
94
111
95
112
def column_expression (self , col ):
@@ -99,21 +116,17 @@ def column_expression(self, col):
99
116
return value
100
117
101
118
def bind_expression (self , bindvalue ):
102
-
103
- #mysql, sqlite
119
+ val = None
120
+ # mysql, sqlite
104
121
val = func .GeomFromText (bindvalue , type_ = self )
105
122
106
- #postgresql
107
- #val = func.ST_GeomFromText(bindvalue, type_=self)
108
- #mssql
123
+ # postgresql
124
+ # val = func.ST_GeomFromText(bindvalue, type_=self)
125
+ # mssql
109
126
if val is None :
110
127
val = ST_GeomFromText (bindvalue , type_ = self )
111
128
return val
112
129
113
130
114
131
115
132
116
-
117
-
118
-
119
-
0 commit comments