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