protected QueryGroupNode ComposeGroupNode(QueryNode node1, QueryNode node2, QueryGroupNodeType groupType) { QueryGroupNode group1 = node1 as QueryGroupNode, group2 = node2 as QueryGroupNode; if (group1 != null && group1.GroupType != groupType) { group1 = null; } if (group2 != null && group2.GroupType != groupType) { group2 = null; } // don't corrupt named groups if (group1 != null && group1.Name != null || group2 != null && group2.Name != null) { group1 = group2 = null; } if (group1 == null) { if (group2 == null) { QueryGroupNode group = new QueryGroupNode(groupType); group.Nodes.Add(node1); group.Nodes.Add(node2); return(group); } else { group2.Nodes.Insert(0, node1); return(group2); } } else { if (group2 == null) { group1.Nodes.Add(node2); } else { foreach (QueryNode qn in group2.Nodes) { group1.Nodes.Add(qn); } } return(group1); } }
/// <summary> /// Initializes a new instance of the QueryGroupNode with specified logical operator /// </summary> /// <param name="type">group logical operator (<see cref="NI.Data.QueryGroupNodeType"/>)</param> public QueryGroupNode(QueryGroupNodeType type) { GroupType = type; _Nodes = new List <QueryNode>(); }
protected QueryNode ParseConditionGroup(string input, int startIdx, out int endIdx) { int nextEndIdx; LexemType lexemType = GetLexemType(input, startIdx, out nextEndIdx); string lexem = GetLexem(input, startIdx, nextEndIdx); QueryNode node; if (lexemType == LexemType.Delimiter && lexem == "(") { string nodeName = ParseNodeName(input, nextEndIdx, out endIdx); nextEndIdx = endIdx; // check for empty group lexemType = GetLexemType(input, nextEndIdx, out endIdx); if (lexemType == LexemType.Delimiter && GetLexem(input, nextEndIdx, endIdx) == ")") { node = null; // push back endIdx = nextEndIdx; } else { node = ParseConditionGroup(input, nextEndIdx, out endIdx); } if (nodeName != null) { if (node == null) { node = new QueryGroupNode(QueryGroupNodeType.And); } if (node is QueryNode) { ((QueryNode)node).Name = nodeName; } // for some reason QueryGroupNode is not derived from QueryNode... if (node is QueryGroupNode) { ((QueryGroupNode)node).Name = nodeName; } } // read ')' lexemType = GetLexemType(input, endIdx, out nextEndIdx); if (lexemType != LexemType.Delimiter || GetLexem(input, endIdx, nextEndIdx) != ")") { throw new RelExParseException( String.Format("Invalid syntax (position: {0}, expression: {1})", endIdx, input)); } endIdx = nextEndIdx; } else { node = ParseCondition(input, startIdx, out nextEndIdx); endIdx = nextEndIdx; } // check for group lexemType = GetLexemType(input, endIdx, out nextEndIdx); QueryGroupNodeType groupType = QueryGroupNodeType.And; if (GetGroupType(lexemType, input, endIdx, ref nextEndIdx, ref groupType)) { return(ComposeGroupNode(node, ParseConditionGroup(input, nextEndIdx, out endIdx), groupType)); } return(node); }
protected bool GetGroupType(LexemType lexemType, string s, int startIdx, ref int endIdx, ref QueryGroupNodeType groupType) { string lexem = GetLexem(s, startIdx, endIdx).ToLower(); if (lexemType == LexemType.Name) { int idx = Array.IndexOf(nameGroups, lexem); if (idx < 0) { return(false); } groupType = enumGroups[idx]; return(true); } if (lexemType == LexemType.Delimiter) { // read all available delimiters... GetAllDelimiters(s, endIdx, out endIdx); lexem = GetLexem(s, startIdx, endIdx); int idx = Array.IndexOf(delimiterGroups, lexem); if (idx < 0) { return(false); } groupType = enumGroups[idx]; return(true); } return(false); }