Skip to content

Commit 7526549

Browse files
tomwhitejeromekelleher
authored andcommitted
Extract operators and operands once
1 parent f590118 commit 7526549

File tree

1 file changed

+29
-28
lines changed

1 file changed

+29
-28
lines changed

vcztools/filter.py

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -155,23 +155,23 @@ def __init__(self, tokens):
155155

156156
# NOTE we should perhaps add a Operator superclass of UnaryMinus,
157157
# 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.
160159

161160

162161
class UnaryMinus(EvaluationNode):
162+
def __init__(self, tokens):
163+
super().__init__(tokens)
164+
self.op, self.operand = self.tokens
165+
assert self.op == "-"
166+
163167
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)
167169

168170
def __repr__(self):
169-
_, operand = self.tokens
170-
return f"-({repr(operand)})"
171+
return f"-({repr(self.operand)})"
171172

172173
def referenced_fields(self):
173-
_, operand = self.tokens
174-
return operand.referenced_fields()
174+
return self.operand.referenced_fields()
175175

176176

177177
def double_and(a, b):
@@ -239,29 +239,29 @@ class BinaryOperator(EvaluationNode):
239239
"||": double_or,
240240
}
241241

242-
def eval(self, data):
242+
def __init__(self, tokens):
243+
super().__init__(tokens)
243244
# 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):
246249
# 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:]):
249252
arith_fn = self.op_map[op]
250253
ret = arith_fn(ret, operand.eval(data))
251254
return ret
252255

253256
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:]):
258259
ret += f"{op}({repr(operand)})"
259260
return ret
260261

261262
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:]:
265265
ret |= operand.referenced_fields()
266266
return ret
267267

@@ -277,18 +277,19 @@ class ComparisonOperator(EvaluationNode):
277277
"<=": operator.le,
278278
}
279279

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+
280285
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))
284287

285288
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)})"
288290

289291
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()
292293

293294

294295
# FILTER field expressions have special set-like semantics

0 commit comments

Comments
 (0)