/// <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); }