Browse Source

cleanup repeated querying within CollectionFolder

Luke Pulverenti 11 years ago
parent
commit
d580abcd65

+ 48 - 37
MediaBrowser.Controller/Entities/CollectionFolder.cs

@@ -1,5 +1,4 @@
 using System;
-using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
@@ -69,64 +68,76 @@ namespace MediaBrowser.Controller.Entities
             return NullTaskResult;
         }
 
+        private List<LinkedChild> _linkedChildren;
+        
         /// <summary>
         /// Our children are actually just references to the ones in the physical root...
         /// </summary>
         /// <value>The linked children.</value>
         public override List<LinkedChild> LinkedChildren
         {
-            get
+            get { return _linkedChildren ?? (_linkedChildren = GetLinkedChildrenInternal()); }
+            set
             {
-                Dictionary<string, string> locationsDicionary;
-
-                try
-                {
-                    locationsDicionary = ResolveArgs.PhysicalLocations.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
-                }
-                catch (IOException ex)
-                {
-                    Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path);
-                    return new List<LinkedChild>();
-                }
-
-                return LibraryManager.RootFolder.Children
-                    .OfType<Folder>()
-                    .Where(i => i.Path != null && locationsDicionary.ContainsKey(i.Path))
-                    .SelectMany(c => c.LinkedChildren).ToList();
+                base.LinkedChildren = value;
+            }
+        }
+        private List<LinkedChild> GetLinkedChildrenInternal()
+        {
+            Dictionary<string, string> locationsDicionary;
 
+            try
+            {
+                locationsDicionary = ResolveArgs.PhysicalLocations.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
             }
-            set
+            catch (IOException ex)
             {
-                base.LinkedChildren = value;
+                Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path);
+                return new List<LinkedChild>();
             }
+
+            return LibraryManager.RootFolder.Children
+                .OfType<Folder>()
+                .Where(i => i.Path != null && locationsDicionary.ContainsKey(i.Path))
+                .SelectMany(c => c.LinkedChildren).ToList();
         }
 
+        private IEnumerable<BaseItem> _actualChildren;
+
         /// <summary>
         /// Our children are actually just references to the ones in the physical root...
         /// </summary>
         /// <value>The actual children.</value>
         protected override IEnumerable<BaseItem> ActualChildren
         {
-            get
-            {
-                Dictionary<string, string> locationsDicionary;
+            get { return _actualChildren ?? (_actualChildren = GetActualChildren()); }
+        }
 
-                try
-                {
-                    locationsDicionary = ResolveArgs.PhysicalLocations.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
-                }
-                catch (IOException ex)
-                {
-                    Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path);
-                    return new BaseItem[] { };
-                }
+        private IEnumerable<BaseItem> GetActualChildren()
+        {
+            Dictionary<string, string> locationsDicionary;
 
-                return
-                    LibraryManager.RootFolder.Children
-                    .OfType<Folder>()
-                    .Where(i => i.Path != null && locationsDicionary.ContainsKey(i.Path))
-                    .SelectMany(c => c.Children);
+            try
+            {
+                locationsDicionary = ResolveArgs.PhysicalLocations.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
             }
+            catch (IOException ex)
+            {
+                Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path);
+                return new BaseItem[] { };
+            }
+
+            return
+                LibraryManager.RootFolder.Children
+                .OfType<Folder>()
+                .Where(i => i.Path != null && locationsDicionary.ContainsKey(i.Path))
+                .SelectMany(c => c.Children);
+        }
+
+        public void ResetDynamicChildren()
+        {
+            _actualChildren = null;
+            _linkedChildren = null;
         }
     }
 }

+ 12 - 0
MediaBrowser.Server.Implementations/Library/LibraryManager.cs

@@ -1283,6 +1283,8 @@ namespace MediaBrowser.Server.Implementations.Library
                 UpdateItemInLibraryCache(item);
             }
 
+            UpdateCollectionFolders();
+
             if (ItemAdded != null)
             {
                 foreach (var item in list)
@@ -1336,6 +1338,8 @@ namespace MediaBrowser.Server.Implementations.Library
         /// <param name="item">The item.</param>
         public void ReportItemRemoved(BaseItem item)
         {
+            UpdateCollectionFolders();
+
             if (ItemRemoved != null)
             {
                 try
@@ -1349,6 +1353,14 @@ namespace MediaBrowser.Server.Implementations.Library
             }
         }
 
+        private void UpdateCollectionFolders()
+        {
+            foreach (var folder in _userManager.Users.SelectMany(i => i.RootFolder.Children).OfType<CollectionFolder>().ToList())
+            {
+                folder.ResetDynamicChildren();
+            }
+        }
+
         /// <summary>
         /// Retrieves the item.
         /// </summary>