10
10
# ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
11
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
12
13
- from operator import itemgetter
14
13
import re
15
14
from datetime import date , datetime
16
15
from functools import partial
@@ -156,11 +155,54 @@ def _parse_expression_inputs(expressions):
156
155
validated_expressions = []
157
156
alias_map = {}
158
157
159
- for expression in expressions :
160
- if type (expression ) is dict :
161
- expr_raw , alias = itemgetter ("expr" , "name" )(expression )
162
- parsed = expr_raw
163
- else :
158
+ if isinstance (expressions , dict ):
159
+ for alias in expressions .keys ():
160
+ expression = expressions [alias ]
161
+
162
+ column_id_map = {}
163
+ column_name_map = {}
164
+
165
+ # we need to be able to modify the running_cidx inside of every call to
166
+ # replacer_fn - must pass by reference unfortunately
167
+ running_cidx = [0 ]
168
+
169
+ replacer_fn = partial (
170
+ _replace_expression_column_name ,
171
+ column_name_map ,
172
+ column_id_map ,
173
+ running_cidx ,
174
+ )
175
+
176
+ parsed = expression
177
+ parsed = re .sub (
178
+ BOOLEAN_LITERAL_REGEX ,
179
+ lambda match : "True" if match .group (0 ) == "true" else ("False" if match .group (0 ) == "false" else match .group (0 )),
180
+ parsed ,
181
+ )
182
+
183
+ parsed = re .sub (EXPRESSION_COLUMN_NAME_REGEX , replacer_fn , parsed )
184
+ parsed = re .sub (
185
+ STRING_LITERAL_REGEX ,
186
+ lambda match : "intern({0})" .format (match .group (0 )),
187
+ parsed ,
188
+ )
189
+
190
+ # remove the `intern()` in bucket and regex functions that take
191
+ # string literal parameters. TODO this logic should be centralized
192
+ # in C++ instead of being duplicated.
193
+ parsed = re .sub (FUNCTION_LITERAL_REGEX , _replace_interned_param , parsed )
194
+ parsed = re .sub (REPLACE_FN_REGEX , _replace_interned_param , parsed )
195
+
196
+ validated = [alias , expression , parsed , column_id_map ]
197
+
198
+ if alias_map .get (alias ) is not None :
199
+ idx = alias_map [alias ]
200
+ validated_expressions [idx ] = validated
201
+ else :
202
+ validated_expressions .append (validated )
203
+ alias_map [alias ] = len (validated_expressions ) - 1
204
+ if isinstance (expressions , list ):
205
+ for expression in expressions :
164
206
expr_raw = expression
165
207
parsed = expr_raw
166
208
alias_match = re .match (ALIAS_REGEX , expr_raw )
@@ -169,49 +211,49 @@ def _parse_expression_inputs(expressions):
169
211
else :
170
212
alias = expr_raw
171
213
172
- if '""' in expr_raw :
173
- raise ValueError ("Cannot reference empty column in expression!" )
174
-
175
- column_id_map = {}
176
- column_name_map = {}
177
-
178
- # we need to be able to modify the running_cidx inside of every call to
179
- # replacer_fn - must pass by reference unfortunately
180
- running_cidx = [0 ]
181
-
182
- replacer_fn = partial (
183
- _replace_expression_column_name ,
184
- column_name_map ,
185
- column_id_map ,
186
- running_cidx ,
187
- )
188
-
189
- parsed = re .sub (
190
- BOOLEAN_LITERAL_REGEX ,
191
- lambda match : "True" if match .group (0 ) == "true" else ("False" if match .group (0 ) == "false" else match .group (0 )),
192
- parsed ,
193
- )
194
-
195
- parsed = re .sub (EXPRESSION_COLUMN_NAME_REGEX , replacer_fn , parsed )
196
- parsed = re .sub (
197
- STRING_LITERAL_REGEX ,
198
- lambda match : "intern({0})" .format (match .group (0 )),
199
- parsed ,
200
- )
201
-
202
- # remove the `intern()` in bucket and regex functions that take
203
- # string literal parameters. TODO this logic should be centralized
204
- # in C++ instead of being duplicated.
205
- parsed = re .sub (FUNCTION_LITERAL_REGEX , _replace_interned_param , parsed )
206
- parsed = re .sub (REPLACE_FN_REGEX , _replace_interned_param , parsed )
207
-
208
- validated = [alias , expr_raw , parsed , column_id_map ]
209
-
210
- if alias_map .get (alias ) is not None :
211
- idx = alias_map [alias ]
212
- validated_expressions [idx ] = validated
213
- else :
214
- validated_expressions .append (validated )
215
- alias_map [alias ] = len (validated_expressions ) - 1
214
+ if '""' in expr_raw :
215
+ raise ValueError ("Cannot reference empty column in expression!" )
216
+
217
+ column_id_map = {}
218
+ column_name_map = {}
219
+
220
+ # we need to be able to modify the running_cidx inside of every call to
221
+ # replacer_fn - must pass by reference unfortunately
222
+ running_cidx = [0 ]
223
+
224
+ replacer_fn = partial (
225
+ _replace_expression_column_name ,
226
+ column_name_map ,
227
+ column_id_map ,
228
+ running_cidx ,
229
+ )
230
+
231
+ parsed = re .sub (
232
+ BOOLEAN_LITERAL_REGEX ,
233
+ lambda match : "True" if match .group (0 ) == "true" else ("False" if match .group (0 ) == "false" else match .group (0 )),
234
+ parsed ,
235
+ )
236
+
237
+ parsed = re .sub (EXPRESSION_COLUMN_NAME_REGEX , replacer_fn , parsed )
238
+ parsed = re .sub (
239
+ STRING_LITERAL_REGEX ,
240
+ lambda match : "intern({0})" .format (match .group (0 )),
241
+ parsed ,
242
+ )
243
+
244
+ # remove the `intern()` in bucket and regex functions that take
245
+ # string literal parameters. TODO this logic should be centralized
246
+ # in C++ instead of being duplicated.
247
+ parsed = re .sub (FUNCTION_LITERAL_REGEX , _replace_interned_param , parsed )
248
+ parsed = re .sub (REPLACE_FN_REGEX , _replace_interned_param , parsed )
249
+
250
+ validated = [alias , expr_raw , parsed , column_id_map ]
251
+
252
+ if alias_map .get (alias ) is not None :
253
+ idx = alias_map [alias ]
254
+ validated_expressions [idx ] = validated
255
+ else :
256
+ validated_expressions .append (validated )
257
+ alias_map [alias ] = len (validated_expressions ) - 1
216
258
217
259
return validated_expressions
0 commit comments