|
@@ -1,11 +1,5 @@
|
|
|
import logging
|
|
|
-import math
|
|
|
-import dataclasses
|
|
|
-from .common import MatchSeries
|
|
|
-from structures.measurement import Measurement24v, Measurement480v
|
|
|
-from structures.plant import S7State, CompactLogixState
|
|
|
-from structures.correlated import CorrelatedMeasurements
|
|
|
-
|
|
|
+from .common import MatchSeries, ALLOWED_NAMES, ALLOWED_GLOBALS
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
"""
|
|
@@ -29,7 +23,8 @@ class MatchAny(MatchSeries):
|
|
|
|
|
|
# check if any field matches
|
|
|
for field, value in self._fields.items():
|
|
|
- if getattr(dataset, field, None) == value:
|
|
|
+ v = getattr(dataset, field, None)
|
|
|
+ if v == value or (isinstance(v, tuple) and value in v):
|
|
|
yield measurement
|
|
|
break
|
|
|
|
|
@@ -50,23 +45,13 @@ class MatchAll(MatchSeries):
|
|
|
# check if all fields match
|
|
|
success = True
|
|
|
for field, value in self._fields.items():
|
|
|
- if getattr(dataset, field, None) != value:
|
|
|
+ v = getattr(dataset, field, None)
|
|
|
+ if (not isinstance(v, tuple) and v != value) or (isinstance(v, tuple) and not all(x == value for x in v)):
|
|
|
success = False
|
|
|
break
|
|
|
if success:
|
|
|
yield measurement
|
|
|
|
|
|
-
|
|
|
-ALLOWED_NAMES = \
|
|
|
- [x.name for x in dataclasses.fields(Measurement24v)] + \
|
|
|
- [x.name for x in dataclasses.fields(Measurement480v)] + \
|
|
|
- [x.name for x in dataclasses.fields(CompactLogixState)] + \
|
|
|
- [x.name for x in dataclasses.fields(S7State)] + \
|
|
|
- [x.name for x in dataclasses.fields(CorrelatedMeasurements)] + \
|
|
|
- ['sum', 'min', 'max', 'avg', 'count', 'last']
|
|
|
-
|
|
|
-ALLOWED_NAMES = set([name for name in ALLOWED_NAMES if not name.startswith('_')])
|
|
|
-
|
|
|
class ComplexFilter():
|
|
|
def __init__(self, parent, predicate) -> None:
|
|
|
self._predicate = predicate
|
|
@@ -79,14 +64,7 @@ class ComplexFilter():
|
|
|
def execute(self, values):
|
|
|
for measurement in values:
|
|
|
try:
|
|
|
- if eval(self._compiled, {"__builtins__": {
|
|
|
- 'sum': sum,
|
|
|
- 'min': min,
|
|
|
- 'max': max,
|
|
|
- 'avg': lambda x: sum(x) / len(x),
|
|
|
- 'count': len,
|
|
|
- 'last': lambda x: x[-1],
|
|
|
- }}, measurement.__dict__):
|
|
|
+ if eval(self._compiled, {"__builtins__": ALLOWED_GLOBALS}, measurement.__dict__):
|
|
|
yield measurement
|
|
|
except Exception as e:
|
|
|
logger.error(f"Error while evaluating predicate '{self._predicate}': {e}")
|