|
18 | 18 | # However, if you have executed another commercial license agreement |
19 | 19 | # with Crate these terms will supersede the license and you may use the |
20 | 20 | # software solely pursuant to the terms of the relevant commercial agreement. |
21 | | -import warnings |
22 | 21 |
|
23 | 22 | import sqlalchemy.types as sqltypes |
24 | 23 | from sqlalchemy.sql import operators, expression |
25 | 24 | from sqlalchemy.sql import default_comparator |
26 | 25 | from sqlalchemy.ext.mutable import Mutable |
27 | 26 |
|
28 | | -import geojson |
29 | | - |
30 | 27 |
|
31 | 28 | class MutableList(Mutable, list): |
32 | 29 |
|
@@ -74,91 +71,6 @@ def remove(self, item): |
74 | 71 | self.changed() |
75 | 72 |
|
76 | 73 |
|
77 | | -class MutableDict(Mutable, dict): |
78 | | - |
79 | | - @classmethod |
80 | | - def coerce(cls, key, value): |
81 | | - "Convert plain dictionaries to MutableDict." |
82 | | - |
83 | | - if not isinstance(value, MutableDict): |
84 | | - if isinstance(value, dict): |
85 | | - return MutableDict(value) |
86 | | - |
87 | | - # this call will raise ValueError |
88 | | - return Mutable.coerce(key, value) |
89 | | - else: |
90 | | - return value |
91 | | - |
92 | | - def __init__(self, initval=None, to_update=None, root_change_key=None): |
93 | | - initval = initval or {} |
94 | | - self._changed_keys = set() |
95 | | - self._deleted_keys = set() |
96 | | - self._overwrite_key = root_change_key |
97 | | - self.to_update = self if to_update is None else to_update |
98 | | - for k in initval: |
99 | | - initval[k] = self._convert_dict(initval[k], |
100 | | - overwrite_key=k if self._overwrite_key is None else self._overwrite_key |
101 | | - ) |
102 | | - dict.__init__(self, initval) |
103 | | - |
104 | | - def __setitem__(self, key, value): |
105 | | - value = self._convert_dict(value, key if self._overwrite_key is None else self._overwrite_key) |
106 | | - dict.__setitem__(self, key, value) |
107 | | - self.to_update.on_key_changed( |
108 | | - key if self._overwrite_key is None else self._overwrite_key |
109 | | - ) |
110 | | - |
111 | | - def __delitem__(self, key): |
112 | | - dict.__delitem__(self, key) |
113 | | - # add the key to the deleted keys if this is the root object |
114 | | - # otherwise update on root object |
115 | | - if self._overwrite_key is None: |
116 | | - self._deleted_keys.add(key) |
117 | | - self.changed() |
118 | | - else: |
119 | | - self.to_update.on_key_changed(self._overwrite_key) |
120 | | - |
121 | | - def on_key_changed(self, key): |
122 | | - self._deleted_keys.discard(key) |
123 | | - self._changed_keys.add(key) |
124 | | - self.changed() |
125 | | - |
126 | | - def _convert_dict(self, value, overwrite_key): |
127 | | - if isinstance(value, dict) and not isinstance(value, MutableDict): |
128 | | - return MutableDict(value, self.to_update, overwrite_key) |
129 | | - return value |
130 | | - |
131 | | - def __eq__(self, other): |
132 | | - return dict.__eq__(self, other) |
133 | | - |
134 | | - |
135 | | -class ObjectTypeImpl(sqltypes.UserDefinedType, sqltypes.JSON): |
136 | | - |
137 | | - __visit_name__ = "OBJECT" |
138 | | - |
139 | | - cache_ok = False |
140 | | - none_as_null = False |
141 | | - |
142 | | - |
143 | | -# Designated name to refer to. `Object` is too ambiguous. |
144 | | -ObjectType = MutableDict.as_mutable(ObjectTypeImpl) |
145 | | - |
146 | | -# Backward-compatibility aliases. |
147 | | -_deprecated_Craty = ObjectType |
148 | | -_deprecated_Object = ObjectType |
149 | | - |
150 | | -# https://www.lesinskis.com/deprecating-module-scope-variables.html |
151 | | -deprecated_names = ["Craty", "Object"] |
152 | | - |
153 | | - |
154 | | -def __getattr__(name): |
155 | | - if name in deprecated_names: |
156 | | - warnings.warn(f"{name} is deprecated and will be removed in future releases. " |
157 | | - f"Please use ObjectType instead.", DeprecationWarning) |
158 | | - return globals()[f"_deprecated_{name}"] |
159 | | - raise AttributeError(f"module {__name__} has no attribute {name}") |
160 | | - |
161 | | - |
162 | 74 | class Any(expression.ColumnElement): |
163 | 75 | """Represent the clause ``left operator ANY (right)``. ``right`` must be |
164 | 76 | an array expression. |
@@ -230,48 +142,3 @@ def get_col_spec(self, **kws): |
230 | 142 |
|
231 | 143 |
|
232 | 144 | ObjectArray = MutableList.as_mutable(_ObjectArray) |
233 | | - |
234 | | - |
235 | | -class Geopoint(sqltypes.UserDefinedType): |
236 | | - cache_ok = True |
237 | | - |
238 | | - class Comparator(sqltypes.TypeEngine.Comparator): |
239 | | - |
240 | | - def __getitem__(self, key): |
241 | | - return default_comparator._binary_operate(self.expr, |
242 | | - operators.getitem, |
243 | | - key) |
244 | | - |
245 | | - def get_col_spec(self): |
246 | | - return 'GEO_POINT' |
247 | | - |
248 | | - def bind_processor(self, dialect): |
249 | | - def process(value): |
250 | | - if isinstance(value, geojson.Point): |
251 | | - return value.coordinates |
252 | | - return value |
253 | | - return process |
254 | | - |
255 | | - def result_processor(self, dialect, coltype): |
256 | | - return tuple |
257 | | - |
258 | | - comparator_factory = Comparator |
259 | | - |
260 | | - |
261 | | -class Geoshape(sqltypes.UserDefinedType): |
262 | | - cache_ok = True |
263 | | - |
264 | | - class Comparator(sqltypes.TypeEngine.Comparator): |
265 | | - |
266 | | - def __getitem__(self, key): |
267 | | - return default_comparator._binary_operate(self.expr, |
268 | | - operators.getitem, |
269 | | - key) |
270 | | - |
271 | | - def get_col_spec(self): |
272 | | - return 'GEO_SHAPE' |
273 | | - |
274 | | - def result_processor(self, dialect, coltype): |
275 | | - return geojson.GeoJSON.to_instance |
276 | | - |
277 | | - comparator_factory = Comparator |
0 commit comments