FormUpdater.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using InABox.Core;
  2. using InABox.Database;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace PRS.Shared
  9. {
  10. public static class FormUpdater
  11. {
  12. public static void UpdateAllForms(
  13. Func<DigitalForm, IList<DigitalFormVariable>, bool> skip,
  14. Func<Type, IDigitalFormInstance, DigitalForm, IList<DigitalFormVariable>, bool> convert, int step = 100)
  15. {
  16. var forms = DbFactory.Provider.Query<DigitalForm>(
  17. null,
  18. new Columns<DigitalForm>(x => x.ID)
  19. .Add(x => x.Code)
  20. .Add(x => x.Description)
  21. .Add(x => x.AppliesTo));
  22. foreach(var form in forms.ToObjects<DigitalForm>())
  23. {
  24. Logger.Send(LogType.Information, "", $"Working on '{form.Code} - {form.Description}'");
  25. var variables = DbFactory.Provider.Query(
  26. new Filter<DigitalFormVariable>(x => x.Form.ID).IsEqualTo(form.ID),
  27. null).ToObjects<DigitalFormVariable>().ToArray();
  28. if(skip(form, variables))
  29. {
  30. continue;
  31. }
  32. var formType = DFUtils.GetFormInstanceType(form.AppliesTo);
  33. if(formType is null)
  34. {
  35. Logger.Send(LogType.Error, "", $"{form.AppliesTo} does not refer to a digital form instance class.");
  36. continue;
  37. }
  38. var IDs = DbFactory.Provider.Query(formType,
  39. Filter.Create<IDigitalFormInstance>(formType, x => x.Form.ID).IsEqualTo(form.ID),
  40. Columns.Create<IDigitalFormInstance>(formType)
  41. .Add<IDigitalFormInstance>(x => x.ID)).Rows.Select(x => x.Get<Guid>("ID")).ToArray();
  42. for(int i = 0; i < IDs.Length; i += step)
  43. {
  44. int j = Math.Min(i + step, IDs.Length);
  45. var ids = IDs[i..j];
  46. Logger.Send(LogType.Information, "", $"Converting {j - i} items; {IDs.Length - j} left.");
  47. var formInstances = DbFactory.Provider.Query(formType,
  48. Filter.Create<IDigitalFormInstance>(formType, x => x.ID).InList(ids),
  49. Columns.Create<IDigitalFormInstance>(formType)
  50. .Add<IDigitalFormInstance>(x => x.ID)
  51. .Add<IDigitalFormInstance>(x => x.FormData)
  52. .Add<IDigitalFormInstance>(x => x.BlobData));
  53. var save = new List<Entity>();
  54. foreach (var row in formInstances.Rows)
  55. {
  56. var formInstance = (row.ToObject(formType) as IDigitalFormInstance)!;
  57. if (convert(formType, formInstance, form, variables))
  58. {
  59. save.Add((formInstance as Entity)!);
  60. }
  61. }
  62. if(save.Count > 0)
  63. {
  64. DbFactory.Provider.Save(formType, save);
  65. }
  66. }
  67. }
  68. }
  69. }
  70. }