示例#1
0
        protected QGroupNode ComposeGroupNode(QNode node1, QNode node2, QGroupType groupType)
        {
            QGroupNode group1 = node1 as QGroupNode, group2 = node2 as QGroupNode;

            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)
                {
                    QGroupNode group = new QGroupNode(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 (QNode qn in group2.Nodes)
                    {
                        group1.Nodes.Add(qn);
                    }
                }
                return(group1);
            }
        }
示例#2
0
文件: QGroupNode.cs 项目: vennim/data
 /// <summary>
 /// Initializes a new instance of the QueryGroupNode with specified logical operator
 /// </summary>
 /// <param name="type">group logical operator (<see cref="NReco.Data.QGroupType"/>)</param>
 public QGroupNode(QGroupType type)
 {
     GroupType = type;
     _Nodes    = new List <QNode>();
 }
示例#3
0
        protected QNode ParseConditionGroup(string input, int startIdx, out int endIdx)
        {
            int       nextEndIdx;
            LexemType lexemType = GetLexemType(input, startIdx, out nextEndIdx);
            string    lexem     = GetLexem(input, startIdx, nextEndIdx);

            QNode 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 QGroupNode(QGroupType.And);
                    }
                    if (node is QNode)
                    {
                        ((QNode)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);
            QGroupType groupType = QGroupType.And;

            if (GetGroupType(lexemType, input, endIdx, ref nextEndIdx, ref groupType))
            {
                return(ComposeGroupNode(node, ParseConditionGroup(input, nextEndIdx, out endIdx), groupType));
            }

            return(node);
        }
示例#4
0
        protected bool GetGroupType(LexemType lexemType, string s, int startIdx, ref int endIdx, ref QGroupType 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);
        }