예제 #1
0
        public override async Task <ResultTable> ExecuteQueryGroupAsync(QueryRequest request, CancellationToken cancellationToken)
        {
            var simpleFilters    = request.Filters.Where(f => !f.IsAggregate()).ToList();
            var aggregateFilters = request.Filters.Where(f => f.IsAggregate()).ToList();

            var keys = request.Columns.Select(t => t.Token).Where(t => !(t is AggregateToken)).ToHashSet();

            var allAggregates = request.AllTokens().OfType <AggregateToken>().ToHashSet();

            var qr = new QueryRequest
            {
                Columns    = keys.Concat(allAggregates.Select(at => at.Parent).NotNull()).Distinct().Select(t => new Column(t, t.NiceName())).ToList(),
                Orders     = new List <Order>(),
                Filters    = simpleFilters,
                QueryName  = request.QueryName,
                Pagination = new Pagination.All(),
            };

            DEnumerableCount <T> plainCollection = await Execute(qr, GetQueryDescription(), cancellationToken);

            var groupCollection = plainCollection
                                  .GroupBy(keys, allAggregates)
                                  .Where(aggregateFilters)
                                  .OrderBy(request.Orders);

            var cols = groupCollection.TryPaginate(request.Pagination);

            return(cols.ToResultTable(request));
        }
예제 #2
0
        public override ResultTable ExecuteQueryGroup(QueryGroupRequest request)
        {
            var simpleFilters    = request.Filters.Where(f => !(f.Token is AggregateToken)).ToList();
            var aggregateFilters = request.Filters.Where(f => f.Token is AggregateToken).ToList();

            var keys = request.Columns.Select(t => t.Token).Where(t => !(t is AggregateToken)).ToHashSet();

            var allAggregates = request.AllTokens().OfType <AggregateToken>().ToHashSet();

            DEnumerableCount <T> plainCollection = Execute(new QueryRequest
            {
                Columns    = keys.Concat(allAggregates.Select(at => at.Parent).NotNull()).Distinct().Select(t => new Column(t, t.NiceName())).ToList(),
                Orders     = new List <Order>(),
                Filters    = simpleFilters,
                QueryName  = request.QueryName,
                Pagination = new Pagination.All(),
            }, GetQueryDescription());

            var groupCollection = plainCollection
                                  .GroupBy(keys, allAggregates)
                                  .Where(aggregateFilters)
                                  .OrderBy(request.Orders);

            var cols = request.Columns
                       .Select(column => (column, Expression.Lambda(column.Token.BuildExpression(groupCollection.Context), groupCollection.Context.Parameter))).ToList();

            var values = groupCollection.Collection.ToArray();

            return(values.ToResultTable(cols, values.Length, new Pagination.All()));
        }
예제 #3
0
        public static DEnumerableCount <T> TryPaginate <T>(this DEnumerableCount <T> collection, Pagination pagination)
        {
            if (pagination == null)
            {
                throw new ArgumentNullException("pagination");
            }

            if (pagination is Pagination.All)
            {
                return(new DEnumerableCount <T>(collection.Collection, collection.Context, collection.TotalElements));
            }
            else if (pagination is Pagination.Firsts)
            {
                var top     = (Pagination.Firsts)pagination;
                var topList = collection.Collection.Take(top.TopElements).ToList();

                return(new DEnumerableCount <T>(topList, collection.Context, null));
            }
            else if (pagination is Pagination.Paginate)
            {
                var pag = (Pagination.Paginate)pagination;

                var c = collection.Collection;
                if (pag.CurrentPage != 1)
                {
                    c = c.Skip((pag.CurrentPage - 1) * pag.ElementsPerPage);
                }

                c = c.Take(pag.ElementsPerPage);

                return(new DEnumerableCount <T>(c, collection.Context, collection.TotalElements));
            }

            throw new InvalidOperationException("pagination type {0} not expexted".FormatWith(pagination.GetType().Name));
        }
예제 #4
0
        public override async Task <ResultTable> ExecuteQueryAsync(QueryRequest request, CancellationToken cancellationToken)
        {
            request.Columns.Insert(0, new _EntityColumn(EntityColumnFactory().BuildColumnDescription(), QueryName));

            DEnumerableCount <T> manualResult = await Execute(request, GetQueryDescription(), cancellationToken);

            return(manualResult.ToResultTable(request));
        }
예제 #5
0
        public override ResultTable ExecuteQuery(QueryRequest request)
        {
            request.Columns.Insert(0, new _EntityColumn(EntityColumnFactory().BuildColumnDescription(), QueryName));

            DEnumerableCount <T> manualResult = Execute(request, GetQueryDescription());

            return(manualResult.ToResultTable(request));
        }
예제 #6
0
        public static ResultTable ToResultTable <T>(this DEnumerableCount <T> collection, QueryRequest req)
        {
            object[] array = collection.Collection as object[] ?? collection.Collection.ToArray();

            var columnAccesors = req.Columns.Select(c => Tuple.Create(c,
                                                                      Expression.Lambda(c.Token.BuildExpression(collection.Context), collection.Context.Parameter))).ToList();

            return(ToResultTable(array, columnAccesors, collection.TotalElements, req.Pagination));
        }
예제 #7
0
        public static DEnumerableCount <T> OrderBy <T>(this DEnumerableCount <T> collection, List <Order> orders)
        {
            var pairs = orders.Select(o => Tuple.Create(
                                          Expression.Lambda(OnAddaptForOrderBy(o.Token.BuildExpression(collection.Context)), collection.Context.Parameter),
                                          o.OrderType)).ToList();


            return(new DEnumerableCount <T>(collection.Collection.OrderBy(pairs), collection.Context, collection.TotalElements));
        }
예제 #8
0
        public static DEnumerableCount <T> Concat <T>(this DEnumerableCount <T> collection, DEnumerableCount <T> other)
        {
            if (collection.Context.TupleType != other.Context.TupleType)
            {
                throw new InvalidOperationException("Enumerable's TupleType does not match Other's one.\r\n Enumerable: {0}: \r\n Other:  {1}".FormatWith(
                                                        collection.Context.TupleType.TypeName(),
                                                        other.Context.TupleType.TypeName()));
            }

            return(new DEnumerableCount <T>(collection.Collection.Concat(other.Collection), collection.Context, collection.TotalElements + other.TotalElements));
        }