From 392faeeb2879516a580d1af6f18c6250f9bea8b1 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Thu, 24 Jun 2021 21:40:30 +0000 Subject: [PATCH] --- server/AyaNova/biz/CustomerBiz.cs | 11 ++++ server/AyaNova/biz/WorkOrderBiz.cs | 99 +++++++++++++++++------------- 2 files changed, 68 insertions(+), 42 deletions(-) diff --git a/server/AyaNova/biz/CustomerBiz.cs b/server/AyaNova/biz/CustomerBiz.cs index 3bb7f9f4..7579c35e 100644 --- a/server/AyaNova/biz/CustomerBiz.cs +++ b/server/AyaNova/biz/CustomerBiz.cs @@ -363,10 +363,21 @@ namespace AyaNova.Biz { var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE); idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray(); + //query for this batch, comes back in db natural order unfortunately var batchResults = await ct.Customer.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync(); + + //order the results back into original + //What is happening here: + //for performance the query is batching a bunch at once by fetching a block of items from the sql server + //however it's returning in db order which is often not the order the id list is in + //so it needs to be sorted back into the same order as the ide list + //This would not be necessary if just fetching each one at a time individually (like in workorder get report data) + var orderedList = from id in batch join z in batchResults on id equals z.Id select z; + + foreach (Customer w in orderedList) { await PopulateVizFields(w); diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index 62c4e70c..85cc5062 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -874,7 +874,6 @@ namespace AyaNova.Biz { //workorder reports for entire workorder or just sub parts all go through here //if the ayatype is a descendant of the workorder then only the portion of the workorder from that descendant directly up to the header will be populated and returned - //however if the report template has includeWoItemDescendants=true then the woitems is fully populated var idList = dataListSelectedRequest.SelectedRowIds; @@ -888,49 +887,65 @@ namespace AyaNova.Biz foreach (long batchId in batch) batchResults.Add(await WorkOrderGetPartialAsync(dataListSelectedRequest.AType, batchId, dataListSelectedRequest.IncludeWoItemDescendants)); + #region unnecessary shit removed + //This is unnecessary because the re-ordering bit is only needed when the records are fetched in batches directly from the sql server as they + //return in db natural order and need to be put back into the same order as the ID List + //Here in the workorder however, this code is fetching individually one at a time so they are always going to be in the correct order so this re-ordering is unnecessary + //I'm keeping this here for future reference when I ineveitably wonder what the hell is happening here :) + + //order the results back into original - IEnumerable orderedList = null; - switch (dataListSelectedRequest.AType) - { - case AyaType.WorkOrder: - orderedList = from id in batch join z in batchResults on id equals z.Id select z; - break; - case AyaType.WorkOrderItem: - orderedList = from id in batch join z in batchResults on id equals z.Items[0].Id select z; - break; - case AyaType.WorkOrderItemExpense: - orderedList = from id in batch join z in batchResults on id equals z.Items[0].Expenses[0].Id select z; - break; - case AyaType.WorkOrderItemLabor: - orderedList = from id in batch join z in batchResults on id equals z.Items[0].Labors[0].Id select z; - break; - case AyaType.WorkOrderItemLoan: - orderedList = from id in batch join z in batchResults on id equals z.Items[0].Loans[0].Id select z; - break; - case AyaType.WorkOrderItemPart: - orderedList = from id in batch join z in batchResults on id equals z.Items[0].Parts[0].Id select z; - break; - case AyaType.WorkOrderItemPartRequest: - orderedList = from id in batch join z in batchResults on id equals z.Items[0].PartRequests[0].Id select z; - break; - case AyaType.WorkOrderItemScheduledUser: - orderedList = from id in batch join z in batchResults on id equals z.Items[0].ScheduledUsers[0].Id select z; - break; - case AyaType.WorkOrderItemTask: - orderedList = from id in batch join z in batchResults on id equals z.Items[0].Tasks[0].Id select z; - break; - case AyaType.WorkOrderItemTravel: - orderedList = from id in batch join z in batchResults on id equals z.Items[0].Travels[0].Id select z; - break; - case AyaType.WorkOrderItemOutsideService: - orderedList = from id in batch join z in batchResults on id equals z.Items[0].OutsideServices[0].Id select z; - break; - case AyaType.WorkOrderItemUnit: - orderedList = from id in batch join z in batchResults on id equals z.Items[0].Units[0].Id select z; - break; - } + //IEnumerable orderedList = null; - foreach (WorkOrder w in orderedList) + //TODO: WHAT IS THIS BATCH RESULT ORDERING CODE REALLY DOING AND CAN IT BE REMOVED / CHANGED???? + //isn't it alredy working in order? If not maybe simply reversed so reverse it again before querying above or...?? + + //todo: can't assume the grandchild item is index 0 anymore as we might have multiple of them if includedescendants is true + //so need to find index first then do this + // switch (dataListSelectedRequest.AType) + // { + // case AyaType.WorkOrder: + // orderedList = from id in batch join z in batchResults on id equals z.Id select z; + // break; + // case AyaType.WorkOrderItem: + // orderedList = from id in batch join z in batchResults on id equals z.Items[0].Id select z; + // break; + // case AyaType.WorkOrderItemExpense: + // orderedList = from id in batch join z in batchResults on id equals z.Items[0].Expenses[0].Id select z; + // break; + // case AyaType.WorkOrderItemLabor: + // orderedList = from id in batch join z in batchResults on id equals z.Items[0].Labors[0].Id select z; + // break; + // case AyaType.WorkOrderItemLoan: + // orderedList = from id in batch join z in batchResults on id equals z.Items[0].Loans[0].Id select z; + // break; + // case AyaType.WorkOrderItemPart: + // orderedList = from id in batch join z in batchResults on id equals z.Items[0].Parts[0].Id select z; + // break; + // case AyaType.WorkOrderItemPartRequest: + // orderedList = from id in batch join z in batchResults on id equals z.Items[0].PartRequests[0].Id select z; + // break; + // case AyaType.WorkOrderItemScheduledUser: + // orderedList = from id in batch join z in batchResults on id equals z.Items[0].ScheduledUsers[0].Id select z; + // break; + // case AyaType.WorkOrderItemTask: + // orderedList = from id in batch join z in batchResults on id equals z.Items[0].Tasks[0].Id select z; + // break; + // case AyaType.WorkOrderItemTravel: + // orderedList = from id in batch join z in batchResults on id equals z.Items[0].Travels[0].Id select z; + // break; + // case AyaType.WorkOrderItemOutsideService: + // orderedList = from id in batch join z in batchResults on id equals z.Items[0].OutsideServices[0].Id select z; + // break; + // case AyaType.WorkOrderItemUnit: + // orderedList = from id in batch join z in batchResults on id equals z.Items[0].Units[0].Id select z; + // break; + // } + + //foreach (WorkOrder w in orderedList) + #endregion unnecessary shit + + foreach (WorkOrder w in batchResults) { var jo = JObject.FromObject(w);