@@ -155,23 +155,23 @@ def __init__(self, tokens):
155
155
156
156
# NOTE we should perhaps add a Operator superclass of UnaryMinus,
157
157
# BinaryOperator and ComparisonOperator to reduce duplication
158
- # when doing things like referenced_fields. We should probably
159
- # be extracting the operators and operands once.
158
+ # when doing things like referenced_fields.
160
159
161
160
162
161
class UnaryMinus (EvaluationNode ):
162
+ def __init__ (self , tokens ):
163
+ super ().__init__ (tokens )
164
+ self .op , self .operand = self .tokens
165
+ assert self .op == "-"
166
+
163
167
def eval (self , data ):
164
- op , operand = self .tokens
165
- assert op == "-"
166
- return - 1 * operand .eval (data )
168
+ return - 1 * self .operand .eval (data )
167
169
168
170
def __repr__ (self ):
169
- _ , operand = self .tokens
170
- return f"-({ repr (operand )} )"
171
+ return f"-({ repr (self .operand )} )"
171
172
172
173
def referenced_fields (self ):
173
- _ , operand = self .tokens
174
- return operand .referenced_fields ()
174
+ return self .operand .referenced_fields ()
175
175
176
176
177
177
def double_and (a , b ):
@@ -239,29 +239,29 @@ class BinaryOperator(EvaluationNode):
239
239
"||" : double_or ,
240
240
}
241
241
242
- def eval (self , data ):
242
+ def __init__ (self , tokens ):
243
+ super ().__init__ (tokens )
243
244
# get the operators and operands in pairs
244
- operands = self .tokens [0 ::2 ]
245
- ops = self .tokens [1 ::2 ]
245
+ self .operands = self .tokens [0 ::2 ]
246
+ self .ops = self .tokens [1 ::2 ]
247
+
248
+ def eval (self , data ):
246
249
# start by eval()'ing the first operand
247
- ret = operands [0 ].eval (data )
248
- for op , operand in zip (ops , operands [1 :]):
250
+ ret = self . operands [0 ].eval (data )
251
+ for op , operand in zip (self . ops , self . operands [1 :]):
249
252
arith_fn = self .op_map [op ]
250
253
ret = arith_fn (ret , operand .eval (data ))
251
254
return ret
252
255
253
256
def __repr__ (self ):
254
- ops = self .tokens [1 ::2 ]
255
- operands = self .tokens [0 ::2 ]
256
- ret = f"({ repr (operands [0 ])} )"
257
- for op , operand in zip (ops , operands [1 :]):
257
+ ret = f"({ repr (self .operands [0 ])} )"
258
+ for op , operand in zip (self .ops , self .operands [1 :]):
258
259
ret += f"{ op } ({ repr (operand )} )"
259
260
return ret
260
261
261
262
def referenced_fields (self ):
262
- operands = self .tokens [0 ::2 ]
263
- ret = operands [0 ].referenced_fields ()
264
- for operand in operands [1 :]:
263
+ ret = self .operands [0 ].referenced_fields ()
264
+ for operand in self .operands [1 :]:
265
265
ret |= operand .referenced_fields ()
266
266
return ret
267
267
@@ -277,18 +277,19 @@ class ComparisonOperator(EvaluationNode):
277
277
"<=" : operator .le ,
278
278
}
279
279
280
+ def __init__ (self , tokens ):
281
+ super ().__init__ (tokens )
282
+ self .op1 , self .op , self .op2 = self .tokens
283
+ self .comparison_fn = self .op_map [self .op ]
284
+
280
285
def eval (self , data ):
281
- op1 , op , op2 = self .tokens
282
- comparison_fn = self .op_map [op ]
283
- return comparison_fn (op1 .eval (data ), op2 .eval (data ))
286
+ return self .comparison_fn (self .op1 .eval (data ), self .op2 .eval (data ))
284
287
285
288
def __repr__ (self ):
286
- op1 , op , op2 = self .tokens
287
- return f"({ repr (op1 )} ){ op } ({ repr (op2 )} )"
289
+ return f"({ repr (self .op1 )} ){ self .op } ({ repr (self .op2 )} )"
288
290
289
291
def referenced_fields (self ):
290
- op1 , _ , op2 = self .tokens
291
- return op1 .referenced_fields () | op2 .referenced_fields ()
292
+ return self .op1 .referenced_fields () | self .op2 .referenced_fields ()
292
293
293
294
294
295
# FILTER field expressions have special set-like semantics
0 commit comments