Просмотр исходного кода

Added EnsureColumns functions to IProvider

Kenric Nugteren 7 месяцев назад
Родитель
Сommit
95aa2b0ea9
1 измененных файлов с 38 добавлено и 8 удалено
  1. 38 8
      InABox.Database/IProvider.cs

+ 38 - 8
InABox.Database/IProvider.cs

@@ -49,14 +49,6 @@ public interface IProvider
     /// <summary>
     /// Same as <see cref="Query{T}(Filter{T}, Columns{T}, SortOrder{T}, CoreRange, bool, bool)"/>, but only for deleted items
     /// </summary>
-    /// <typeparam name="T"></typeparam>
-    /// <param name="deletion"></param>
-    /// <param name="filter"></param>
-    /// <param name="columns"></param>
-    /// <param name="sort"></param>
-    /// <param name="range"></param>
-    /// <param name="deleted"></param>
-    /// <returns></returns>
     CoreTable QueryDeleted<T>(Deletion deletion, Filter<T>? filter = null, Columns<T>? columns = null, SortOrder<T>? sort = null, CoreRange? range = null, bool deleted = false) where T : Entity, new();
 
     T[] Load<T>(Filter<T>? filter = null, SortOrder<T>? sort = null, CoreRange? range = null) where T : Entity, new();
@@ -77,4 +69,42 @@ public interface IProvider
     void Recover(Deletion deletion);
 
     List<Type> GetDeletionTypes(Deletion deletion);
+}
+
+public static class ProviderExtensions
+{
+    public static void EnsureColumns<TEntity>(this IProvider provider, TEntity entity, Columns<TEntity> columns)
+        where TEntity : Entity, new()
+    {
+        var newColumns = Columns.None<TEntity>()
+            .AddRange(columns.Where(x => !entity.HasColumn(x.Property)));
+        if (newColumns.Count > 0)
+        {
+            var row = provider.Query(new Filter<TEntity>(x => x.ID).IsEqualTo(entity.ID), newColumns).Rows.FirstOrDefault();
+            row?.FillObject(entity);
+        }
+    }
+
+    public static void EnsureColumns<TEntity>(this IProvider provider, ICollection<TEntity> entities, Columns<TEntity> columns)
+        where TEntity : Entity, IRemotable, new()
+    {
+        var newColumns = Columns.None<TEntity>()
+            .AddRange(columns.Where(x => entities.Any(entity => !entity.HasColumn(x.Property))));
+        if (newColumns.Count > 0)
+        {
+            newColumns.Add(x => x.ID);
+            var table = provider.Query(new Filter<TEntity>(x => x.ID).InList(entities.Select(x => x.ID).ToArray()), newColumns);
+            foreach(var row in table.Rows)
+            {
+                var id = row.Get<TEntity, Guid>(x => x.ID);
+                var entity = entities.FirstOrDefault(x => x.ID == id);
+                if(entity is null)
+                {
+                    // Shouldn't happen, but just in case.
+                    continue;
+                }
+                row?.FillObject(entity);
+            }
+        }
+    }
 }