update artist queries

This commit is contained in:
Luke Pulverenti
2016-05-18 01:34:10 -04:00
parent 5486e40e1d
commit d1d0487fee
17 changed files with 246 additions and 147 deletions

View File

@@ -56,36 +56,20 @@ namespace MediaBrowser.Controller.Entities.Audio
public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query)
{
var itemByNameFilter = GetItemFilter();
if (query.User != null)
if (query.IncludeItemTypes.Length == 0)
{
return query.User.RootFolder
.GetRecursiveChildren(query.User, i =>
{
if (query.IsFolder.HasValue)
{
if (query.IsFolder.Value != i.IsFolder)
{
return false;
}
}
return itemByNameFilter(i);
});
query.IncludeItemTypes = new[] { typeof(Audio).Name, typeof(MusicVideo).Name, typeof(MusicAlbum).Name };
query.ArtistNames = new[] { Name };
}
return LibraryManager.RootFolder
.GetRecursiveChildren(i =>
{
if (query.IsFolder.HasValue)
{
if (query.IsFolder.Value != i.IsFolder)
{
return false;
}
}
return itemByNameFilter(i);
});
// Need this for now since the artist filter isn't yet supported by the db
if (ConfigurationManager.Configuration.SchemaVersion < 79)
{
var filter = GetItemFilter();
return LibraryManager.GetItemList(query).Where(filter);
}
return LibraryManager.GetItemList(query);
}
protected override IEnumerable<BaseItem> ActualChildren

View File

@@ -749,7 +749,7 @@ namespace MediaBrowser.Controller.Entities
{
var user = query.User;
if (RequiresPostFiltering(query))
if (!query.ForceDirect && RequiresPostFiltering(query))
{
IEnumerable<BaseItem> items;
Func<BaseItem, bool> filter = i => UserViewBuilder.Filter(i, user, query, UserDataManager, LibraryManager);
@@ -760,7 +760,7 @@ namespace MediaBrowser.Controller.Entities
}
else
{
items = GetRecursiveChildren(user, filter);
items = GetRecursiveChildren(user, query);
}
return PostFilterAndSort(items, query);
@@ -817,21 +817,26 @@ namespace MediaBrowser.Controller.Entities
return true;
}
}
if (ConfigurationManager.Configuration.SchemaVersion < 79)
{
if (query.SortBy.Contains(ItemSortBy.AlbumArtist, StringComparer.OrdinalIgnoreCase))
{
Logger.Debug("Query requires post-filtering due to ItemSortBy.AlbumArtist");
return true;
}
if (query.SortBy.Contains(ItemSortBy.Artist, StringComparer.OrdinalIgnoreCase))
{
Logger.Debug("Query requires post-filtering due to ItemSortBy.Artist");
return true;
}
}
if (query.SortBy.Contains(ItemSortBy.AiredEpisodeOrder, StringComparer.OrdinalIgnoreCase))
{
Logger.Debug("Query requires post-filtering due to ItemSortBy.AiredEpisodeOrder");
return true;
}
if (query.SortBy.Contains(ItemSortBy.AlbumArtist, StringComparer.OrdinalIgnoreCase))
{
Logger.Debug("Query requires post-filtering due to ItemSortBy.AlbumArtist");
return true;
}
if (query.SortBy.Contains(ItemSortBy.Artist, StringComparer.OrdinalIgnoreCase))
{
Logger.Debug("Query requires post-filtering due to ItemSortBy.Artist");
return true;
}
if (query.SortBy.Contains(ItemSortBy.Budget, StringComparer.OrdinalIgnoreCase))
{
Logger.Debug("Query requires post-filtering due to ItemSortBy.Budget");
@@ -1109,10 +1114,13 @@ namespace MediaBrowser.Controller.Entities
return true;
}
if (query.ArtistNames.Length > 0)
if (ConfigurationManager.Configuration.SchemaVersion < 79)
{
Logger.Debug("Query requires post-filtering due to ArtistNames");
return true;
if (query.ArtistNames.Length > 0)
{
Logger.Debug("Query requires post-filtering due to ArtistNames");
return true;
}
}
return false;
@@ -1178,7 +1186,7 @@ namespace MediaBrowser.Controller.Entities
else
{
items = query.Recursive
? GetRecursiveChildren(user, filter)
? GetRecursiveChildren(user, query)
: GetChildren(user, true).Where(filter);
}
@@ -1215,19 +1223,14 @@ namespace MediaBrowser.Controller.Entities
/// <summary>
/// Adds the children to list.
/// </summary>
/// <param name="user">The user.</param>
/// <param name="includeLinkedChildren">if set to <c>true</c> [include linked children].</param>
/// <param name="result">The result.</param>
/// <param name="recursive">if set to <c>true</c> [recursive].</param>
/// <param name="filter">The filter.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
private void AddChildren(User user, bool includeLinkedChildren, Dictionary<Guid, BaseItem> result, bool recursive, Func<BaseItem, bool> filter)
private void AddChildren(User user, bool includeLinkedChildren, Dictionary<Guid, BaseItem> result, bool recursive, InternalItemsQuery query)
{
foreach (var child in GetEligibleChildrenForRecursiveChildren(user))
{
if (child.IsVisible(user))
{
if (filter == null || filter(child))
if (query == null || UserViewBuilder.FilterItem(child, query))
{
result[child.Id] = child;
}
@@ -1236,7 +1239,7 @@ namespace MediaBrowser.Controller.Entities
{
var folder = (Folder)child;
folder.AddChildren(user, includeLinkedChildren, result, true, filter);
folder.AddChildren(user, includeLinkedChildren, result, true, query);
}
}
}
@@ -1247,7 +1250,7 @@ namespace MediaBrowser.Controller.Entities
{
if (child.IsVisible(user))
{
if (filter == null || filter(child))
if (query == null || UserViewBuilder.FilterItem(child, query))
{
result[child.Id] = child;
}
@@ -1265,10 +1268,10 @@ namespace MediaBrowser.Controller.Entities
/// <exception cref="System.ArgumentNullException"></exception>
public IEnumerable<BaseItem> GetRecursiveChildren(User user, bool includeLinkedChildren = true)
{
return GetRecursiveChildren(user, i => true);
return GetRecursiveChildren(user, null);
}
public virtual IEnumerable<BaseItem> GetRecursiveChildren(User user, Func<BaseItem, bool> filter)
public virtual IEnumerable<BaseItem> GetRecursiveChildren(User user, InternalItemsQuery query)
{
if (user == null)
{
@@ -1277,7 +1280,7 @@ namespace MediaBrowser.Controller.Entities
var result = new Dictionary<Guid, BaseItem>();
AddChildren(user, true, result, true, filter);
AddChildren(user, true, result, true, query);
return result.Values;
}
@@ -1534,7 +1537,8 @@ namespace MediaBrowser.Controller.Entities
User = user,
Recursive = true,
IsFolder = false,
IsUnaired = false
IsUnaired = false,
EnableTotalRecordCount = false
};
@@ -1562,7 +1566,8 @@ namespace MediaBrowser.Controller.Entities
{
User = user,
Recursive = true,
IsFolder = false
IsFolder = false,
EnableTotalRecordCount = false
}).ConfigureAwait(false);
@@ -1578,7 +1583,8 @@ namespace MediaBrowser.Controller.Entities
{
Recursive = true,
IsFolder = false,
ExcludeLocationTypes = new[] { LocationType.Virtual }
ExcludeLocationTypes = new[] { LocationType.Virtual },
EnableTotalRecordCount = false
}).Result;
@@ -1630,7 +1636,8 @@ namespace MediaBrowser.Controller.Entities
{
Recursive = true,
IsFolder = false,
ExcludeLocationTypes = new[] { LocationType.Virtual }
ExcludeLocationTypes = new[] { LocationType.Virtual },
EnableTotalRecordCount = false
}).Result;

View File

@@ -15,12 +15,6 @@ namespace MediaBrowser.Controller.Entities
/// <returns>IEnumerable{BaseItem}.</returns>
IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems);
/// <summary>
/// Gets the item filter.
/// </summary>
/// <returns>Func&lt;BaseItem, System.Boolean&gt;.</returns>
Func<BaseItem, bool> GetItemFilter();
IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query);
}

View File

@@ -19,8 +19,6 @@ namespace MediaBrowser.Controller.Entities
public User User { get; set; }
public Func<BaseItem, bool> Filter { get; set; }
public bool? IsFolder { get; set; }
public bool? IsFavorite { get; set; }
public bool? IsFavoriteOrLiked { get; set; }
@@ -138,6 +136,7 @@ namespace MediaBrowser.Controller.Entities
public bool GroupByPresentationUniqueKey { get; set; }
public bool EnableTotalRecordCount { get; set; }
public bool ForceDirect { get; set; }
public InternalItemsQuery()
{

View File

@@ -381,14 +381,18 @@ namespace MediaBrowser.Controller.Entities.TV
}
else
{
episodes = GetRecursiveChildren(user, i => i is Episode)
.Cast<Episode>();
episodes = GetRecursiveChildren(user, new InternalItemsQuery(user)
{
IncludeItemTypes = new[] { typeof(Episode).Name }
}).Cast<Episode>();
}
}
else
{
episodes = GetRecursiveChildren(user, i => i is Episode)
.Cast<Episode>();
episodes = GetRecursiveChildren(user, new InternalItemsQuery(user)
{
IncludeItemTypes = new[] { typeof(Episode).Name }
}).Cast<Episode>();
}
episodes = FilterEpisodesBySeason(episodes, seasonNumber, DisplaySpecialsWithSeasons);

View File

@@ -66,7 +66,8 @@ namespace MediaBrowser.Controller.Entities
{
var result = GetItems(new InternalItemsQuery
{
User = user
User = user,
EnableTotalRecordCount = false
}).Result;
@@ -83,17 +84,19 @@ namespace MediaBrowser.Controller.Entities
return true;
}
public override IEnumerable<BaseItem> GetRecursiveChildren(User user, Func<BaseItem, bool> filter)
public override IEnumerable<BaseItem> GetRecursiveChildren(User user, InternalItemsQuery query)
{
var result = GetItems(new InternalItemsQuery
{
User = user,
Recursive = true,
Filter = filter
EnableTotalRecordCount = false,
ForceDirect = true
}).Result;
return result.Items;
return result.Items.Where(i => UserViewBuilder.FilterItem(i, query));
}
protected override IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user)

View File

@@ -128,7 +128,11 @@ namespace MediaBrowser.Controller.Entities
{
if (query.Recursive)
{
return GetResult(queryParent.GetRecursiveChildren(user, true), queryParent, query);
query.Recursive = true;
query.ParentId = queryParent.Id;
query.SetUser(user);
return _libraryManager.GetItemsResult(query);
}
return GetResult(queryParent.GetChildren(user, true), queryParent, query);
}
@@ -328,9 +332,13 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetMusicAlbumArtists(Folder parent, User user, InternalItemsQuery query)
{
var items = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos })
.Where(i => !i.IsFolder)
.OfType<IHasAlbumArtist>();
var items = _libraryManager.GetItemList(new InternalItemsQuery(user)
{
Recursive = true,
ParentId = parent.Id,
IncludeItemTypes = new[] { typeof(Audio.Audio).Name }
}).Cast<IHasAlbumArtist>();
var artists = _libraryManager.GetAlbumArtists(items);
@@ -339,9 +347,13 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetMusicArtists(Folder parent, User user, InternalItemsQuery query)
{
var items = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos })
.Where(i => !i.IsFolder)
.OfType<IHasArtist>();
var items = _libraryManager.GetItemList(new InternalItemsQuery(user)
{
Recursive = true,
ParentId = parent.Id,
IncludeItemTypes = new[] { typeof(Audio.Audio).Name, typeof(MusicVideo).Name }
}).Cast<IHasArtist>();
var artists = _libraryManager.GetArtists(items);
@@ -350,9 +362,13 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetFavoriteArtists(Folder parent, User user, InternalItemsQuery query)
{
var items = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos })
.Where(i => !i.IsFolder)
.OfType<IHasAlbumArtist>();
var items = _libraryManager.GetItemList(new InternalItemsQuery(user)
{
Recursive = true,
ParentId = parent.Id,
IncludeItemTypes = new[] { typeof(Audio.Audio).Name }
}).Cast<IHasAlbumArtist>();
var artists = _libraryManager.GetAlbumArtists(items).Where(i => _userDataManager.GetUserData(user, i).IsFavorite);
@@ -753,9 +769,9 @@ namespace MediaBrowser.Controller.Entities
return PostFilterAndSort(items, queryParent, null, query, _libraryManager);
}
public bool FilterItem(BaseItem item, InternalItemsQuery query)
public static bool FilterItem(BaseItem item, InternalItemsQuery query)
{
return Filter(item, query.User, query, _userDataManager, _libraryManager);
return Filter(item, query.User, query, BaseItem.UserDataManager, BaseItem.LibraryManager);
}
private QueryResult<BaseItem> PostFilterAndSort(IEnumerable<BaseItem> items,
@@ -1274,11 +1290,6 @@ namespace MediaBrowser.Controller.Entities
return false;
}
if (query.Filter != null && !query.Filter(item))
{
return false;
}
UserItemData userData = null;
if (query.IsLiked.HasValue)

View File

@@ -63,13 +63,13 @@ namespace MediaBrowser.Controller.Playlists
return GetPlayableItems(user).Result;
}
public override IEnumerable<BaseItem> GetRecursiveChildren(User user, Func<BaseItem, bool> filter)
public override IEnumerable<BaseItem> GetRecursiveChildren(User user, InternalItemsQuery query)
{
var items = GetPlayableItems(user).Result;
if (filter != null)
if (query != null)
{
items = items.Where(filter);
items = items.Where(i => UserViewBuilder.FilterItem(i, query));
}
return items;
@@ -129,7 +129,11 @@ namespace MediaBrowser.Controller.Playlists
var items = user == null
? LibraryManager.RootFolder.GetRecursiveChildren(filter)
: user.RootFolder.GetRecursiveChildren(user, filter);
: user.RootFolder.GetRecursiveChildren(user, new InternalItemsQuery(user)
{
IncludeItemTypes = new[] { typeof(Audio).Name },
ArtistNames = new[] { musicArtist.Name }
});
return LibraryManager.Sort(items, user, new[] { ItemSortBy.AlbumArtist, ItemSortBy.Album, ItemSortBy.SortName }, SortOrder.Ascending);
}