/// <summary>
        /// Declares a new <see cref="QueryConditionNode"/> with the passed parameters.
        /// This is only possible, if <see cref="DeclareCondition(string, QueryConditionType, object)"/> or
        /// <see cref="DeclareConditionNode(QueryConditionNodeType, Func{QueryConditionBuilder}, Func{QueryConditionBuilder})"/>
        /// have not yet been called.
        /// </summary>
        /// <param name="nodeType">defines how the two resulting conditionBuilder are logically
        /// evaluated together</param>
        /// <param name="leftConditionBuilder">a delegate that returns the <see cref="QueryConditionBuilder"/>
        /// for the LEFT condition sub-tree</param>
        /// <param name="rightConditionBuilder">a delegate that returns the <see cref="QueryConditionBuilder"/>
        /// for the RIGHT condition sub-tree</param>
        /// <returns>a reference of itself</returns>
        public QueryConditionBuilder DeclareConditionNode(
            QueryConditionNodeType nodeType,
            Func <QueryConditionBuilder> leftConditionBuilder,
            Func <QueryConditionBuilder> rightConditionBuilder)
        {
            if (this.QueryCondition != null)
            {
                throw new InvalidOperationException("Can't declare more than 1 condition on this layer");
            }
            else if (leftConditionBuilder is null)
            {
                throw new ArgumentNullException(nameof(leftConditionBuilder));
            }
            else if (rightConditionBuilder is null)
            {
                throw new ArgumentNullException(nameof(rightConditionBuilder));
            }

            this.QueryCondition = new QueryConditionNode()
            {
                NodeType        = nodeType,
                FirstCondition  = leftConditionBuilder().Build(),
                SecondCondition = rightConditionBuilder().Build()
            };

            return(this);
        }
        /// <summary>
        /// Declares a uniting-condition from a set of <see cref="QueryConditionBuilder"/>.
        /// The single conditions are joined with a <see cref="QueryConditionNodeType.And"/> condition.
        /// </summary>
        /// <param name="builderSet">the set of builders to be joined</param>
        /// <returns>a uniting <see cref="QueryConditionBuilder"/> that contains all passed
        /// <see cref="QueryConditionBuilder"/>.</returns>
        public QueryConditionBuilder DeclareConditionFromBuilderSet(
            QueryConditionNodeType joiningNodeType,
            IEnumerable <QueryConditionBuilder> builderSet)
        {
            if (builderSet is null)
            {
                throw new ArgumentNullException(nameof(builderSet));
            }
            else if (!builderSet.Any())
            {
                throw new InvalidOperationException($"{nameof(builderSet)} is empty");
            }

            QueryConditionBuilder agglomerativeConditionBuilder = null;

            foreach (var builder in builderSet)
            {
                agglomerativeConditionBuilder = agglomerativeConditionBuilder == null
                    ? builder
                    : new QueryConditionBuilder()
                                                .DeclareConditionNode(
                    joiningNodeType,
                    () => agglomerativeConditionBuilder,
                    () => builder);
            }
            this.QueryCondition = agglomerativeConditionBuilder.QueryCondition;
            return(this);
        }
Example #3
0
        public void BasicQueryConditionNodeTests(
            QueryConditionNodeType combinationType,
            string expectedConditionStringFormat)
        {
            var firstConditionBuilder = new QueryConditionBuilder()
                                        .DeclareCondition("Id", QueryConditionType.Equals, 15);
            var secondConditionBuilder = new QueryConditionBuilder()
                                         .DeclareCondition("Name", QueryConditionType.Like, "Marcel");

            var condition = new QueryConditionBuilder()
                            .DeclareConditionNode(
                combinationType,
                () => firstConditionBuilder,
                () => secondConditionBuilder)
                            .Build();

            var expectedFirstConditionStringBuilder  = new StringBuilder();
            var expectedSecondConditionStringBuilder = new StringBuilder();
            var expectedQueryParameters = new List <QueryParameter>();

            firstConditionBuilder.Build()
            .AppendTo(expectedFirstConditionStringBuilder, expectedQueryParameters);
            secondConditionBuilder.Build()
            .AppendTo(expectedSecondConditionStringBuilder, expectedQueryParameters);

            var expectedConditionString = string.Format(
                expectedConditionStringFormat,
                expectedFirstConditionStringBuilder.ToString(),
                expectedSecondConditionStringBuilder.ToString());

            var actualConditionStringBuilder = new StringBuilder();
            var actualQueryParameters        = new List <QueryParameter>();

            condition.AppendTo(actualConditionStringBuilder, actualQueryParameters);

            Assert.Equal(expectedConditionString, actualConditionStringBuilder.ToString());
            Assert.Equal(expectedQueryParameters.Count, actualQueryParameters.Count);

            var idParameter   = actualQueryParameters.First(qp => qp.ParameterName == "Id0");
            var nameParameter = actualQueryParameters.First(qp => qp.ParameterName == "Name0");

            Assert.Equal(15, idParameter.Value);
            Assert.Equal("Marcel", nameParameter.Value);
        }
Example #4
0
        public void BalancedInterlacedQueryConditionNodeTests(
            QueryConditionNodeType combinationTypeOnFirstLayer,
            QueryConditionNodeType combinationInFirstInterlacedCondition,
            QueryConditionNodeType combinationInSecondInterlacedCondition,
            string expectedConditionString)
        {
            var condition = new QueryConditionBuilder()
                            .DeclareConditionNode(
                combinationTypeOnFirstLayer,
                () => new QueryConditionBuilder()
                .DeclareConditionNode(
                    combinationInFirstInterlacedCondition,
                    () => new QueryConditionBuilder().DeclareCondition("FirstName", QueryConditionType.Equals, "Marcel"),
                    () => new QueryConditionBuilder().DeclareCondition("FirstName", QueryConditionType.Equals, "Viktoria")),
                () => new QueryConditionBuilder()
                .DeclareConditionNode(
                    combinationInSecondInterlacedCondition,
                    () => new QueryConditionBuilder().DeclareCondition("LastName", QueryConditionType.Equals, "Hirscher"),
                    () => new QueryConditionBuilder().DeclareCondition("LastName", QueryConditionType.NotEquals, "Mathis")))
                            .Build();

            var actualConditionStringBuilder = new StringBuilder();
            var actualQueryParameters        = new List <QueryParameter>();

            condition.AppendTo(actualConditionStringBuilder, actualQueryParameters);

            Assert.Equal(expectedConditionString, actualConditionStringBuilder.ToString());
            Assert.Equal(4, actualQueryParameters.Count);

            var firstNameParameter1 = actualQueryParameters.First(qp => qp.ParameterName == "FirstName0");
            var firstNameParameter2 = actualQueryParameters.First(qp => qp.ParameterName == "FirstName1");
            var lastNameParameter1  = actualQueryParameters.First(qp => qp.ParameterName == "LastName0");
            var lastNameParameter2  = actualQueryParameters.First(qp => qp.ParameterName == "LastName1");

            Assert.Equal("Marcel", firstNameParameter1.Value);
            Assert.Equal("Viktoria", firstNameParameter2.Value);
            Assert.Equal("Hirscher", lastNameParameter1.Value);
            Assert.Equal("Mathis", lastNameParameter2.Value);
        }
Example #5
0
        public void UnbalancedInterlacedQueryConditionNodeTests(
            QueryConditionNodeType combinationTypeOnFirstLayer,
            QueryConditionNodeType combinationTypeForInterlacedCondition,
            bool interlacedCombinationOnLeft,
            string expectedConditionString)
        {
            var simpleConditionBuilder = new QueryConditionBuilder()
                                         .DeclareCondition("Id", QueryConditionType.NotEquals, 15);

            var interlacedConditionBuilder = new QueryConditionBuilder()
                                             .DeclareConditionNode(
                combinationTypeForInterlacedCondition,
                () => new QueryConditionBuilder().DeclareCondition("FirstName", QueryConditionType.Equals, "Marcel"),
                () => new QueryConditionBuilder().DeclareCondition("FirstName", QueryConditionType.Equals, "Viktoria"));

            var condition = new QueryConditionBuilder()
                            .DeclareConditionNode(
                combinationTypeOnFirstLayer,
                () => interlacedCombinationOnLeft ? interlacedConditionBuilder : simpleConditionBuilder,
                () => interlacedCombinationOnLeft ? simpleConditionBuilder : interlacedConditionBuilder)
                            .Build();

            var actualConditionStringBuilder = new StringBuilder();
            var actualQueryParameters        = new List <QueryParameter>();

            condition.AppendTo(actualConditionStringBuilder, actualQueryParameters);

            Assert.Equal(expectedConditionString, actualConditionStringBuilder.ToString());
            Assert.Equal(3, actualQueryParameters.Count);

            var idParameter         = actualQueryParameters.First(qp => qp.ParameterName == "Id0");
            var firstNameParameter1 = actualQueryParameters.First(qp => qp.ParameterName == "FirstName0");
            var firstNameParameter2 = actualQueryParameters.First(qp => qp.ParameterName == "FirstName1");

            Assert.Equal(15, idParameter.Value);
            Assert.Equal("Marcel", firstNameParameter1.Value);
            Assert.Equal("Viktoria", firstNameParameter2.Value);
        }