public override IMediaFolder Transform(IMediaFolder oldRoot) { var root = new VirtualClonedFolder(oldRoot); var titles = new SimpleKeyedVirtualFolder(root, "titles"); SortFolder(root, titles); foreach (var i in root.ChildFolders.ToList()) { root.ReleaseFolder(i); } foreach (var i in titles.ChildFolders.ToList()) { if (i.ChildCount > 100) { DebugFormat("Partioning folder {0}", i.Title); using (var prefixer = new Prefixer()) { PartitionChildren(i as VirtualFolder, prefixer); } } root.AdoptFolder(i); } return(root); }
private void PartitionChildren(VirtualFolder folder, Prefixer prefixer, int startfrom = 1) { for (var wordcount = startfrom;;) { var curwc = wordcount; var groups = from i in folder.ChildItems.ToList() let prefix = prefixer.GetWordPrefix(GetTitle(i), curwc) where !string.IsNullOrWhiteSpace(prefix) group i by prefix.ToLowerInvariant() into g let gcount = g.LongCount() where gcount > 3 orderby g.LongCount() descending select g; var longest = groups.FirstOrDefault(); if (longest == null) { if (wordcount++ > 5) { return; } continue; } var newfolder = new VirtualFolder(folder, longest.Key); foreach (var item in longest) { folder.RemoveResource(item); newfolder.AddResource(item); } if (newfolder.ChildCount > 100) { PartitionChildren(newfolder, prefixer, wordcount + 1); } if (newfolder.ChildFolders.LongCount() == 1) { foreach (var f in newfolder.ChildFolders.ToList()) { folder.AdoptFolder(f); } } else { folder.AdoptFolder(newfolder); } } }
public override IMediaFolder Transform(IMediaFolder oldRoot) { var root = new VirtualClonedFolder(oldRoot); var titles = new SimpleKeyedVirtualFolder(root, "titles"); SortFolder(root, titles); foreach (var i in root.ChildFolders.ToList()) { root.ReleaseFolder(i); } foreach (var i in titles.ChildFolders.ToList()) { if (i.ChildCount > 100) { DebugFormat("Partioning folder {0}", i.Title); using (var prefixer = new Prefixer()) { PartitionChildren(i as VirtualFolder, prefixer); } } root.AdoptFolder(i); } return root; }