/// <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); }
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); }
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); }
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); }