public WhenConstructed() { this.node = new SingleValueFunctionCallNode(this.functionName); }
public WhenAddingAParameter() { this.node = new SingleValueFunctionCallNode("substringof"); this.node.Parameters.Add(parameter); }
private SingleValueNode ParseSingleValuePropertyAccess() { SingleValueNode result = null; SingleValueNode leftNode = null; BinaryOperatorKind operatorKind = BinaryOperatorKind.None; SingleValueNode rightNode = null; while (this.tokens.Count > 0) { var token = this.tokens.Dequeue(); switch (token.TokenType) { case TokenType.ArithmeticOperator: case TokenType.LogicalOperator: if (operatorKind != BinaryOperatorKind.None) { result = new BinaryOperatorNode(leftNode, operatorKind, rightNode); leftNode = null; rightNode = null; } operatorKind = BinaryOperatorKindParser.ToBinaryOperatorKind(token.Value); break; case TokenType.OpenParentheses: this.groupingDepth++; break; case TokenType.CloseParentheses: this.groupingDepth--; break; case TokenType.FunctionName: if (leftNode == null) { leftNode = new SingleValueFunctionCallNode(token.Value); } else if (rightNode == null) { rightNode = new SingleValueFunctionCallNode(token.Value); } break; case TokenType.PropertyName: if (leftNode == null) { leftNode = new SingleValuePropertyAccessNode(token.Value); } else if (rightNode == null) { rightNode = new SingleValuePropertyAccessNode(token.Value); } break; case TokenType.Decimal: case TokenType.Double: case TokenType.False: case TokenType.Single: case TokenType.Int32: case TokenType.Int64: case TokenType.DateTime: case TokenType.DateTimeOffset: case TokenType.Guid: case TokenType.String: case TokenType.Null: case TokenType.Time: case TokenType.True: rightNode = ConstantNodeParser.ParseConstantNode(token); break; } } result = result == null ? new BinaryOperatorNode(leftNode, operatorKind, rightNode) : new BinaryOperatorNode(result, operatorKind, leftNode ?? rightNode); return result; }
private SingleValueNode ParseSingleValueFunctionCall() { BinaryOperatorNode binaryNode = null; SingleValueFunctionCallNode node = null; var stack = new Stack<SingleValueFunctionCallNode>(); while (this.tokens.Count > 0) { var token = this.tokens.Dequeue(); switch (token.TokenType) { case TokenType.OpenParentheses: this.groupingDepth++; stack.Push(node); break; case TokenType.CloseParentheses: this.groupingDepth--; if (stack.Count > 0) { var lastNode = stack.Pop(); if (stack.Count > 0) { stack.Peek().Parameters.Add(lastNode); } else { if (binaryNode != null) { binaryNode.Right = lastNode; } else { node = lastNode; } } } break; case TokenType.FunctionName: node = new SingleValueFunctionCallNode(token.Value); break; case TokenType.LogicalOperator: binaryNode = new BinaryOperatorNode(node, BinaryOperatorKindParser.ToBinaryOperatorKind(token.Value), null); break; case TokenType.PropertyName: if (stack.Count > 0) { stack.Peek().Parameters.Add(new SingleValuePropertyAccessNode(token.Value)); } else { binaryNode.Right = new SingleValuePropertyAccessNode(token.Value); } break; case TokenType.Decimal: case TokenType.Double: case TokenType.False: case TokenType.Single: case TokenType.Int32: case TokenType.Int64: case TokenType.DateTime: case TokenType.DateTimeOffset: case TokenType.Guid: case TokenType.String: case TokenType.Null: case TokenType.Time: case TokenType.True: if (stack.Count > 0) { stack.Peek().Parameters.Add(ConstantNodeParser.ParseConstantNode(token)); } else { binaryNode.Right = ConstantNodeParser.ParseConstantNode(token); } break; } } if (binaryNode != null) { return binaryNode; } return node; }
/// <summary> /// Binds the specified <see cref="SingleValueFunctionCallNode"/>. /// </summary> /// <param name="singleValueFunctionCallNode">The <see cref="SingleValueFunctionCallNode"/> to bind.</param> protected abstract void BindSingleValueFunctionCallNode(SingleValueFunctionCallNode singleValueFunctionCallNode);