示例#1
0
        public CodeExpression Clone()
        {
            LogicalOR result = new LogicalOR();

            result._leftExpression  = RuleExpressionWalker.Clone(_leftExpression);
            result._rightExpression = RuleExpressionWalker.Clone(_rightExpression);
            return(result);
        }
示例#2
0
        public bool Match(CodeExpression expression)
        {
            LogicalOR other = expression as LogicalOR;

            return((other != null) &&
                   RuleExpressionWalker.Match(_leftExpression, other._leftExpression) &&
                   RuleExpressionWalker.Match(_rightExpression, other._rightExpression));
        }
示例#3
0
        private void GetLogicalOrByEvenListOfOrs(ref CodeExpression mainExpression, List <LogicalOR> individualLogicalOrs)
        {
            //make sure it is even
            if (individualLogicalOrs.Count % 2 != 0)
            {
                throw new ApplicationException("GetLogicalOrByEvenListOfOrs, was given a list that does not have an even number of items");
            }

            if (individualLogicalOrs.Count > 0)
            {
                for (int i = 2; i <= individualLogicalOrs.Count; i += 2)
                {
                    LogicalOR or = new LogicalOR(individualLogicalOrs[i - 2], individualLogicalOrs[i - 1]);
                    if (mainExpression == null)
                    {
                        mainExpression = or;
                    }
                    else
                    {
                        mainExpression = new LogicalOR(mainExpression, or);
                    }
                    individualLogicalOrs.Remove(individualLogicalOrs[0]);
                    individualLogicalOrs.Remove(individualLogicalOrs[0]);

                    if (individualLogicalOrs.Count > 0)
                    {
                        GetLogicalOrByEvenListOfOrs(ref mainExpression, individualLogicalOrs);
                    }
                    else
                    {
                        //terminating condition if the list of items we are processing is empty
                        return;
                    }
                }
            }
            //terminating condition for the recursion if count of list items == 0
            else
            {
                return;
            }
        }
示例#4
0
        private void GenerateFinalLogicalOrExpression()
        {
            CodeExpression mainOr = null;

            int countExpressions = _individualExpressions.Count;

            if (countExpressions > 1)
            {
                bool even = (countExpressions % 2 == 0) ? true : false;

                if (even)
                {
                    List <LogicalOR> list = new List <LogicalOR>();

                    for (int i = 2; i <= countExpressions; i += 2)
                    {
                        LogicalOR or = new LogicalOR(_individualExpressions[i - 2], _individualExpressions[i - 1]);
                        list.Add(or);
                    }

                    if (list.Count % 2 == 0)
                    {
                        GetLogicalOrByEvenListOfOrs(ref mainOr, list);
                    }
                    else
                    {
                        LogicalOR oddItem = list[0];
                        list.RemoveAt(0);

                        GetLogicalOrByEvenListOfOrs(ref mainOr, list);
                        if (mainOr == null)
                        {
                            mainOr = oddItem;
                        }
                        else
                        {
                            mainOr = new LogicalOR(oddItem, mainOr);
                        }
                    }

                    this._finalLogicalOrExpression = mainOr;
                }
                else
                {
                    List <LogicalOR> list = new List <LogicalOR>();

                    for (int i = 2; i <= countExpressions; i += 2)
                    {
                        LogicalOR or = new LogicalOR(_individualExpressions[i - 2], _individualExpressions[i - 1]);
                        list.Add(or);
                        //this is the last one since it is not even
                        if (i == countExpressions - 1)
                        {
                            mainOr = _individualExpressions[i];

                            if (list.Count % 2 == 0)
                            {
                                GetLogicalOrByEvenListOfOrs(ref mainOr, list);
                            }
                            else
                            {
                                LogicalOR oddItem = list[0];
                                list.RemoveAt(0);

                                GetLogicalOrByEvenListOfOrs(ref mainOr, list);
                                if (mainOr == null)
                                {
                                    mainOr = oddItem;
                                }
                                else
                                {
                                    mainOr = new LogicalOR(oddItem, mainOr);
                                }
                            }

                            //then there is one left
                        }
                    }
                }
            }
            else
            {
                //if there is not at least one i hope the ui will not allow the rule to be saved
                //but if so then the final expression will be just the expression like property=value
                mainOr = _individualExpressions[0];
            }

            this._finalLogicalOrExpression = mainOr;
        }