public CodeExpression Clone() { LogicalOR result = new LogicalOR(); result._leftExpression = RuleExpressionWalker.Clone(_leftExpression); result._rightExpression = RuleExpressionWalker.Clone(_rightExpression); return(result); }
public bool Match(CodeExpression expression) { LogicalOR other = expression as LogicalOR; return((other != null) && RuleExpressionWalker.Match(_leftExpression, other._leftExpression) && RuleExpressionWalker.Match(_rightExpression, other._rightExpression)); }
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; } }
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; }