public void GivenAQuantityWithComparatorOfMultipleBinaryOperator_WhenBuilt_ThenCorrectExpressionShouldBeCreated( string prefix, MultiaryOperator multiaryOperator, BinaryOperator lowerBoundOperator, BinaryOperator upperBoundOperator, decimal lowerBoundValue, decimal upperBoundValue) { const string system = "system"; const string code = "code"; Validate( CreateSearchParameter(SearchParamType.Quantity), null, $"{prefix}6.05|{system}|{code}", e => ValidateMultiaryExpression( e, MultiaryOperator.And, e1 => ValidateStringExpression(e1, FieldName.QuantitySystem, StringOperator.Equals, system, false), e1 => ValidateStringExpression(e1, FieldName.QuantityCode, StringOperator.Equals, code, false), e1 => ValidateMultiaryExpression( e1, multiaryOperator, e2 => ValidateBinaryExpression(e2, FieldName.Quantity, lowerBoundOperator, lowerBoundValue), e2 => ValidateBinaryExpression(e2, FieldName.Quantity, upperBoundOperator, upperBoundValue)))); }
public object VisitMultiary(MultiaryExpression expression, Context context) { MultiaryOperator op = expression.MultiaryOperation; IReadOnlyList <Expression> expressions = expression.Expressions; string operation; switch (op) { case MultiaryOperator.And: operation = "AND"; break; case MultiaryOperator.Or: operation = "OR"; break; default: { string message = string.Format( CultureInfo.InvariantCulture, Resources.UnhandledEnumValue, nameof(MultiaryOperator), op); Debug.Fail(message); throw new InvalidOperationException(message); } } if (op == MultiaryOperator.Or) { _queryBuilder.Append('('); } for (int i = 0; i < expressions.Count; i++) { // Output each expression. expressions[i].AcceptVisitor(this, context); if (i != expressions.Count - 1) { if (!char.IsWhiteSpace(_queryBuilder[_queryBuilder.Length - 1])) { _queryBuilder.Append(' '); } _queryBuilder.Append(operation).Append(' '); } } if (op == MultiaryOperator.Or) { _queryBuilder.Append(')'); } return(null); }
/// <summary> /// Initializes a new instance of the <see cref="MultiaryExpression"/> class. /// </summary> /// <param name="multiaryOperation">The multiary operator type.</param> /// <param name="expressions">The expressions.</param> public MultiaryExpression(MultiaryOperator multiaryOperation, IReadOnlyList <Expression> expressions) { EnsureArg.IsNotNull(expressions, nameof(expressions)); EnsureArg.IsTrue(expressions.Any(), nameof(expressions)); EnsureArg.IsTrue(expressions.All(o => o != null), nameof(expressions)); MultiaryOperation = multiaryOperation; Expressions = expressions; }
public static void ValidateMultiaryExpression( Expression expression, MultiaryOperator multiaryOperator, params Action <Expression>[] valueValidators) { MultiaryExpression multiaryExpression = Assert.IsType <MultiaryExpression>(expression); Assert.Equal(multiaryOperator, multiaryExpression.MultiaryOperation); Assert.Collection( multiaryExpression.Expressions, valueValidators); }
public void GivenANumberWithComparatorOfMultipleBinaryOperator_WhenBuilt_ThenCorrectExpressionShouldBeCreated( string prefix, MultiaryOperator multiaryOperator, BinaryOperator lowerBoundOperator, BinaryOperator upperBoundOperator) { Validate( CreateSearchParameter(SearchParamType.Number), null, $"{prefix}15.0", e => ValidateMultiaryExpression( e, multiaryOperator, e1 => ValidateBinaryExpression(e1, FieldName.Number, lowerBoundOperator, 14.95m), e1 => ValidateBinaryExpression(e1, FieldName.Number, upperBoundOperator, 15.05m))); }