/// <summary> /// Returns the select clause defined by the filter declaration. /// </summary> private SimpleAttributeOperandCollection GetSelectClause() { SimpleAttributeOperandCollection selectClause = new SimpleAttributeOperandCollection(); // add the explicitly selected attributes. foreach (AeEventAttribute attribute in SelectedAttributes) { if (attribute != null) { SimpleAttributeOperand operand = new SimpleAttributeOperand(); operand.TypeDefinitionId = attribute.RootTypeId; operand.AttributeId = (attribute.NodeClass == NodeClass.Object) ? Attributes.NodeId : Attributes.Value; operand.BrowsePath = attribute.BrowsePath; selectClause.Add(operand); } } // need to request the condition id if condition events selected. if ((EventTypes & OpcRcw.Ae.Constants.CONDITION_EVENT) != 0) { SimpleAttributeOperand operand = new SimpleAttributeOperand(); operand.TypeDefinitionId = Opc.Ua.ObjectTypeIds.ConditionType; operand.AttributeId = Attributes.NodeId; operand.BrowsePath.Clear(); selectClause.Add(operand); } return(selectClause); }
/// <summary> /// Returns the select clause defined by the filter declaration. /// </summary> public SimpleAttributeOperandCollection GetSelectClause() { SimpleAttributeOperandCollection selectClause = new SimpleAttributeOperandCollection(); SimpleAttributeOperand operand = new SimpleAttributeOperand(); operand.TypeDefinitionId = Opc.Ua.ObjectTypeIds.BaseEventType; operand.AttributeId = Attributes.NodeId; selectClause.Add(operand); foreach (FilterDeclarationField field in Fields) { if (field.Selected) { operand = new SimpleAttributeOperand(); operand.TypeDefinitionId = field.InstanceDeclaration.RootTypeId; operand.AttributeId = (field.InstanceDeclaration.NodeClass == NodeClass.Object) ? Attributes.NodeId : Attributes.Value; operand.BrowsePath = field.InstanceDeclaration.BrowsePath; selectClause.Add(operand); } } return(selectClause); }
/// <summary> /// Constructs the select clauses for a set of event types. /// </summary> /// <param name="session">The session.</param> /// <param name="eventTypeIds">The event type ids.</param> /// <returns>The select clauses for all fields discovered.</returns> /// <remarks> /// Each event type is an ObjectType in the address space. The fields supported by the /// server are defined as children of the ObjectType. Many of the fields are manadatory /// and are defined by the UA information model, however, indiviudual servers many not /// support all of the optional fields. /// /// This method browses the type model and /// </remarks> public SimpleAttributeOperandCollection ConstructSelectClauses( Session session, params NodeId[] eventTypeIds) { // browse the type model in the server address space to find the fields available for the event type. SimpleAttributeOperandCollection selectClauses = new SimpleAttributeOperandCollection(); // must always request the NodeId for the condition instances. // this can be done by specifying an operand with an empty browse path. SimpleAttributeOperand operand = new SimpleAttributeOperand(); operand.TypeDefinitionId = ObjectTypeIds.BaseEventType; operand.AttributeId = Attributes.NodeId; operand.BrowsePath = new QualifiedNameCollection(); selectClauses.Add(operand); // add the fields for the selected EventTypes. if (eventTypeIds != null) { for (int ii = 0; ii < eventTypeIds.Length; ii++) { CollectFields(session, eventTypeIds[ii], selectClauses); } } // use BaseEventType as the default if no EventTypes specified. else { CollectFields(session, ObjectTypeIds.BaseEventType, selectClauses); } return(selectClauses); }
/// <summary> /// Returns the SelectClauses in the control. /// </summary> public SimpleAttributeOperandCollection GetSelectClauses() { SimpleAttributeOperandCollection clauses = new SimpleAttributeOperandCollection(); foreach (ListViewItem listItem in ItemsLV.Items) { SimpleAttributeOperand clause = listItem.Tag as SimpleAttributeOperand; if (clause != null) { clauses.Add(clause); } } return(clauses); }
/// <summary> /// Create expression from string /// </summary> public FilterExpression(string filterStatement) { // Parse var lexer = new FilterLexer(new AntlrInputStream(filterStatement)); lexer.RemoveErrorListeners(); lexer.AddErrorListener(new RaiseException <int>()); var parser = new FilterParser(new CommonTokenStream(lexer)); parser.RemoveErrorListeners(); parser.AddErrorListener(new RaiseException <IToken>()); var context = parser.parse(); // Fill in select and where clause SelectClause = new SimpleAttributeOperandCollection(); WhereClause = new ContentFilter(); if (context.selectList().STAR() != null) { // Select all / default } else { foreach (var expr in context.selectList().selectexpr()) { expr.attr_op().GetText(); var nodeId = expr.attr_op().nodeId().STRING_LITERAL().GetText(); var browsePathElems = expr.attr_op().nodeId().browsePathElement(); var attributeId = Enum.Parse <NodeAttribute>(expr.attr_op().attributeId().GetText(), true); var operand = new SimpleAttributeOperand { // TypeDefinitionId = expr.attr_op() // AttributeId = (field.InstanceDeclaration.NodeClass == NodeClass.Object) ? Attributes.NodeId : Attributes.Value, // BrowsePath = field.InstanceDeclaration.BrowsePath }; SelectClause.Add(operand); } } Evaluate(context.elem_op()); }
/// <summary> /// Collects the fields for the instance node. /// </summary> /// <param name="session">The session.</param> /// <param name="nodeId">The node id.</param> /// <param name="parentPath">The parent path.</param> /// <param name="eventFields">The event fields.</param> /// <param name="foundNodes">The table of found nodes.</param> private void CollectFields( Session session, NodeId nodeId, QualifiedNameCollection parentPath, SimpleAttributeOperandCollection eventFields, Dictionary <NodeId, QualifiedNameCollection> foundNodes) { // find all of the children of the field. BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = ReferenceTypeIds.Aggregates; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable); nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; ReferenceDescriptionCollection children = FormUtils.Browse(session, nodeToBrowse, false); if (children == null) { return; } // process the children. for (int ii = 0; ii < children.Count; ii++) { ReferenceDescription child = children[ii]; if (child.NodeId.IsAbsolute) { continue; } // construct browse path. QualifiedNameCollection browsePath = new QualifiedNameCollection(parentPath); browsePath.Add(child.BrowseName); // check if the browse path is already in the list. if (!ContainsPath(eventFields, browsePath)) { SimpleAttributeOperand field = new SimpleAttributeOperand(); field.TypeDefinitionId = ObjectTypeIds.BaseEventType; field.BrowsePath = browsePath; field.AttributeId = (child.NodeClass == NodeClass.Variable)?Attributes.Value:Attributes.NodeId; eventFields.Add(field); } // recusively find all of the children. NodeId targetId = (NodeId)child.NodeId; // need to guard against loops. if (!foundNodes.ContainsKey(targetId)) { foundNodes.Add(targetId, browsePath); CollectFields(session, (NodeId)child.NodeId, browsePath, eventFields, foundNodes); } } }
/// <summary> /// Collects the fields for the instance node. /// </summary> /// <param name="session">The session.</param> /// <param name="nodeId">The node id.</param> /// <param name="parentPath">The parent path.</param> /// <param name="fields">The event fields.</param> /// <param name="fieldNodeIds">The node id for the declaration of the field.</param> /// <param name="foundNodes">The table of found nodes.</param> private static void CollectFields( Session session, NodeId nodeId, QualifiedNameCollection parentPath, SimpleAttributeOperandCollection fields, List<NodeId> fieldNodeIds, Dictionary<NodeId, QualifiedNameCollection> foundNodes) { // find all of the children of the field. BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = nodeId; nodeToBrowse.BrowseDirection = BrowseDirection.Forward; nodeToBrowse.ReferenceTypeId = ReferenceTypeIds.Aggregates; nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable); nodeToBrowse.ResultMask = (uint)BrowseResultMask.All; ReferenceDescriptionCollection children = ClientUtils.Browse(session, nodeToBrowse, false); if (children == null) { return; } // process the children. for (int ii = 0; ii < children.Count; ii++) { ReferenceDescription child = children[ii]; if (child.NodeId.IsAbsolute) { continue; } // construct browse path. QualifiedNameCollection browsePath = new QualifiedNameCollection(parentPath); browsePath.Add(child.BrowseName); // check if the browse path is already in the list. int index = ContainsPath(fields, browsePath); if (index < 0) { SimpleAttributeOperand field = new SimpleAttributeOperand(); field.TypeDefinitionId = ObjectTypeIds.BaseEventType; field.BrowsePath = browsePath; field.AttributeId = (child.NodeClass == NodeClass.Variable) ? Attributes.Value : Attributes.NodeId; fields.Add(field); fieldNodeIds.Add((NodeId)child.NodeId); } // recusively find all of the children. NodeId targetId = (NodeId)child.NodeId; // need to guard against loops. if (!foundNodes.ContainsKey(targetId)) { foundNodes.Add(targetId, browsePath); CollectFields(session, (NodeId)child.NodeId, browsePath, fields, fieldNodeIds, foundNodes); } } }
/// <summary> /// Constructs the select clauses for a set of event types. /// </summary> /// <param name="session">The session.</param> /// <param name="eventTypeIds">The event type ids.</param> /// <returns>The select clauses for all fields discovered.</returns> /// <remarks> /// Each event type is an ObjectType in the address space. The fields supported by the /// server are defined as children of the ObjectType. Many of the fields are manadatory /// and are defined by the UA information model, however, indiviudual servers many not /// support all of the optional fields. /// /// This method browses the type model and /// </remarks> public SimpleAttributeOperandCollection ConstructSelectClauses( Session session, params NodeId[] eventTypeIds) { // browse the type model in the server address space to find the fields available for the event type. SimpleAttributeOperandCollection selectClauses = new SimpleAttributeOperandCollection(); // must always request the NodeId for the condition instances. // this can be done by specifying an operand with an empty browse path. SimpleAttributeOperand operand = new SimpleAttributeOperand(); operand.TypeDefinitionId = ObjectTypeIds.BaseEventType; operand.AttributeId = Attributes.NodeId; operand.BrowsePath = new QualifiedNameCollection(); selectClauses.Add(operand); // add the fields for the selected EventTypes. if (eventTypeIds != null) { for (int ii = 0; ii < eventTypeIds.Length; ii++) { CollectFields(session, eventTypeIds[ii], selectClauses); } } // use BaseEventType as the default if no EventTypes specified. else { CollectFields(session, ObjectTypeIds.BaseEventType, selectClauses); } return selectClauses; }
/// <summary> /// Returns the SelectClauses in the control. /// </summary> public SimpleAttributeOperandCollection GetSelectClauses() { SimpleAttributeOperandCollection clauses = new SimpleAttributeOperandCollection(); foreach (ListViewItem listItem in ItemsLV.Items) { SimpleAttributeOperand clause = listItem.Tag as SimpleAttributeOperand; if (clause != null) { clauses.Add(clause); } } return clauses; }