/// <summary> /// Create a BinaryOperatorNode /// </summary> /// <param name="operatorKind">The binary operator type.</param> /// <param name="left">The left operand.</param> /// <param name="right">The right operand.</param> /// <exception cref="System.ArgumentNullException">Throws if the left or right inputs are null.</exception> /// <exception cref="ODataException">Throws if the two operands don't have the same type.</exception> public BinaryOperatorNode(BinaryOperatorKind operatorKind, SingleValueNode left, SingleValueNode right) { ExceptionUtils.CheckArgumentNotNull(left, "left"); ExceptionUtils.CheckArgumentNotNull(right, "right"); this.operatorKind = operatorKind; this.left = left; this.right = right; // set the TypeReerence based on the Operands. if (this.Left == null || this.Right == null || this.Left.TypeReference == null || this.Right.TypeReference == null) { this.typeReference = null; } else { // Ensure that both operands have the same type if (!this.Left.TypeReference.Definition.IsEquivalentTo(this.Right.TypeReference.Definition)) { throw new ODataException( ODataErrorStrings.BinaryOperatorQueryNode_OperandsMustHaveSameTypes( this.Left.TypeReference.ODataFullName(), this.Right.TypeReference.ODataFullName())); } // Get a primitive type reference; this must not fail since we checked that the type is of kind 'primitive'. IEdmPrimitiveTypeReference primitiveOperatorTypeReference = this.Left.TypeReference.AsPrimitive(); this.typeReference = QueryNodeUtils.GetBinaryOperatorResultType(primitiveOperatorTypeReference, this.OperatorKind); } }
/// <summary> /// Create a BinaryOperatorNode /// </summary> /// <param name="operatorKind">The binary operator type.</param> /// <param name="left">The left operand.</param> /// <param name="right">The right operand.</param> /// <param name="typeReference">The result typeReference.</param> /// <exception cref="System.ArgumentNullException">Throws if the left or right inputs are null.</exception> internal BinaryOperatorNode(BinaryOperatorKind operatorKind, SingleValueNode left, SingleValueNode right, IEdmTypeReference typeReference) { ExceptionUtils.CheckArgumentNotNull(left, "left"); ExceptionUtils.CheckArgumentNotNull(right, "right"); this.operatorKind = operatorKind; this.left = left; this.right = right; // set the TypeReference if explictly given, otherwise based on the Operands. if (typeReference != null) { this.typeReference = typeReference; } else if (this.Left == null || this.Right == null || this.Left.TypeReference == null || this.Right.TypeReference == null) { this.typeReference = null; } else { // Get a primitive type reference; this must not fail since we checked that the type is of kind 'primitive'. IEdmPrimitiveTypeReference leftType = this.Left.TypeReference.AsPrimitive(); IEdmPrimitiveTypeReference rightType = this.Right.TypeReference.AsPrimitive(); this.typeReference = QueryNodeUtils.GetBinaryOperatorResultType(leftType, rightType, this.OperatorKind); } }