def where_clause_from_evtype(evtypes): cf = ua.ContentFilter() el = ua.ContentFilterElement() # operands can be ElementOperand, LiteralOperand, AttributeOperand, SimpleAttribute # Create a clause where the generate event type property EventType # must be a subtype of events in evtypes argument # the first operand is the attribute event type op = ua.SimpleAttributeOperand() # op.TypeDefinitionId = evtype.nodeid op.BrowsePath.append(ua.QualifiedName("EventType", 0)) op.AttributeId = ua.AttributeIds.Value el.FilterOperands.append(op) # now create a list of all subtypes we want to accept subtypes = [] for evtype in evtypes: subtypes += [st.nodeid for st in ua_utils.get_node_subtypes(evtype)] subtypes = list(set(subtypes)) # remove duplicates for subtypeid in subtypes: op = ua.LiteralOperand() op.Value = ua.Variant(subtypeid) el.FilterOperands.append(op) el.FilterOperator = ua.FilterOperator.InList cf.Elements.append(el) return cf
def select_clauses_from_evtype(evtype): clauses = [] for prop in get_event_properties_from_type_node(evtype): op = ua.SimpleAttributeOperand() op.TypeDefinitionId = evtype.nodeid op.AttributeId = ua.AttributeIds.Value op.BrowsePath = [prop.get_browse_name()] clauses.append(op) return clauses
def _get_filter_from_event_type(self, eventtype): eventtype = self._get_node(eventtype) evfilter = ua.EventFilter() for desc in eventtype.get_children_descriptions(refs=ua.ObjectIds.HasProperty, nodeclassmask=ua.NodeClass.Variable): op = ua.SimpleAttributeOperand() op.TypeDefinitionId = eventtype.nodeid op.AttributeId = AttributeIds.Value op.BrowsePath = [desc.BrowseName] evfilter.SelectClauses.append(op) return evfilter
def select_clauses_from_evtype(evtypes): clauses = [] selected_paths = [] for evtype in evtypes: for prop in get_event_properties_from_type_node(evtype): if prop.get_browse_name() not in selected_paths: op = ua.SimpleAttributeOperand() op.AttributeId = ua.AttributeIds.Value op.BrowsePath = [prop.get_browse_name()] clauses.append(op) selected_paths.append(prop.get_browse_name()) return clauses
def where_clause_from_evtype(evtype): cf = ua.ContentFilter() el = ua.ContentFilterElement() # operands can be ElementOperand, LiteralOperand, AttributeOperand, SimpleAttribute op = ua.SimpleAttributeOperand() op.TypeDefinitionId = evtype.nodeid op.BrowsePath.append(ua.QualifiedName("EventType", 0)) op.AttributeId = ua.AttributeIds.Value el.FilterOperands.append(op) for subtypeid in [st.nodeid for st in get_node_subtypes(evtype)]: op = ua.LiteralOperand() op.Value = ua.Variant(subtypeid) el.FilterOperands.append(op) el.FilterOperator = ua.FilterOperator.InList cf.Elements.append(el) return cf
def test_where_clause(self): cf = ua.ContentFilter() el = ua.ContentFilterElement() op = ua.SimpleAttributeOperand() op.BrowsePath.append(ua.QualifiedName("property", 2)) el.FilterOperands.append(op) for i in range(10): op = ua.LiteralOperand() op.Value = ua.Variant(i) el.FilterOperands.append(op) el.FilterOperator = ua.FilterOperator.InList cf.Elements.append(el) wce = WhereClauseEvaluator(logging.getLogger(__name__), None, cf) ev = BaseEvent() ev._freeze = False ev.property = 3 self.assertTrue(wce.eval(ev))