12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- using InABox.Core;
- using InABox.Database;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace PRS.Shared
- {
- public static class FormUpdater
- {
- public static void UpdateAllForms(
- Func<DigitalForm, IList<DigitalFormVariable>, bool> skip,
- Func<Type, IDigitalFormInstance, DigitalForm, IList<DigitalFormVariable>, bool> convert, int step = 100)
- {
- var forms = DbFactory.Provider.Query<DigitalForm>(
- null,
- new Columns<DigitalForm>(x => x.ID)
- .Add(x => x.Code)
- .Add(x => x.Description)
- .Add(x => x.AppliesTo));
- foreach(var form in forms.ToObjects<DigitalForm>())
- {
- Logger.Send(LogType.Information, "", $"Working on '{form.Code} - {form.Description}'");
- var variables = DbFactory.Provider.Query(
- new Filter<DigitalFormVariable>(x => x.Form.ID).IsEqualTo(form.ID),
- null).ToObjects<DigitalFormVariable>().ToArray();
- if(skip(form, variables))
- {
- continue;
- }
- var formType = DFUtils.GetFormInstanceType(form.AppliesTo);
- if(formType is null)
- {
- Logger.Send(LogType.Error, "", $"{form.AppliesTo} does not refer to a digital form instance class.");
- continue;
- }
- var IDs = DbFactory.Provider.Query(formType,
- Filter.Create<IDigitalFormInstance>(formType, x => x.Form.ID).IsEqualTo(form.ID),
- Columns.Create<IDigitalFormInstance>(formType)
- .Add<IDigitalFormInstance>(x => x.ID)).Rows.Select(x => x.Get<Guid>("ID")).ToArray();
- for(int i = 0; i < IDs.Length; i += step)
- {
- int j = Math.Min(i + step, IDs.Length);
- var ids = IDs[i..j];
- Logger.Send(LogType.Information, "", $"Converting {j - i} items; {IDs.Length - j} left.");
- var formInstances = DbFactory.Provider.Query(formType,
- Filter.Create<IDigitalFormInstance>(formType, x => x.ID).InList(ids),
- Columns.Create<IDigitalFormInstance>(formType)
- .Add<IDigitalFormInstance>(x => x.ID)
- .Add<IDigitalFormInstance>(x => x.FormData)
- .Add<IDigitalFormInstance>(x => x.BlobData));
- var save = new List<Entity>();
- foreach (var row in formInstances.Rows)
- {
- var formInstance = (row.ToObject(formType) as IDigitalFormInstance)!;
- if (convert(formType, formInstance, form, variables))
- {
- save.Add((formInstance as Entity)!);
- }
- }
- if(save.Count > 0)
- {
- DbFactory.Provider.Save(formType, save);
- }
- }
- }
- }
- }
- }
|