/// <summary> /// Eliminates the empty nodes (nodes that consist of only logical elements). /// </summary> /// <param name="nodes">The nodes.</param> /// <returns></returns> protected virtual FilterExpressionNodeCollection EliminateEmptyNodes(FilterExpressionNodeCollection nodes) { FilterExpressionNodeCollection expressions = new FilterExpressionNodeCollection(); foreach (FilterExpressionNode node in nodes) { if (node.NodeType == FilterExpressionNodeType.Element || node.NodeType == FilterExpressionNodeType.MethodBlock) { expressions.Add(node); } else { // Only add node if it has the actual "Element's" and does not consist of only logical AND's and OR's if (node.HasChildNodes) { FilterExpressionNodeCollection subTree = EliminateEmptyNodes(node.ChildNodes); if (subTree != null && subTree.Count > 0) { expressions.Add(node); } } } } return(expressions); }
/// <summary> /// Adds the expression as node. /// </summary> /// <param name="col">The col.</param> /// <param name="expr">The expr.</param> protected virtual void AddExpressionAsNode(ref FilterExpressionNodeCollection col, CodeExpression expr) { if (expr is CodeBinaryOperatorExpression) { AddExpressionAsNode(ref col, (CodeBinaryOperatorExpression)expr); } else if (expr is CodeMethodInvokeExpression) { col.Add(ConvertExpressionToNode((CodeMethodInvokeExpression)expr)); } }
/// <summary> /// Adds the expression as node. /// </summary> /// <param name="col">The col.</param> /// <param name="expr">The expr.</param> protected virtual void AddExpressionAsNode(ref FilterExpressionNodeCollection col, CodeBinaryOperatorExpression expr) { if (expr.Left is CodeMethodInvokeExpression) { col.Add(ConvertExpressionToNode((CodeMethodInvokeExpression)expr.Left)); } else if (expr.Left is CodeBinaryOperatorExpression) { AddExpressionAsNode(ref col, expr.Left); } // Only need an operator if right is an expression FilterExpressionNode blockNode = null; if (expr.Right is CodeBinaryOperatorExpression) { if (expr.Operator == CodeBinaryOperatorType.BooleanAnd) { blockNode = new FilterExpressionNode(FilterExpressionNodeType.AndBlock, String.Empty); } else if (expr.Operator == CodeBinaryOperatorType.BooleanOr) { blockNode = new FilterExpressionNode(FilterExpressionNodeType.OrBlock, String.Empty); } col.Add(blockNode); FilterExpressionNodeCollection blockCol = new FilterExpressionNodeCollection(); AddExpressionAsNode(ref blockCol, expr.Right); blockNode.ChildNodes = blockCol; } if (expr.Right is CodeMethodInvokeExpression) { col.Add(ConvertExpressionToNode((CodeMethodInvokeExpression)expr.Right)); } }