Esempio n. 1
0
 public ODataQuery Create()
 {
     return(new ODataQuery
     {
         FormatPredicate = ODataQueryPart.Format(ODataFormat.Json)
     });
 }
        protected override OrderByQueryPart Parse(string parameterValue)
        {
            // TODO: support complex order by expressions (e.g. "$orderby=(Id mod 3) desc")
            var matches = Regex.Matches(parameterValue, @"(\w+)\s+(asc|desc)", RegexOptions.IgnoreCase).Cast <Match>();

            var orderings = new List <ODataOrdering>();

            foreach (var match in matches)
            {
                var groups = match.Groups.Cast <Group>().Skip(1).ToList();

                var property = groups[0].Value;
                var dir      = groups[1].Value;

                ODataOrderingDirection direction;
                if (Enum.TryParse(dir, true, out direction) == false)
                {
                    // TODO: I'm pretty sure this branch will never be taken, but...
                    throw new ArgumentException(String.Format("'{0}' is not a valid ordering direction.", dir));
                }

                orderings.Add(ODataQueryPart.Ordering(property, direction));
            }

            return(ODataQueryPart.OrderBy(orderings.ToArray()));
        }
        public override void VisitResultOperator(ResultOperatorBase resultOperator, QueryModel queryModel, int index)
        {
            // Remotion.Linq.Clauses.ResultOperators.AggregateFromSeedResultOperator
            // Remotion.Linq.Clauses.ResultOperators.AggregateResultOperator
            // Remotion.Linq.Clauses.ResultOperators.AllResultOperator
            // Remotion.Linq.Clauses.ResultOperators.AnyResultOperator
            // Remotion.Linq.Clauses.ResultOperators.AverageResultOperator
            // Remotion.Linq.Clauses.ResultOperators.CastResultOperator
            // Remotion.Linq.Clauses.ResultOperators.ChoiceResultOperatorBase
            // Remotion.Linq.Clauses.ResultOperators.ContainsResultOperator
            // Remotion.Linq.Clauses.ResultOperators.CountResultOperator
            // Remotion.Linq.Clauses.ResultOperators.DefaultIfEmptyResultOperator
            // Remotion.Linq.Clauses.ResultOperators.DistinctResultOperator
            // Remotion.Linq.Clauses.ResultOperators.ExceptResultOperator
            // Remotion.Linq.Clauses.ResultOperators.FirstResultOperator
            // Remotion.Linq.Clauses.ResultOperators.GroupResultOperator
            // Remotion.Linq.Clauses.ResultOperators.IntersectResultOperator
            // Remotion.Linq.Clauses.ResultOperators.LastResultOperator
            // Remotion.Linq.Clauses.ResultOperators.LongCountResultOperator
            // Remotion.Linq.Clauses.ResultOperators.MaxResultOperator
            // Remotion.Linq.Clauses.ResultOperators.MinResultOperator
            // Remotion.Linq.Clauses.ResultOperators.OfTypeResultOperator
            // Remotion.Linq.Clauses.ResultOperators.ReverseResultOperator
            // Remotion.Linq.Clauses.ResultOperators.SequenceFromSequenceResultOperatorBase
            // Remotion.Linq.Clauses.ResultOperators.SequenceTypePreservingResultOperatorBase
            // Remotion.Linq.Clauses.ResultOperators.SingleResultOperator
            // Remotion.Linq.Clauses.ResultOperators.SkipResultOperator
            // Remotion.Linq.Clauses.ResultOperators.SumResultOperator
            // Remotion.Linq.Clauses.ResultOperators.TakeResultOperator
            // Remotion.Linq.Clauses.ResultOperators.UnionResultOperator
            // Remotion.Linq.Clauses.ResultOperators.ValueFromSequenceResultOperatorBase

            if (resultOperator is CountResultOperator)
            {
                _query.CountPredicate = ODataQueryPart.Count();
            }
            else if (resultOperator is LongCountResultOperator)
            {
                _query.CountPredicate = ODataQueryPart.Count();
            }
            else if (resultOperator is SkipResultOperator)
            {
                var skipOperator = (SkipResultOperator)resultOperator;

                var skipCount = skipOperator.GetConstantCount();

                _query.SkipPredicate = ODataQueryPart.Skip(skipCount);
            }
            else if (resultOperator is TakeResultOperator)
            {
                var takeOperator = (TakeResultOperator)resultOperator;

                var takeCount = takeOperator.GetConstantCount();

                _query.TopPredicate = ODataQueryPart.Top(takeCount);
            }

            base.VisitResultOperator(resultOperator, queryModel, index);
        }
        public override void VisitWhereClause(WhereClause whereClause, QueryModel queryModel, int index)
        {
            // the predicate here is not a lambda; it is just the body of the Where() lambda
            var oDataFilterExpression = _filterExpressionTranslator.Translate(whereClause.Predicate);

            _query.FilterPredicate = ODataQueryPart.Filter(oDataFilterExpression);

            base.VisitWhereClause(whereClause, queryModel, index);
        }
Esempio n. 5
0
        protected override InlineCountQueryPart Parse(string parameterValue)
        {
            InlineCountType countType;

            if (Enum.TryParse(parameterValue, true, out countType) == false)
            {
                throw new ArgumentException(String.Format("'{0}' not recognized as an inline count type.", parameterValue));
            }

            return(ODataQueryPart.InlineCount(countType));
        }
Esempio n. 6
0
        protected override TopQueryPart Parse(string parameterValue)
        {
            int count;

            if (Int32.TryParse(parameterValue, out count) == false)
            {
                throw new ArgumentException(String.Format("Cannot take the top '{0}' number of items. '{0}' is not an integar.", parameterValue));
            }

            return(ODataQueryPart.Top(count));
        }
Esempio n. 7
0
        protected override FormatQueryPart Parse(string parameterValue)
        {
            ODataFormat format;

            if (Enum.TryParse(parameterValue, true, out format) == false)
            {
                throw new ArgumentException(String.Format("'{0}' is not a recognized OData format specification.", parameterValue));
            }

            return(ODataQueryPart.Format(format));
        }
Esempio n. 8
0
        protected override FilterQueryPart Parse(string parameterValue)
        {
            var tokens = _regularExpressionTableLexer.Tokenize(parameterValue);

            var result = ShuntingYardAlgorithm(tokens);

            var builderStrategy = new FilterExpressionParserStrategy();

            var filterExpression = builderStrategy.BuildExpression(result);

            return(ODataQueryPart.Filter(filterExpression));
        }
        public void Translate_SkipThree_ReturnsLastThreeResult()
        {
            var query = new ODataQuery
            {
                SkipPredicate = ODataQueryPart.Skip(3)
            };

            var expression = _translator.Translate <TestModel>(query);

            var fn = (Func <IQueryable <TestModel>, IQueryable <TestModel> >)expression.Compile();

            var result = fn(_source).ToList();

            Assert.That(result.Count, Is.EqualTo(3));
            Assert.That(result[0].TestInt, Is.EqualTo(6));
            Assert.That(result[1].TestInt, Is.EqualTo(7));
            Assert.That(result[2].TestInt, Is.EqualTo(8));
        }
        protected override SelectQueryPart Parse(string parameterValue)
        {
            var matches = Regex.Matches(parameterValue, @"(?:\w+/)*\w+", RegexOptions.IgnoreCase).Cast <Match>();

            var selectors = new List <MemberAccessFilterExpression>();

            foreach (var match in matches)
            {
                var s = match.Value.Split('/');

                var selector = s
                               .Aggregate <string, MemberAccessFilterExpression>(null, FilterExpression.MemberAccess);

                selectors.Add(selector);
            }

            return(ODataQueryPart.Select(selectors.ToArray()));
        }
        public void Translate_TestIntEqualsThree_ReturnsOneResult()
        {
            var left  = FilterExpression.MemberAccess("TestInt");
            var right = FilterExpression.Constant(3);

            var filterExpression = FilterExpression.Binary(left, FilterExpressionOperator.Equal, right);

            var query = new ODataQuery
            {
                FilterPredicate = ODataQueryPart.Filter(filterExpression)
            };

            var expression = _translator.Translate <TestModel>(query);

            var fn = (Func <IQueryable <TestModel>, IQueryable <TestModel> >)expression.Compile();

            var result = fn(_source).ToList();

            Assert.That(result.Count, Is.EqualTo(1));
            Assert.That(result[0].TestInt, Is.EqualTo(3));
        }
Esempio n. 12
0
        public override void VisitOrdering(Ordering ordering, QueryModel queryModel, OrderByClause orderByClause, int index)
        {
            if (_query.OrderByPredicate == null)
            {
                _query.OrderByPredicate = ODataQueryPart.OrderBy();
            }

            if (ordering.Expression.NodeType == ExpressionType.MemberAccess)
            {
                var memberExpression = (MemberExpression)ordering.Expression;

                var direction = (ordering.OrderingDirection == OrderingDirection.Asc)
                                        ? ODataOrderingDirection.Asc
                                        : ODataOrderingDirection.Desc;

                var o = ODataQueryPart.Ordering(memberExpression.Member.Name, direction);

                _query.OrderByPredicate.AddOrdering(o);
            }

            base.VisitOrdering(ordering, queryModel, orderByClause, index);
        }
Esempio n. 13
0
 protected override SkipTokenQueryPart Parse(string parameterValue)
 {
     return(ODataQueryPart.SkipToken(parameterValue));
 }
Esempio n. 14
0
 protected override CountQueryPart Parse(string parameterValue)
 {
     return(ODataQueryPart.Count());
 }
Esempio n. 15
0
        public override void VisitSelectClause(SelectClause selectClause, QueryModel queryModel)
        {
            var selectors = new List <string>();

            if (selectClause.Selector.NodeType == ExpressionType.MemberAccess)
            {
                // TODO: handle access of child properties in selector statements

                var selector = (MemberExpression)selectClause.Selector;

                selectors.Add(selector.Member.Name);
            }
            else if (selectClause.Selector.NodeType == ExpressionType.New)
            {
                // TODO: trying to support this may not be viable...
                var constructor = (NewExpression)selectClause.Selector;

                foreach (var argument in constructor.Arguments)
                {
                    if (argument.NodeType == ExpressionType.MemberAccess)
                    {
                        var member = (MemberExpression)argument;

                        selectors.Add(member.Member.Name);
                    }
                    else
                    {
                        throw new NotSupportedException("Cannot select non-members from the result set.");
                    }
                }
            }
            else if (selectClause.Selector.NodeType == ExpressionType.MemberInit)
            {
                var memberInit = (MemberInitExpression)selectClause.Selector;

                var constructor = memberInit.NewExpression;

                foreach (var argument in constructor.Arguments)
                {
                    if (argument.NodeType == ExpressionType.MemberAccess)
                    {
                        var member = (MemberExpression)argument;

                        selectors.Add(member.Member.Name);
                    }
                    else
                    {
                        throw new NotSupportedException("Cannot select non-members from the result set.");
                    }
                }

                foreach (var memberBinding in memberInit.Bindings)
                {
                    if (memberBinding.BindingType == MemberBindingType.Assignment)
                    {
                        var assignment = (MemberAssignment)memberBinding;

                        if (assignment.Expression.NodeType == ExpressionType.MemberAccess)
                        {
                            var selectedMember = (MemberExpression)assignment.Expression;

                            if (memberBinding.Member.Name == selectedMember.Member.Name)
                            {
                                selectors.Add(selectedMember.Member.Name);
                            }
                            else
                            {
                                throw new NotSupportedException($"Cannot alias member '{selectedMember.Member.Name}' as '{memberBinding.Member.Name}'. Aliasing projections is not supported in LinqToRest.");
                            }
                        }
                        else
                        {
                            throw new NotSupportedException("Cannot select non-members into the result set.");
                        }
                    }
                    else
                    {
                        throw new NotSupportedException("Cannot select lists from the result set.");
                    }
                }
            }

            if (selectors.Any())
            {
                _query.SelectPredicate = ODataQueryPart.Select(selectors.Distinct().Select(FilterExpression.MemberAccess).ToArray());
            }

            base.VisitSelectClause(selectClause, queryModel);
        }