Ejemplo n.º 1
0
        /// <summary>
        /// The build unfiltered orders queries.
        /// This could be extended to be where must pass one filter predicate
        /// And then just become a list of primary keys which is chunked through
        /// </summary>
        /// <param name="execution">
        /// The execution.
        /// </param>
        /// <returns>
        /// The <see cref="UnfilteredOrdersQuery"/>.
        /// </returns>
        private IList <UnfilteredOrdersQuery> BuildUnfilteredOrdersQueries(ScheduledExecution execution)
        {
            var unfilteredOrders = new List <UnfilteredOrdersQuery>();

            var unfilteredQuery =
                new UnfilteredOrdersQuery(
                    execution.AdjustedTimeSeriesInitiation.DateTime,
                    execution.AdjustedTimeSeriesTermination.DateTime);

            unfilteredOrders.Add(unfilteredQuery);

            return(unfilteredOrders);
        }
        /// <summary>
        /// The scan orders.
        /// </summary>
        /// <param name="span">
        /// The span.
        /// </param>
        /// <returns>
        /// The <see cref="Order"/>.
        /// </returns>
        private async Task <IReadOnlyCollection <Order> > ScanOrders(TimeSpan span)
        {
            if (this.DataManifest.UnfilteredOrders == null ||
                !this.DataManifest.UnfilteredOrders.Any())
            {
                return(new Order[0]);
            }

            var scanStack = new Stack <UnfilteredOrdersQuery>();
            var scanEnd   = this.CurrentTimeUtc.Add(span);

            while (this.DataManifest.UnfilteredOrders.Any() &&
                   this.DataManifest.UnfilteredOrders.Peek().StartUtc <= scanEnd)
            {
                scanStack.Push(this.DataManifest.UnfilteredOrders.Pop());
            }

            var queriedStack  = new Stack <UnfilteredOrdersQuery>();
            var queriedOrders = new List <Order>();

            while (scanStack.Any())
            {
                var query    = scanStack.Pop();
                var queryEnd = query.EndUtc < scanEnd ? query.EndUtc : scanEnd;
                var orders   = await this.ordersRepository.Get(query.StartUtc, queryEnd, this.systemProcessOperationContext);

                queriedOrders.AddRange(orders);

                if (query.EndUtc >= scanEnd)
                {
                    var cpy = new UnfilteredOrdersQuery(scanEnd, query.EndUtc);
                    queriedStack.Push(cpy);
                }
            }

            while (queriedStack.Any())
            {
                this.DataManifest.UnfilteredOrders.Push(queriedStack.Pop());
            }

            return(queriedOrders);
        }