예제 #1
0
        private static IEnumerable <IExpression> GetExpressions(QueryItem table, QuerySpan tokens, ParseContext context)
        {
            for (var i = tokens.Start; i < tokens.Start + tokens.Length; i++)
            {
                var token = tokens.List[i];
                switch (token.Type)
                {
                case ODataTokenType.Parameter:
                    yield return(new ParameterReference(token.Text.Substring(1), false));

                    break;

                case ODataTokenType.Date:
                case ODataTokenType.TimeOfDay:
                    var dateText = token.Text;
                    if (dateText.StartsWith("datetime'"))
                    {
                        dateText = dateText.Substring(9).TrimEnd('\'');
                    }
                    if (!ZonedDateTime.TryParse(dateText, table.Context.GetTimeZone(), out var date))
                    {
                        throw new InvalidOperationException();
                    }
                    yield return(new DateTimeLiteral(date.LocalDateTime));

                    break;

                case ODataTokenType.Decimal:
                    yield return(new FloatLiteral((double)((decimal)token.AsPrimitive())));

                    break;

                case ODataTokenType.Single:
                    yield return(new FloatLiteral((double)((float)token.AsPrimitive())));

                    break;

                case ODataTokenType.Double:
                case ODataTokenType.NaN:
                case ODataTokenType.NegInfinity:
                case ODataTokenType.PosInfinity:
                    yield return(new FloatLiteral((double)token.AsPrimitive()));

                    break;

                case ODataTokenType.False:
                    yield return(new BooleanLiteral(false));

                    break;

                case ODataTokenType.Guid:
                    yield return(new StringLiteral(((Guid)token.AsPrimitive()).ToArasId()));

                    break;

                case ODataTokenType.Integer:
                    yield return(new IntegerLiteral((int)token.AsPrimitive()));

                    break;

                case ODataTokenType.Long:
                    yield return(new IntegerLiteral((long)token.AsPrimitive()));

                    break;

                case ODataTokenType.String:
                    yield return(new StringLiteral((string)token.AsPrimitive()));

                    break;

                case ODataTokenType.True:
                    yield return(new BooleanLiteral(true));

                    break;

                case ODataTokenType.Null:
                    yield return(new NullLiteral());

                    break;

                case ODataTokenType.Identifier:
                    if (string.Equals(context.Name, "$compute", StringComparison.OrdinalIgnoreCase) &&
                        string.Equals(tokens.List[i].Text, "as", StringComparison.OrdinalIgnoreCase))
                    {
                        yield return(new SelectExpression());
                    }
                    else
                    {
                        yield return(TryGetProperty(tokens.List, ref i, table, context));
                    }
                    break;

                case ODataTokenType.And:
                    yield return(new AndOperator());

                    break;

                case ODataTokenType.Or:
                    yield return(new OrOperator());

                    break;

                case ODataTokenType.Equal:
                    yield return(new EqualsOperator());

                    break;

                case ODataTokenType.NotEqual:
                    yield return(new NotEqualsOperator());

                    break;

                case ODataTokenType.LessThan:
                    yield return(new LessThanOperator());

                    break;

                case ODataTokenType.LessThanOrEqual:
                    yield return(new LessThanOrEqualsOperator());

                    break;

                case ODataTokenType.GreaterThan:
                    yield return(new GreaterThanOperator());

                    break;

                case ODataTokenType.GreaterThanOrEqual:
                    yield return(new GreaterThanOrEqualsOperator());

                    break;

                case ODataTokenType.In:
                    yield return(new InOperator());

                    break;

                case ODataTokenType.Add:
                    yield return(new AdditionOperator());

                    break;

                case ODataTokenType.Subtract:
                    yield return(new SubtractionOperator());

                    break;

                case ODataTokenType.Multiply:
                    yield return(new MultiplicationOperator());

                    break;

                case ODataTokenType.Divide:
                    yield return(new DivisionOperator());

                    break;

                case ODataTokenType.Modulo:
                    yield return(new ModulusOperator());

                    break;

                case ODataTokenType.Not:
                    yield return(new NotOperator());

                    break;

                case ODataTokenType.Negate:
                    yield return(new NegationOperator());

                    break;

                case ODataTokenType.Star:
                    yield return(new AllProperties(table));

                    break;

                case ODataTokenType.OpenParen:
                    yield return(new ListExpression());

                    break;

                case ODataTokenType.CloseParen:
                    yield return(new EndParen());

                    break;

                case ODataTokenType.Comma:
                    yield return(new Comma());

                    break;

                case ODataTokenType.Base64:
                case ODataTokenType.Binary:
                case ODataTokenType.Duration:
                case ODataTokenType.Has:
                case ODataTokenType.Navigation:
                    throw new NotSupportedException();

                default:
                    //return new IgnoredNode(token);
                    break;
                }
            }
        }