private ExpressionBuilder <K> BuildExpression(DefaultExpressionTokens tokens, ExpressionBuilder <K> builder) { var intermBuilder = new ExpressionBuilder <K>(); intermBuilder = tokens.Tokens.Aggregate(intermBuilder, (b, t) => { var lExpressionToken = t as ConditionExpressionToken; if (lExpressionToken != null) { return(BuildExpression(lExpressionToken, b)); } var lTokens = t as DefaultExpressionTokens; if (lTokens != null) { return(BuildExpression(lTokens, b)); } return(b); }); var fOperator = tokens.PreviousToken as BinaryExpressionToken; if (fOperator == null) { return(intermBuilder); } switch (fOperator.Operator) { case BinaryOperatorType.AND: return(builder.And(intermBuilder.Expr)); case BinaryOperatorType.OR: return(builder.Or(intermBuilder.Expr)); default: throw new ArgumentException($"Binary operator '{fOperator.Operator}' not supported"); } }
private void ProcessOperandArray() { if (new[] { LogicalOperatorType.IN, LogicalOperatorType.NI }.All(s => s != _currentExpressionToken.Operator)) { var errorMessage = $"Invalid Field Value for Logical Operator, Operator : {_currentExpressionToken.Operator}, " + $"ParserState : {_context.GetProcessedString()}"; SetState(new ErrorParserState { ErrorMessage = errorMessage }); return; } var token = _context.GetToken(new[] { Delimiters.OPEN_BRACE }, new[] { Delimiters.CLOSE_BRACE }).Item1; var subTokens = token.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries); if (!subTokens.Any()) { var errorMessage = $"Set cannot be Empty. It should contain atleast one Field Value, ParserState : {_context.GetProcessedString()}"; SetState(new ErrorParserState { ErrorMessage = errorMessage }); return; } if (!_parseRuleStack.Any()) { _parseRuleStack.Push(new DefaultExpressionTokens()); } var tExpressionTokens = new DefaultExpressionTokens(); for (int i = 0; i < subTokens.Length; i++) { var subToken = subTokens[i]; var tToken = new ConditionExpressionToken { FieldName = _currentExpressionToken.FieldName, Operator = _currentExpressionToken.Operator == LogicalOperatorType.IN ? LogicalOperatorType.EQ : LogicalOperatorType.NE, PreviousToken = tExpressionTokens.Tokens.LastOrDefault() }; if (subToken.StartsWith("'")) { tToken.Operand = subToken.Trim('\''); } else if (subToken.Equals("null", StringComparison.CurrentCultureIgnoreCase)) { tToken.Operand = null; } else { var errorMessage = $"Invalid Field Value, Value : {subToken}, ParserState : {_context.GetProcessedString()}"; SetState(new ErrorParserState { ErrorMessage = errorMessage }); return; } tExpressionTokens.Tokens.Add(tToken); if (i < subTokens.Length - 1) { tExpressionTokens.Tokens.Add(new BinaryExpressionToken { Operator = _currentExpressionToken.Operator == LogicalOperatorType.IN ? BinaryOperatorType.OR : BinaryOperatorType.AND, PreviousToken = tToken }); } } _currentExpressionToken = null; var previousToken = _parseRuleStack.Peek(); tExpressionTokens.PreviousToken = previousToken.Tokens.LastOrDefault(); previousToken.Tokens.Add(tExpressionTokens); SetState(new BinaryOperatorParserState()); }