1
1
from __future__ import annotations
2
2
3
3
import ast
4
- import functools
5
4
import re
5
+ from functools import lru_cache , partial
6
6
from operator import methodcaller
7
7
8
8
import parsy
@@ -50,7 +50,7 @@ def spaceless_string(*strings: str):
50
50
51
51
52
52
@public
53
- @functools . lru_cache (maxsize = 100 )
53
+ @lru_cache (maxsize = 100 )
54
54
def parse (
55
55
text : str , default_decimal_parameters : tuple [int | None , int | None ] = (None , None )
56
56
) -> dt .DataType :
@@ -88,12 +88,15 @@ def parse(
88
88
geotype = spaceless_string ("geography" , "geometry" )
89
89
90
90
srid_geotype = SEMICOLON .then (parsy .seq (srid = NUMBER .skip (COLON ), geotype = geotype ))
91
+ geotype_srid = COLON .then (parsy .seq (geotype = geotype , srid = SEMICOLON .then (NUMBER )))
91
92
geotype_part = COLON .then (parsy .seq (geotype = geotype ))
92
93
srid_part = SEMICOLON .then (parsy .seq (srid = NUMBER ))
93
94
94
95
def geotype_parser (typ : type [dt .DataType ]) -> dt .DataType :
95
96
return spaceless_string (typ .__name__ .lower ()).then (
96
- (srid_geotype | geotype_part | srid_part ).optional (dict ()).combine_dict (typ )
97
+ (srid_geotype | geotype_srid | geotype_part | srid_part )
98
+ .optional (dict ())
99
+ .combine_dict (typ )
97
100
)
98
101
99
102
primitive = (
@@ -116,15 +119,25 @@ def geotype_parser(typ: type[dt.DataType]) -> dt.DataType:
116
119
"time" ,
117
120
"date" ,
118
121
"null" ,
119
- ).map (functools .partial (getattr , dt ))
120
- | spaceless_string ("bytes" ).result (dt .binary )
121
- | geotype .map (dt .GeoSpatial )
122
+ ).map (partial (getattr , dt ))
122
123
| geotype_parser (dt .LineString )
123
124
| geotype_parser (dt .Polygon )
124
125
| geotype_parser (dt .Point )
125
126
| geotype_parser (dt .MultiLineString )
126
127
| geotype_parser (dt .MultiPolygon )
127
128
| geotype_parser (dt .MultiPoint )
129
+ | spaceless_string ("bytes" ).result (dt .binary )
130
+ | spaceless_string ("geospatial:geography" ).then (
131
+ srid_part .optional (dict ()).combine_dict (
132
+ partial (dt .GeoSpatial , geotype = "geography" )
133
+ )
134
+ )
135
+ | spaceless_string ("geospatial:geometry" ).then (
136
+ srid_part .optional (dict ()).combine_dict (
137
+ partial (dt .GeoSpatial , geotype = "geometry" )
138
+ )
139
+ )
140
+ | geotype .map (dt .GeoSpatial )
128
141
)
129
142
130
143
varchar_or_char = (
@@ -201,7 +214,7 @@ def geotype_parser(typ: type[dt.DataType]) -> dt.DataType:
201
214
| map
202
215
| struct
203
216
| spaceless_string ("jsonb" , "json" , "uuid" , "macaddr" , "inet" ).map (
204
- functools . partial (getattr , dt )
217
+ partial (getattr , dt )
205
218
)
206
219
| spaceless_string ("int" ).result (dt .int64 )
207
220
| spaceless_string ("str" ).result (dt .string )
0 commit comments