Update_8_24.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using Comal.Classes;
  2. using InABox.Core;
  3. using InABox.Database;
  4. namespace PRS.Shared.Database_Update_Scripts;
  5. internal class Update_8_24 : DatabaseUpdateScript
  6. {
  7. private Type jripoiType = null;
  8. public Update_8_24()
  9. {
  10. jripoiType = CoreUtils.GetEntity("Comal.Classes.JobRequisitionItemPurchaseOrderItem");
  11. }
  12. private static readonly int CHUNK_SIZE = 500;
  13. private static readonly bool DESTRUCTIVE = false;
  14. public override VersionNumber Version => new(8, 24);
  15. public override bool Update()
  16. {
  17. var _provider = DbFactory.NewProvider(Logger.Main);
  18. Clear_POIAs(_provider);
  19. var _poias = Migrate_JRIPOIs(_provider);
  20. Migrate_POIs(_provider, _poias);
  21. return true;
  22. }
  23. private void Clear_POIAs(IProvider provider)
  24. {
  25. Logger.Send(LogType.Information, "", "Clearing Existing Allocations");
  26. var _queue = provider.Query(
  27. new Filter<PurchaseOrderItemAllocation>().All(),
  28. Columns.None<PurchaseOrderItemAllocation>().Add(x => x.ID)
  29. ).Rows.ToQueue();
  30. while (_queue.Any())
  31. {
  32. List<PurchaseOrderItemAllocation> _poias = _queue
  33. .Dequeue(CHUNK_SIZE)
  34. .Select(x => x.ToObject<PurchaseOrderItemAllocation>())
  35. .ToList();
  36. provider.Delete(_poias, "");
  37. Logger.Send(LogType.Information, "", $"- Deleted {_poias.Count} Allocations ({_queue.Count} remaining)");
  38. }
  39. }
  40. private static readonly string RANDOMGUID =
  41. "lower(hex(randomblob(4)) " +
  42. "|| '-' || hex(randomblob(2)) " +
  43. "|| '-' || '4' || substr(hex( randomblob(2)), 2) " +
  44. "|| '-' || substr('AB89', 1 + (abs(random()) % 4) , 1) || substr(hex(randomblob(2)), 2) " +
  45. "|| '-' || hex(randomblob(6)))";
  46. private List<PurchaseOrderItemAllocation> Migrate_JRIPOIs(IProvider provider)
  47. {
  48. // var sql = $"insert into PurchaseOrderItemAllocation (ID, [JobRequisitionItem.ID], Qty)" +
  49. // $"select " +
  50. // $"lower(hex(randomblob(4)) " +
  51. // $"|| '-' || hex(randomblob(2)) " +
  52. // $"|| '-' || '4' || substr(hex( randomblob(2)), 2) " +
  53. // $"|| '-' || substr('AB89', 1 + (abs(random()) % 4) , 1) || substr(hex(randomblob(2)), 2) " +
  54. // $"|| '-' || hex(randomblob(6))) as ID, " +
  55. // $"jripoi.[PurchaseOrderItem.ID],jripoi.[JobRequisitionItem.ID],poi.Qty " +
  56. // $"from JobRequisitionItemPurchaseOrderItem jripoi " +
  57. // $"join PurchaseOrderItem poi on poi.[ID] = jripoi.[PurchaseOrderItem.ID]";
  58. var _result = new List<PurchaseOrderItemAllocation>();
  59. if (!provider.TableExists(jripoiType))
  60. return _result;
  61. Logger.Send(LogType.Information,"","Migrating JobRequisitionItems");
  62. var _queue = provider.Query(jripoiType,
  63. null,
  64. Columns.None(jripoiType)
  65. .Add("PurchaseOrderItem.ID")
  66. .Add("PurchaseOrderItem.Qty")
  67. .Add("JobRequisitionItem.ID")
  68. .Add("JobRequisitionItem.Job.ID")
  69. ).Rows.ToQueue();
  70. while (_queue.Any())
  71. {
  72. List<PurchaseOrderItemAllocation> _poias = new();
  73. var _rows = _queue.Dequeue(CHUNK_SIZE).ToList();
  74. foreach (var _row in _rows)
  75. {
  76. var _poia = new PurchaseOrderItemAllocation();
  77. _poia.Item.ID = _row.Get<Guid>("PurchaseOrderItem.ID");
  78. _poia.Job.ID = _row.Get<Guid>("JobRequisitionItem.Job.ID");
  79. _poia.JobRequisitionItem.ID = _row.Get<Guid>("JobRequisitionItem.ID");
  80. _poia.Quantity = _row.Get<double>("PurchaseOrderItem.Qty");
  81. _poias.Add(_poia);
  82. CoreUtils.SetPropertyValue(_row,"Job.ID",Guid.Empty);
  83. }
  84. provider.Save(_poias);
  85. Logger.Send(LogType.Information, "", $"- Created {_poias.Count} Allocations ({_queue.Count} remaining)");
  86. _result.AddRange(_poias);
  87. }
  88. if (DESTRUCTIVE)
  89. provider.DropTable(jripoiType);
  90. return _result;
  91. }
  92. private void Migrate_POIs(IProvider provider, List<PurchaseOrderItemAllocation> poias)
  93. {
  94. Logger.Send(LogType.Information,"","Migrating PurchaseOrderItems");
  95. var _ids = poias.Select(x => x.Item.ID).Distinct().ToArray();
  96. var _queue = provider.Query(
  97. new Filter<PurchaseOrderItem>("Job.ID").IsNotEqualTo(Guid.Empty),
  98. Columns.Required<PurchaseOrderItem>().Add("Job.ID")
  99. ).Rows.ToQueue();
  100. while (_queue.Any())
  101. {
  102. List<PurchaseOrderItemAllocation> _poias = new();
  103. var _pois = _queue.Dequeue(CHUNK_SIZE)
  104. .Where(r => !_ids.Contains(r.Get<PurchaseOrderItemAllocation,Guid>(c=>c.ID)))
  105. .Select(x=>x.ToObject<PurchaseOrderItem>())
  106. .ToList();
  107. foreach (var _poi in _pois)
  108. {
  109. var _poia = new PurchaseOrderItemAllocation();
  110. _poia.Item.ID = _poi.ID;
  111. _poia.Job.ID = (Guid)(CoreUtils.GetPropertyValue(_poi, "Job.ID") ?? Guid.Empty);
  112. _poia.Quantity = _poi.Qty;
  113. _poias.Add(_poia);
  114. CoreUtils.SetPropertyValue(_poi,"Job.ID",Guid.Empty);
  115. }
  116. provider.Save(_poias);
  117. if(DESTRUCTIVE)
  118. provider.Save(_pois);
  119. Logger.Send(LogType.Information, "", $"- Created {_poias.Count} Allocations ({_queue.Count} remaining)");
  120. }
  121. }
  122. }