コード例 #1
0
        /// <summary>
        /// Recupera a chamada de função.
        /// </summary>
        /// <param name="enumerator"></param>
        /// <param name="configuration"></param>
        /// <param name="containerStop"></param>
        /// <param name="callName"></param>
        /// <returns></returns>
        private static ConditionalTerm GetFunctionCall(ref IEnumerator <Text.InterpreterExpression.Expression> enumerator, Text.InterpreterExpression.ILexerConfiguration configuration, char?containerStop, Column callName)
        {
            var call            = callName;
            var pars            = new List <ConditionalTerm>();
            var commaExpression = _conditionalLexer.TokenParser.GetTerm((int)Colosoft.Text.InterpreterExpression.TokenID.Comma);
            var token           = enumerator.Current;
            var distinctFlag    = false;

            while (!token.ToString().Equals(")"))
            {
                if (!enumerator.MoveNext())
                {
                    break;
                }
                token = enumerator.Current;
                if (token.ToString().Equals(")"))
                {
                    enumerator.MoveNext();
                    break;
                }
                var             termText = enumerator.Current.Text;
                ConditionalTerm term     = null;
                while (true)
                {
                    term = GetTerm(ref enumerator, configuration);
                    if (term is Column && StringComparer.InvariantCultureIgnoreCase.Equals(((Column)term).Name, "DISTINCT"))
                    {
                        enumerator.MoveNext();
                        distinctFlag = true;
                    }
                    else
                    {
                        break;
                    }
                }
                if (StringComparer.InvariantCultureIgnoreCase.Equals(call.Name, "CAST") && pars.Count == 1 && term is Column)
                {
                    term = new Constant(((Column)term).Name);
                }
                if (!enumerator.MoveNext())
                {
                    pars.Add(term);
                    break;
                }
                if (Conditional.IsConditionalOperator(enumerator.Current))
                {
                    var left  = term;
                    var oper  = new Operator(enumerator.Current.Text);
                    var right = GetTerm(ref enumerator);
                    term = new Conditional(left, oper, right);
                    if (!enumerator.MoveNext())
                    {
                        pars.Add(term);
                        break;
                    }
                }
                if (Formula.IsArithmeticOperator(enumerator.Current))
                {
                    term = GetFormula(ref enumerator, configuration, term);
                }
                if ((token.Token == (int)Colosoft.Text.InterpreterExpression.TokenID.Identifier || Colosoft.Query.Parser.SqlTokenParser.IsSqlAnsiFunction(token.Token)) && enumerator.Current.Token == (int)Colosoft.Text.InterpreterExpression.TokenID.LParen)
                {
                    var columnExpression = ParserColumnExpression(termText);
                    term = GetFunctionCall(ref enumerator, configuration, ')', (columnExpression as Column) ?? new Column(termText));
                    if (Formula.IsArithmeticOperator(enumerator.Current))
                    {
                        term = GetFormula(ref enumerator, configuration, term);
                    }
                    pars.Add(term);
                    token = enumerator.Current;
                }
                else
                {
                    pars.Add(term);
                    token = enumerator.Current;
                }
                if (token.ToString().Equals(")"))
                {
                    enumerator.MoveNext();
                    break;
                }
                if (!token.ToString().Equals(commaExpression))
                {
                    throw new ConditionalParserException(string.Format("Expected comma after '{0}'", pars.Last().ToString()));
                }
            }
            return(new FunctionCall()
            {
                Call = call,
                Parameters = pars.ToArray(),
                Options = distinctFlag ? FunctionCallOptions.Distinct : FunctionCallOptions.None
            });
        }