update item queries

This commit is contained in:
Luke Pulverenti 2016-06-12 01:03:52 -04:00
parent d7edd499d2
commit f378a2c789
11 changed files with 83 additions and 87 deletions

View File

@ -114,7 +114,7 @@ namespace MediaBrowser.Api
config.EnableStandaloneMusicKeys = true; config.EnableStandaloneMusicKeys = true;
config.EnableCaseSensitiveItemIds = true; config.EnableCaseSensitiveItemIds = true;
config.EnableFolderView = true; config.EnableFolderView = true;
config.SchemaVersion = 89; config.SchemaVersion = 91;
} }
public void Post(UpdateStartupConfiguration request) public void Post(UpdateStartupConfiguration request)

View File

@ -53,6 +53,8 @@ namespace MediaBrowser.Controller.Channels
public bool IsInfiniteStream { get; set; } public bool IsInfiniteStream { get; set; }
public string HomePageUrl { get; set; }
public ChannelItemInfo() public ChannelItemInfo()
{ {
MediaSources = new List<ChannelMediaInfo>(); MediaSources = new List<ChannelMediaInfo>();

View File

@ -71,6 +71,9 @@ namespace MediaBrowser.Controller.Entities
public List<ItemImageInfo> ImageInfos { get; set; } public List<ItemImageInfo> ImageInfos { get; set; }
[IgnoreDataMember]
public bool IsVirtualItem { get; set; }
/// <summary> /// <summary>
/// Gets or sets the album. /// Gets or sets the album.
/// </summary> /// </summary>

View File

@ -117,6 +117,7 @@ namespace MediaBrowser.Controller.Entities
public bool? IsCurrentSchema { get; set; } public bool? IsCurrentSchema { get; set; }
public bool? HasDeadParentId { get; set; } public bool? HasDeadParentId { get; set; }
public bool? IsOffline { get; set; } public bool? IsOffline { get; set; }
public bool? IsVirtualItem { get; set; }
public Guid? ParentId { get; set; } public Guid? ParentId { get; set; }
public string[] AncestorIds { get; set; } public string[] AncestorIds { get; set; }

View File

@ -128,39 +128,16 @@ namespace MediaBrowser.Controller.Entities.TV
return IndexNumber != null ? IndexNumber.Value.ToString("0000") : Name; return IndexNumber != null ? IndexNumber.Value.ToString("0000") : Name;
} }
public override bool RequiresRefresh()
{
var result = base.RequiresRefresh();
if (!result)
{
if (!IsVirtualItem.HasValue)
{
return true;
}
}
return result;
}
[IgnoreDataMember]
public bool? IsVirtualItem { get; set; }
[IgnoreDataMember] [IgnoreDataMember]
public bool IsMissingSeason public bool IsMissingSeason
{ {
get { return (IsVirtualItem ?? DetectIsVirtualItem()) && !IsUnaired; } get { return (IsVirtualItem) && !IsUnaired; }
} }
[IgnoreDataMember] [IgnoreDataMember]
public bool IsVirtualUnaired public bool IsVirtualUnaired
{ {
get { return (IsVirtualItem ?? DetectIsVirtualItem()) && IsUnaired; } get { return (IsVirtualItem) && IsUnaired; }
}
private bool DetectIsVirtualItem()
{
return LocationType == LocationType.Virtual && GetEpisodes().All(i => i.LocationType == LocationType.Virtual);
} }
[IgnoreDataMember] [IgnoreDataMember]

View File

@ -92,10 +92,7 @@ namespace MediaBrowser.Controller.Entities.TV
{ {
get get
{ {
return GetRecursiveChildren(i => i is Episode) return DateLastMediaAdded ?? DateTime.MinValue;
.Select(i => i.DateCreated)
.OrderByDescending(i => i)
.FirstOrDefault();
} }
} }
@ -240,6 +237,7 @@ namespace MediaBrowser.Controller.Entities.TV
AncestorWithPresentationUniqueKey = PresentationUniqueKey, AncestorWithPresentationUniqueKey = PresentationUniqueKey,
IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name }, IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name },
SortBy = new[] { ItemSortBy.SortName } SortBy = new[] { ItemSortBy.SortName }
}).ToList(); }).ToList();
var allSeriesEpisodes = allItems.OfType<Episode>().ToList(); var allSeriesEpisodes = allItems.OfType<Episode>().ToList();

View File

@ -428,7 +428,8 @@ namespace MediaBrowser.Providers.TV
Name = name, Name = name,
IndexNumber = episodeNumber, IndexNumber = episodeNumber,
ParentIndexNumber = seasonNumber, ParentIndexNumber = seasonNumber,
Id = _libraryManager.GetNewItemId((series.Id + seasonNumber.ToString(_usCulture) + name), typeof(Episode)) Id = _libraryManager.GetNewItemId((series.Id + seasonNumber.ToString(_usCulture) + name), typeof(Episode)),
IsVirtualItem = true
}; };
episode.SetParent(season); episode.SetParent(season);

View File

@ -1307,6 +1307,7 @@ namespace MediaBrowser.Server.Implementations.Channels
item.OfficialRating = info.OfficialRating; item.OfficialRating = info.OfficialRating;
item.DateCreated = info.DateCreated ?? DateTime.UtcNow; item.DateCreated = info.DateCreated ?? DateTime.UtcNow;
item.Tags = info.Tags; item.Tags = info.Tags;
item.HomePageUrl = info.HomePageUrl;
} }
var trailer = item as Trailer; var trailer = item as Trailer;

View File

@ -202,23 +202,7 @@ namespace MediaBrowser.Server.Implementations.Library
{ {
var user = _userManager.GetUserById(request.UserId); var user = _userManager.GetUserById(request.UserId);
var includeTypes = request.IncludeItemTypes; var libraryItems = GetItemsForLatestItems(user, request);
var currentUser = user;
var libraryItems = GetItemsForLatestItems(user, request.ParentId, includeTypes, request.Limit ?? 10).Where(i =>
{
if (request.IsPlayed.HasValue)
{
var val = request.IsPlayed.Value;
if (i is Video && i.IsPlayed(currentUser) != val)
{
return false;
}
}
return true;
});
var list = new List<Tuple<BaseItem, List<BaseItem>>>(); var list = new List<Tuple<BaseItem, List<BaseItem>>>();
@ -254,8 +238,13 @@ namespace MediaBrowser.Server.Implementations.Library
return list; return list;
} }
private IEnumerable<BaseItem> GetItemsForLatestItems(User user, string parentId, string[] includeItemTypes, int limit) private IEnumerable<BaseItem> GetItemsForLatestItems(User user, LatestItemsQuery request)
{ {
var parentId = request.ParentId;
var includeItemTypes = request.IncludeItemTypes;
var limit = request.Limit ?? 10;
var parentIds = string.IsNullOrEmpty(parentId) var parentIds = string.IsNullOrEmpty(parentId)
? new string[] { } ? new string[] { }
: new[] { parentId }; : new[] { parentId };
@ -276,7 +265,12 @@ namespace MediaBrowser.Server.Implementations.Library
var excludeItemTypes = includeItemTypes.Length == 0 ? new[] var excludeItemTypes = includeItemTypes.Length == 0 ? new[]
{ {
typeof(Person).Name, typeof(Studio).Name, typeof(Year).Name, typeof(GameGenre).Name, typeof(MusicGenre).Name, typeof(Genre).Name typeof(Person).Name,
typeof(Studio).Name,
typeof(Year).Name,
typeof(GameGenre).Name,
typeof(MusicGenre).Name,
typeof(Genre).Name
} : new string[] { }; } : new string[] { };
@ -288,8 +282,9 @@ namespace MediaBrowser.Server.Implementations.Library
IsFolder = includeItemTypes.Length == 0 ? false : (bool?)null, IsFolder = includeItemTypes.Length == 0 ? false : (bool?)null,
ExcludeItemTypes = excludeItemTypes, ExcludeItemTypes = excludeItemTypes,
ExcludeLocationTypes = new[] { LocationType.Virtual }, ExcludeLocationTypes = new[] { LocationType.Virtual },
Limit = limit * 20, Limit = limit * 5,
ExcludeSourceTypes = parentIds.Length == 0 ? new[] { SourceType.Channel, SourceType.LiveTV } : new SourceType[] { } ExcludeSourceTypes = parentIds.Length == 0 ? new[] { SourceType.Channel, SourceType.LiveTV } : new SourceType[] { },
IsPlayed = request.IsPlayed
}, parentIds); }, parentIds);
} }

View File

@ -952,7 +952,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
if (query.Limit.HasValue) if (query.Limit.HasValue)
{ {
internalQuery.Limit = Math.Max(query.Limit.Value * 5, 200); internalQuery.Limit = Math.Max(query.Limit.Value * 4, 200);
} }
if (query.HasAired.HasValue) if (query.HasAired.HasValue)

View File

@ -58,7 +58,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
private readonly string _criticReviewsPath; private readonly string _criticReviewsPath;
public const int LatestSchemaVersion = 89; public const int LatestSchemaVersion = 91;
private IDbConnection _connection;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="SqliteItemRepository"/> class. /// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
@ -88,9 +90,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
//AttachUserDataDb(connection); //AttachUserDataDb(connection);
//connection.RunQueries(new [] //connection.RunQueries(new[]
//{ //{
// "pragma locking_mode=EXCLUSIVE" // "pragma locking_mode=NORMAL"
//}, Logger); //}, Logger);
@ -105,6 +107,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
/// <returns>Task.</returns> /// <returns>Task.</returns>
public async Task Initialize(IDbConnector dbConnector) public async Task Initialize(IDbConnector dbConnector)
{ {
//_connection = await CreateConnection().ConfigureAwait(false);
using (var connection = await CreateConnection().ConfigureAwait(false)) using (var connection = await CreateConnection().ConfigureAwait(false))
{ {
var createMediaStreamsTableCommand var createMediaStreamsTableCommand
@ -115,7 +119,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
"create table if not exists TypedBaseItems (guid GUID primary key, type TEXT, data BLOB, ParentId GUID, Path TEXT)", "create table if not exists TypedBaseItems (guid GUID primary key, type TEXT, data BLOB, ParentId GUID, Path TEXT)",
"create index if not exists idx_PathTypedBaseItems on TypedBaseItems(Path)", "create index if not exists idx_PathTypedBaseItems on TypedBaseItems(Path)",
"create index if not exists idx_ParentIdTypedBaseItems on TypedBaseItems(ParentId)", "create index if not exists idx_ParentIdTypedBaseItems on TypedBaseItems(ParentId)",
"create index if not exists idx_TypedBaseItems2 on TypedBaseItems(Type,Guid)",
"create table if not exists AncestorIds (ItemId GUID, AncestorId GUID, AncestorIdText TEXT, PRIMARY KEY (ItemId, AncestorId))", "create table if not exists AncestorIds (ItemId GUID, AncestorId GUID, AncestorIdText TEXT, PRIMARY KEY (ItemId, AncestorId))",
"create index if not exists idx_AncestorIds1 on AncestorIds(AncestorId)", "create index if not exists idx_AncestorIds1 on AncestorIds(AncestorId)",
@ -234,9 +237,14 @@ namespace MediaBrowser.Server.Implementations.Persistence
string[] postQueries = string[] postQueries =
{ {
"create index if not exists idx_PresentationUniqueKey on TypedBaseItems(PresentationUniqueKey)", "create index if not exists idx_PresentationUniqueKey on TypedBaseItems(PresentationUniqueKey)",
"create index if not exists idx_GuidType on TypedBaseItems(Guid,Type)",
"create index if not exists idx_Type on TypedBaseItems(Type)", "create index if not exists idx_Type on TypedBaseItems(Type)",
"create index if not exists idx_TopParentId on TypedBaseItems(TopParentId)", "create index if not exists idx_TopParentId on TypedBaseItems(TopParentId)",
"create index if not exists idx_TypeTopParentId on TypedBaseItems(Type,TopParentId)" "create index if not exists idx_TypeTopParentId on TypedBaseItems(Type,TopParentId)",
"create index if not exists idx_TypeTopParentId2 on TypedBaseItems(TopParentId,MediaType,IsVirtualItem)",
"create index if not exists idx_TypeTopParentId3 on TypedBaseItems(TopParentId,IsFolder,IsVirtualItem)",
"create index if not exists idx_TypeTopParentId4 on TypedBaseItems(TopParentId,Type,IsVirtualItem)",
"create index if not exists idx_TypeTopParentId5 on TypedBaseItems(TopParentId,IsVirtualItem)"
}; };
connection.RunQueries(postQueries, Logger); connection.RunQueries(postQueries, Logger);
@ -727,15 +735,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
saveItemCommand.GetParameter(index++).Value = item.Album; saveItemCommand.GetParameter(index++).Value = item.Album;
var season = item as Season; saveItemCommand.GetParameter(index++).Value = item.IsVirtualItem || (!item.IsFolder && item.LocationType == LocationType.Virtual);
if (season != null && season.IsVirtualItem.HasValue)
{
saveItemCommand.GetParameter(index++).Value = season.IsVirtualItem.Value;
}
else
{
saveItemCommand.GetParameter(index++).Value = null;
}
var hasSeries = item as IHasSeries; var hasSeries = item as IHasSeries;
if (hasSeries != null) if (hasSeries != null)
@ -1167,10 +1167,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
item.CriticRatingSummary = reader.GetString(57); item.CriticRatingSummary = reader.GetString(57);
} }
var season = item as Season; if (!reader.IsDBNull(58))
if (season != null && !reader.IsDBNull(58))
{ {
season.IsVirtualItem = reader.GetBoolean(58); item.IsVirtualItem = reader.GetBoolean(58);
} }
return item; return item;
@ -1651,7 +1650,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
var slowThreshold = 1000; var slowThreshold = 1000;
#if DEBUG #if DEBUG
slowThreshold = 100; slowThreshold = 30;
#endif #endif
if (elapsed >= slowThreshold) if (elapsed >= slowThreshold)
@ -2196,18 +2195,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
cmd.Parameters.Add(cmd, "@IsFolder", DbType.Boolean).Value = query.IsFolder; cmd.Parameters.Add(cmd, "@IsFolder", DbType.Boolean).Value = query.IsFolder;
} }
var includeTypes = query.IncludeItemTypes.SelectMany(MapIncludeItemTypes).ToArray();
if (includeTypes.Length == 1)
{
whereClauses.Add("type=@type");
cmd.Parameters.Add(cmd, "@type", DbType.String).Value = includeTypes[0];
}
else if (includeTypes.Length > 1)
{
var inClause = string.Join(",", includeTypes.Select(i => "'" + i + "'").ToArray());
whereClauses.Add(string.Format("type in ({0})", inClause));
}
var excludeTypes = query.ExcludeItemTypes.SelectMany(MapIncludeItemTypes).ToArray(); var excludeTypes = query.ExcludeItemTypes.SelectMany(MapIncludeItemTypes).ToArray();
if (excludeTypes.Length == 1) if (excludeTypes.Length == 1)
{ {
@ -2220,6 +2207,18 @@ namespace MediaBrowser.Server.Implementations.Persistence
whereClauses.Add(string.Format("type not in ({0})", inClause)); whereClauses.Add(string.Format("type not in ({0})", inClause));
} }
var includeTypes = query.IncludeItemTypes.SelectMany(MapIncludeItemTypes).ToArray();
if (includeTypes.Length == 1)
{
whereClauses.Add("type=@type");
cmd.Parameters.Add(cmd, "@type", DbType.String).Value = includeTypes[0];
}
else if (includeTypes.Length > 1)
{
var inClause = string.Join(",", includeTypes.Select(i => "'" + i + "'").ToArray());
whereClauses.Add(string.Format("type in ({0})", inClause));
}
if (query.ChannelIds.Length == 1) if (query.ChannelIds.Length == 1)
{ {
whereClauses.Add("ChannelId=@ChannelId"); whereClauses.Add("ChannelId=@ChannelId");
@ -2634,10 +2633,17 @@ namespace MediaBrowser.Server.Implementations.Persistence
} }
if (query.LocationTypes.Length == 1) if (query.LocationTypes.Length == 1)
{
if (query.LocationTypes[0] == LocationType.Virtual && _config.Configuration.SchemaVersion >= 90)
{
query.IsVirtualItem = true;
}
else
{ {
whereClauses.Add("LocationType=@LocationType"); whereClauses.Add("LocationType=@LocationType");
cmd.Parameters.Add(cmd, "@LocationType", DbType.String).Value = query.LocationTypes[0].ToString(); cmd.Parameters.Add(cmd, "@LocationType", DbType.String).Value = query.LocationTypes[0].ToString();
} }
}
else if (query.LocationTypes.Length > 1) else if (query.LocationTypes.Length > 1)
{ {
var val = string.Join(",", query.LocationTypes.Select(i => "'" + i + "'").ToArray()); var val = string.Join(",", query.LocationTypes.Select(i => "'" + i + "'").ToArray());
@ -2645,16 +2651,28 @@ namespace MediaBrowser.Server.Implementations.Persistence
whereClauses.Add("LocationType in (" + val + ")"); whereClauses.Add("LocationType in (" + val + ")");
} }
if (query.ExcludeLocationTypes.Length == 1) if (query.ExcludeLocationTypes.Length == 1)
{
if (query.ExcludeLocationTypes[0] == LocationType.Virtual && _config.Configuration.SchemaVersion >= 90)
{
query.IsVirtualItem = false;
}
else
{ {
whereClauses.Add("LocationType<>@ExcludeLocationTypes"); whereClauses.Add("LocationType<>@ExcludeLocationTypes");
cmd.Parameters.Add(cmd, "@ExcludeLocationTypes", DbType.String).Value = query.ExcludeLocationTypes[0].ToString(); cmd.Parameters.Add(cmd, "@ExcludeLocationTypes", DbType.String).Value = query.ExcludeLocationTypes[0].ToString();
} }
}
else if (query.ExcludeLocationTypes.Length > 1) else if (query.ExcludeLocationTypes.Length > 1)
{ {
var val = string.Join(",", query.ExcludeLocationTypes.Select(i => "'" + i + "'").ToArray()); var val = string.Join(",", query.ExcludeLocationTypes.Select(i => "'" + i + "'").ToArray());
whereClauses.Add("LocationType not in (" + val + ")"); whereClauses.Add("LocationType not in (" + val + ")");
} }
if (query.IsVirtualItem.HasValue)
{
whereClauses.Add("IsVirtualItem=@IsVirtualItem");
cmd.Parameters.Add(cmd, "@IsVirtualItem", DbType.Boolean).Value = query.IsVirtualItem.Value;
}
if (query.MediaTypes.Length == 1) if (query.MediaTypes.Length == 1)
{ {
whereClauses.Add("MediaType=@MediaTypes"); whereClauses.Add("MediaType=@MediaTypes");