예제 #1
0
        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))));
        }
예제 #2
0
        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);
        }
예제 #3
0
        /// <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);
        }
예제 #5
0
 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)));
 }