コード例 #1
0
        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");
            }
        }
コード例 #2
0
ファイル: FilterParser.cs プロジェクト: cvijayak/DriverAssist
        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());
        }