Esempio n. 1
0
        /// <summary>
        /// Convert this ordering node into an OData string representation.
        /// </summary>
        /// <returns>The OData string</returns>
        public static string ToODataString(this OrderByNode node)
        {
            string field     = ODataExpressionVisitor.ToODataString(node.Expression);
            string direction = node.Direction == OrderByDirection.Ascending ? "" : " desc";

            return($"{field}{direction}");
        }
Esempio n. 2
0
        public void Visit(OrderByNode node)
        {
            node.Inner[0].Accept(this);

            OrderedParallelQuery <LogItem> ordered;

            if (node.Descending[0])
            {
                ordered = Items.OrderByDescending(i => i.Fields[node.Fields[0]]);
            }
            else
            {
                ordered = Items.OrderBy(i => i.Fields[node.Fields[0]]);
            }

            for (var n = 1; n < node.Fields.Length; n++)
            {
                if (node.Descending[n])
                {
                    ordered = ordered.ThenByDescending(i => i.Fields[node.Fields[n]]);
                }
                else
                {
                    ordered = ordered.ThenBy(i => i.Fields[node.Fields[n]]);
                }
            }

            Items = ordered;
        }
Esempio n. 3
0
 public void Visit(OrderByNode node)
 {
     foreach (var inner in node.Inner)
     {
         inner.Accept(this);
     }
 }
Esempio n. 4
0
        public void CreateCollection_CopmplexType_Succeeds()
        {
            // Arrange
            CustomersModelWithInheritance model  = new CustomersModelWithInheritance();
            ODataQueryOptionParser        parser = new ODataQueryOptionParser(model.Model, model.Customer, model.Customers,
                                                                              new Dictionary <string, string> {
                { "$orderby", "Address/Street desc, Address/City asc, Account/BankAddress/City asc" }
            });

            OrderByClause orderByNode = parser.ParseOrderBy();

            // Act
            ICollection <OrderByNode> nodes = OrderByNode.CreateCollection(orderByNode);

            // Assert
            Assert.Equal(3, nodes.Count());
            Assert.Equal("Street", (nodes.ToList()[0] as OrderByPropertyNode).Property.Name);
            Assert.Equal(OrderByDirection.Descending, nodes.ToList()[0].Direction);
            Assert.Equal("Address/Street", nodes.ToList()[0].PropertyPath);

            Assert.Equal("City", (nodes.ToList()[1] as OrderByPropertyNode).Property.Name);
            Assert.Equal(OrderByDirection.Ascending, nodes.ToList()[1].Direction);
            Assert.Equal("Address/City", nodes.ToList()[1].PropertyPath);

            Assert.Equal("City", (nodes.ToList()[2] as OrderByPropertyNode).Property.Name);
            Assert.Equal(OrderByDirection.Ascending, nodes.ToList()[2].Direction);
            Assert.Equal("Account/BankAddress/City", nodes.ToList()[2].PropertyPath);
        }
        public void Visit(OrderByNode node)
        {
            foreach (var field in node.Fields)
            {
                field.Accept(this);
            }

            node.Accept(_visitor);
        }
        public void Visit(OrderByNode node)
        {
            Expression sequence = _visitor.Nodes.Peek();
            this._visitor.ScopedParamters.Push(Expression.Parameter(sequence.GetElementType(), "item_" + sequence.GetElementType().Name));

            foreach (var field in node.Fields)
                field.Accept(this);

            node.Accept(_visitor);
        }
        public void Visit(OrderByNode node)
        {
            var fields = new FieldOrderedNode[node.Fields.Length];

            for (var i = node.Fields.Length - 1; i >= 0; --i)
            {
                fields[i] = (FieldOrderedNode)Nodes.Pop();
            }

            Nodes.Push(new OrderByNode(fields));
        }
        /// <summary>
        /// Add an ordering constraint for an OrderBy/ThenBy call.
        /// </summary>
        /// <param name="expression">
        /// The ordering method call.
        /// </param>
        /// <param name="ascending">
        /// Whether the order is ascending or descending.
        /// </param>
        /// <param name="prepend">
        /// Indicates if the expression should be prepended or not.
        /// </param>
        private void AddOrdering(MethodCallExpression expression, bool ascending, bool prepend = false)
        {
            // Keep updating with the deepest nested expression structure we
            // can get to so that we can provide a more detailed error message
            Expression deepest = expression;

            // We only allow OrderBy(x => x.Member) expressions.  Anything else
            // will result in a NotSupportedException.
            if (expression != null && expression.Arguments.Count >= 2)
            {
                LambdaExpression lambda = StripQuote(expression.Arguments[1]) as LambdaExpression;
                if (lambda != null)
                {
                    deepest = lambda.Body ?? lambda;

                    // Find the name of the member being ordered
                    MemberExpression memberAccess = lambda.Body as MemberExpression;
                    if (memberAccess != null)
                    {
                        string memberName = FilterBuildingExpressionVisitor.GetTableMemberName(memberAccess);
                        if (memberName != null)
                        {
                            OrderByDirection direction = ascending ? OrderByDirection.Ascending : OrderByDirection.Descending;
                            var node = new OrderByNode(new MemberAccessNode(null, memberName), direction);
                            // Add the ordering
                            if (prepend)
                            {
                                this.queryDescription.Ordering.Insert(0, node);
                            }
                            else
                            {
                                this.queryDescription.Ordering.Add(node);
                            }

                            return;
                        }
                    }
                }
            }

            throw new NotSupportedException(
                      string.Format(
                          CultureInfo.InvariantCulture,
                          "'{0}' Mobile Services query expressions must consist of members only, not '{1}'.",
                          expression != null && expression.Method != null ? expression.Method.Name : null,
                          deepest != null ? deepest.ToString() : null));
        }
Esempio n. 9
0
        public ODataHelperViewModel <T> GetOData(HttpContext context, ODataHelper <T> oData)
        {
            string queryString = string.Empty;

            if (context != null &&
                context.Request != null &&
                context.Request.QueryString != null &&
                context.Request.QueryString.HasValue)
            {
                queryString = context.Request.QueryString.Value;
            }

            oData.Parse(queryString);
            Guid parentguid = Guid.Empty;
            var  newNode    = oData.ParseOrderByQuery(queryString);

            if (newNode == null)
            {
                newNode = new OrderByNode <T>();
            }

            Predicate <T> predicate = null;

            if (oData != null && oData.Filter != null)
            {
                predicate = new Predicate <T>(oData.Filter);
            }
            int take = (oData?.Top == null || oData?.Top == 0) ? 100 : oData.Top;

            ODataHelperViewModel <T> oDataHelperViewModel = new ODataHelperViewModel <T>()
            {
                Direction     = newNode.Direction,
                Predicate     = predicate,
                Skip          = oData.Skip,
                PropertyName  = newNode.PropertyName,
                Take          = take,
                Filter        = oData.Filter,
                Sort          = oData.Sort,
                Top           = oData.Top,
                SortDirection = oData.SortDirection
            };

            return(oDataHelperViewModel);
        }
Esempio n. 10
0
 /// <summary>
 /// Add an ordering expression to the query
 /// </summary>
 /// <param name="expression">An ordering method call expression</param>
 /// <param name="ascending">True if the ordering is ascending, false otherwise</param>
 /// <param name="prepend">True to prepend the ordering to the list</param>
 internal protected void AddOrdering(MethodCallExpression expression, bool ascending, bool prepend)
 {
     // We only allow keySelectors that are x => x.member expressions (i.e. MemberAccessNode).
     // Anything else will result in a NotSupportedException
     if (expression.IsValidLambdaExpression(out LambdaExpression lambda) && lambda !.Body is MemberExpression memberExpression)
     {
         string memberName = FilterBuildingExpressionVisitor.GetTableMemberName(memberExpression, ContractResolver);
         if (memberName != null)
         {
             var node = new OrderByNode(new MemberAccessNode(null, memberName), ascending);
             if (prepend)
             {
                 QueryDescription.Ordering.Insert(0, node);
             }
             else
             {
                 QueryDescription.Ordering.Add(node);
             }
         }
     }
Esempio n. 11
0
        public void CreateCollection_PropertyAliased_IfEnabled(bool modelAliasing, string typeName, string propertyName)
        {
            // Arrange
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

            builder.ModelAliasingEnabled = modelAliasing;
            builder.EntitySet <PropertyAlias>("entityset");

            IEdmModel      model      = builder.GetEdmModel();
            IEdmEntityType entityType = model.SchemaElements.Single(t => t.Name == typeName) as IEdmEntityType;

            Assert.NotNull(entityType); // Guard
            IEdmEntitySet entitySet = model.EntityContainer.FindEntitySet("entityset");

            Assert.NotNull(entitySet); // Guard

            ODataQueryOptionParser parser = new ODataQueryOptionParser(model, entityType, entitySet,
                                                                       new Dictionary <string, string> {
                { "$orderby", propertyName + " desc, Id asc" }
            });
            OrderByClause orderbyNode = parser.ParseOrderBy();

            // Act
            ICollection <OrderByNode> nodes = OrderByNode.CreateCollection(orderbyNode);

            // Assert
            Assert.False(nodes.OfType <OrderByItNode>().Any());
            IEnumerable <OrderByPropertyNode> propertyNodes = nodes.OfType <OrderByPropertyNode>();

            Assert.Equal(2, propertyNodes.Count());
            Assert.Equal(propertyName, propertyNodes.First().Property.Name);
            Assert.Equal(OrderByDirection.Descending, propertyNodes.First().Direction);
            Assert.Equal(propertyName, propertyNodes.First().PropertyPath);

            Assert.Equal("Id", propertyNodes.Last().Property.Name);
            Assert.Equal(OrderByDirection.Ascending, nodes.Last().Direction);
            Assert.Equal("Id", propertyNodes.Last().PropertyPath);
        }
Esempio n. 12
0
        public PaginatedList <ProcessExecutionViewModel> View(
            [FromQuery(Name = "$filter")] string filter   = "",
            [FromQuery(Name = "$orderby")] string orderBy = "",
            [FromQuery(Name = "$top")] int top            = 100,
            [FromQuery(Name = "$skip")] int skip          = 0
            )
        {
            ODataHelper <ProcessExecutionViewModel> oData = new ODataHelper <ProcessExecutionViewModel>();

            string queryString = "";

            if (HttpContext != null &&
                HttpContext.Request != null &&
                HttpContext.Request.QueryString != null &&
                HttpContext.Request.QueryString.HasValue)
            {
                queryString = HttpContext.Request.QueryString.Value;
            }

            oData.Parse(queryString);
            Guid parentguid = Guid.Empty;
            var  newNode    = oData.ParseOrderByQuerry(queryString);

            if (newNode == null)
            {
                newNode = new OrderByNode <ProcessExecutionViewModel>();
            }

            Predicate <ProcessExecutionViewModel> predicate = null;

            if (oData != null && oData.Filter != null)
            {
                predicate = new Predicate <ProcessExecutionViewModel>(oData.Filter);
            }
            int take = (oData?.Top == null || oData?.Top == 0) ? 100 : oData.Top;

            return(processExecutionLogManager.GetProcessAndAgentNames(predicate, newNode.PropertyName, newNode.Direction, oData.Skip, take));
        }
Esempio n. 13
0
        public OrderByNode <T> ParseOrderByQuery(string queryString)
        {
            try
            {
                OrderByNode <T> response = null;
                if (!string.IsNullOrEmpty(queryString))
                {
                    var queryStrings = HttpUtility.ParseQueryString(queryString);
                    if (queryStrings.HasKeys() && queryStrings.AllKeys.Contains("$orderby"))
                    {
                        string            orderby       = queryStrings["$orderby"];
                        OrderByClause <T> orderbyClause = new OrderByClause <T>();

                        response = orderbyClause.ParseOrderBy(orderby);
                    }
                }
                return(response);
            }
            catch
            {
                return(null);
            }
        }
Esempio n. 14
0
        public void CreateCollection_From_OrderByNode_Succeeds()
        {
            // Arrange
            ODataConventionModelBuilder builder = ODataModelBuilderMocks.GetModelBuilderMock <ODataConventionModelBuilder>();

            builder.EntitySet <SampleClass>("entityset");

            IEdmModel      model = builder.GetEdmModel();
            IEdmEntityType sampleClassEntityType = model.SchemaElements.Single(t => t.Name == "SampleClass") as IEdmEntityType;

            Assert.NotNull(sampleClassEntityType); // Guard
            IEdmEntitySet entitySet = model.EntityContainer.FindEntitySet("entityset");

            Assert.NotNull(entitySet); // Guard

            ODataQueryOptionParser parser = new ODataQueryOptionParser(model, sampleClassEntityType, entitySet,
                                                                       new Dictionary <string, string> {
                { "$orderby", "Property1 desc, Property2 asc" }
            });
            OrderByClause orderbyNode = parser.ParseOrderBy();

            // Act
            ICollection <OrderByNode> nodes = OrderByNode.CreateCollection(orderbyNode);

            // Assert
            Assert.False(nodes.OfType <OrderByItNode>().Any());
            IEnumerable <OrderByPropertyNode> propertyNodes = nodes.OfType <OrderByPropertyNode>();

            Assert.Equal(2, propertyNodes.Count());
            Assert.Equal("Property1", propertyNodes.First().Property.Name);
            Assert.Equal(OrderByDirection.Descending, propertyNodes.First().Direction);
            Assert.Equal("Property1", propertyNodes.First().PropertyPath);

            Assert.Equal("Property2", propertyNodes.Last().Property.Name);
            Assert.Equal(OrderByDirection.Ascending, nodes.Last().Direction);
            Assert.Equal("Property2", propertyNodes.Last().PropertyPath);
        }
Esempio n. 15
0
        public async Task <IActionResult> GetPeople(
            [FromRoute] string organizationId,
            [FromQuery(Name = "$filter")] string filter   = "",
            [FromQuery(Name = "$orderby")] string orderBy = "",
            [FromQuery(Name = "$top")] int top            = 100,
            [FromQuery(Name = "$skip")] int skip          = 0)
        {
            try
            {
                ODataHelper <TeamMemberViewModel> oData = new ODataHelper <TeamMemberViewModel>();
                string queryString = "";

                if (HttpContext != null &&
                    HttpContext.Request != null &&
                    HttpContext.Request.QueryString != null &&
                    HttpContext.Request.QueryString.HasValue)
                {
                    queryString = HttpContext.Request.QueryString.Value;
                }

                var newNode = oData.ParseOrderByQuery(queryString);
                if (newNode == null)
                {
                    newNode = new OrderByNode <TeamMemberViewModel>();
                }

                Guid orgId  = Guid.Parse(organizationId);
                var  result = _membershipManager.GetPeopleInOrganization(orgId, newNode.PropertyName, newNode.Direction, skip, top);

                return(Ok(result));
            }
            catch (Exception ex)
            {
                return(ex.GetActionResult());
            }
        }
        /// <summary>
        /// Apply $orderby parameter to query.
        /// </summary>
        /// <param name="query">
        /// The OData aware query.
        /// </param>
        /// <param name="orderbyText">
        /// The $orderby parameter text.
        /// </param>
        /// <param name="entitySetName">
        /// The entity set name.
        /// </param>
        /// <typeparam name="T">
        /// The query type param
        /// </typeparam>
        /// <returns>
        /// The <see cref="ODataQuery{T}"/> query with applied order by parameter.
        /// </returns>
        /// <exception cref="ArgumentNullException">
        /// Argument Null Exception
        /// </exception>
        public static ODataQueryOrdered <T> OrderBy <T>(this ODataQuery <T> query, string orderbyText, string entitySetName = null)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query));
            }
            if (orderbyText == null)
            {
                throw new ArgumentNullException(nameof(orderbyText));
            }

            IEdmModel edmModel = query.EdmModel;

            ODataQueryOptionParser queryOptionParser = GetParser(
                query,
                entitySetName,
                new Dictionary <string, string> {
                { "$orderby", orderbyText }
            });

            ODataSettings settings = query.ServiceProvider.GetRequiredService <ODataSettings>();

            var orderByClause = queryOptionParser.ParseOrderBy();

            orderByClause = TranslateParameterAlias(orderByClause, queryOptionParser);

            ICollection <OrderByNode> nodes = OrderByNode.CreateCollection(orderByClause);

            var validator = new OrderByQueryValidator(settings.DefaultQuerySettings);

            validator.Validate(nodes, settings.ValidationSettings, edmModel);

            IOrderedQueryable <T> result = (IOrderedQueryable <T>)OrderByBinder.OrderApplyToCore(query, settings.QuerySettings, nodes, edmModel);

            return(new ODataQueryOrdered <T>(result, query.ServiceProvider));
        }
Esempio n. 17
0
 public void Visit(OrderByNode node) => VisitInternal(node);
Esempio n. 18
0
 public void Visit(OrderByNode node) => Format(node, $"{string.Join(",", node.Fields)}");
Esempio n. 19
0
 public void Visit(OrderByNode node)
 {
     node.Inner[0].Accept(this);
     Mode = Query.EvaluationMode.Aggregate;
 }
Esempio n. 20
0
 public void Visit(OrderByNode node)
 {
     node.Inner[0].Accept(this);
     Tree = new OrderByNode(Tree, node.Fields, node.Descending);
 }
        protected virtual void StripOrderBy(OrderByNode node, HashSet <QueryMethod> additionalQueryMethods)
        {
            var fieldName = GetFormattedFieldName(node.Field);

            additionalQueryMethods.Add(new OrderByMethod(fieldName, node.FieldType, node.SortDirection));
        }
Esempio n. 22
0
 public DetailedQueryNode(SelectNode select, FromNode from, WhereNode where, GroupByNode groupBy,
                          OrderByNode orderBy, SkipNode skip, TakeNode take, string returnVariableName)
     : base(select, from, where, groupBy, orderBy, skip, take)
 {
     ReturnVariableName = returnVariableName;
 }
Esempio n. 23
0
        /// <summary>
        /// Creates a query tree for the given query elements
        /// </summary>
        /// <param name="match"><see cref="MatchNode"/> for matching log items</param>
        /// <param name="parser"><see cref="IParser"/> for parsing log items</param>
        /// <param name="filter">An <see cref="Expression"/> for filtering log items</param>
        /// <param name="grouping">An enumerable of tuples of group names and grouping <see cref="Expression"/>s for grouping the log items</param>
        /// <param name="selects">An enumerable of tuples of projection labels and <see cref="Expression"/>s for projecting log items</param>
        /// <param name="order">An enumerable of tuples indicating sorting fields and sort order</param>
        /// <param name="limit">The number of items to return</param>
        /// <returns>A query tree for executing the query</returns>
        private static Node CreateQueryTree(
            MatchNode match,
            IOption <Tuple <string, IParser> > parser,
            IOption <Expression> filter,
            IOption <IEnumerable <Tuple <string, Expression> > > grouping,
            IOption <IEnumerable <Tuple <string, IAggregate> > > selects,
            IOption <IEnumerable <Tuple <string, bool> > > order,
            IOption <int> limit)
        {
            Node query = match;

            if (!parser.IsEmpty)
            {
                query = new ParseNode(query, parser.Get().Item2, parser.Get().Item1);
            }

            if (!filter.IsEmpty)
            {
                query = new PredicateNode(query, filter.Get());
            }

            if (!grouping.IsEmpty)
            {
                var keyNames       = grouping.Get().Select(g => g.Item1).ToArray();
                var keyExpressions = grouping.Get().Select(g => g.Item2).ToArray();
                if (selects.IsEmpty)
                {
                    query = new GroupByNode(query, keyNames, keyExpressions, new string[0], new IAggregate[0]);
                }
                else
                {
                    var aggregateNames = selects.Get().Select(s => s.Item1).ToArray();
                    var aggregates     = selects.Get().Select(s => s.Item2).ToArray();
                    query = new GroupByNode(query, keyNames, keyExpressions, aggregateNames, aggregates);
                }
            }
            else if (!selects.IsEmpty)
            {
                var aggregateNames = selects.Get().Select(s => s.Item1).ToArray();
                var aggregates     = selects.Get().Select(s => s.Item2).ToArray();
                if (aggregates.All(a => a is ListAggregate))
                {
                    query = new ProjectNode(query, aggregateNames, aggregates.Cast <ListAggregate>().Select(a => a.Expression).ToArray());
                }
                else
                {
                    query = new AggregateNode(query, aggregateNames, aggregates);
                }
            }

            if (!order.IsEmpty)
            {
                query = new OrderByNode(query, order.Get().Select(a => a.Item1).ToArray(), order.Get().Select(a => a.Item2).ToArray());
            }

            if (!limit.IsEmpty)
            {
                query = new LimitNode(query, limit.Get());
            }

            return(query);
        }
 protected virtual QueryNode VisitOrderBy(OrderByNode node, AzureQueryOptimizerState state)
 {
     return((QueryNode) new OrderByNode(this.Visit(node.SourceNode, state), node.Field, node.FieldType, node.SortDirection));
 }
        protected virtual void StripOrderBy(OrderByNode node, HashSet <QueryMethod> additionalQueryMethods)
        {
            string lowerInvariant = node.Field.ToLowerInvariant();

            additionalQueryMethods.Add(new OrderByMethod(lowerInvariant.Replace(" ", "_"), node.FieldType, node.SortDirection));
        }
Esempio n. 26
0
 public void Visit(OrderByNode node)
 {
 }
Esempio n. 27
0
        private static TreeNode BuildInnerTree(XElement element, TreeNode parentNode, Tree tree)
        {
            TreeNode treeNode = TreeNodeCreatorFactory.CreateTreeNode(element, tree);

            if (treeNode == null)
            {
                return(null);
            }


            // Actions
            XElement actionsElement = element.Element(TreeMarkupConstants.Namespace + "Actions");

            if (actionsElement != null)
            {
                foreach (XElement actionElement in actionsElement.Elements())
                {
                    ActionNode actionNode = ActionNodeCreatorFactory.CreateActionNode(actionElement, tree);

                    if (actionNode != null)
                    {
                        treeNode.AddActionNode(actionNode);
                    }
                }
            }


            // OrderBys
            XElement orderBysElement = element.Element(TreeMarkupConstants.Namespace + "OrderBy");

            if (orderBysElement != null)
            {
                foreach (XElement orderByElement in orderBysElement.Elements())
                {
                    OrderByNode orderByNode = OrderByNodeCreatorFactory.CreateOrderByNode(orderByElement, tree);

                    if (orderByNode != null)
                    {
                        treeNode.AddOrderByNode(orderByNode);
                    }
                }
            }


            // Filters
            XElement filtersElement = element.Element(TreeMarkupConstants.Namespace + "Filters");

            if (filtersElement != null)
            {
                foreach (XElement filterElement in filtersElement.Elements())
                {
                    FilterNode filterNode = FilterNodeCreatorFactory.CreateFilterNode(filterElement, tree);

                    if (filterNode != null)
                    {
                        treeNode.AddFilterNode(filterNode);
                    }
                }
            }



            if (parentNode != null)
            {
                parentNode.AddChildTreeNode(treeNode);
            }



            // Children
            XElement childrenElement = element.Element(TreeMarkupConstants.Namespace + "Children");

            if (childrenElement != null)
            {
                foreach (XElement childElement in childrenElement.Elements())
                {
                    BuildInnerTree(childElement, treeNode, tree);
                }
            }


            treeNode.InitializeActions();
            treeNode.InitializeOrderByes();
            treeNode.InitializeFilters();

            return(treeNode);
        }
 protected virtual QueryNode VisitOrderBy(OrderByNode node, ElasticSearchQueryOptimizerState state)
 {
     return(new OrderByNode(Visit(node.SourceNode, state), node.Field, node.FieldType, node.SortDirection));
 }