FormUpdater.cs 3.3 KB

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