From 26036837dd0c865a6ac3742717dc3d77ec33cf8e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 4 Jul 2016 16:11:30 -0400 Subject: [PATCH] denormalize series fields --- MediaBrowser.Api/Images/ImageService.cs | 8 ++-- MediaBrowser.Api/StartupWizardService.cs | 2 +- MediaBrowser.Controller/Entities/Book.cs | 6 +++ .../Entities/IHasSeries.cs | 4 +- .../Entities/TV/Episode.cs | 32 +++++++++------ MediaBrowser.Controller/Entities/TV/Season.cs | 11 +++-- .../Dto/DtoService.cs | 36 ++++++----------- .../Persistence/SqliteItemRepository.cs | 40 +++++++++++++++++-- 8 files changed, 89 insertions(+), 50 deletions(-) diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index a511f8c728..a549c44bc1 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -273,7 +273,9 @@ namespace MediaBrowser.Api.Images { var list = new List(); - foreach (var image in item.ImageInfos.Where(i => !item.AllowsMultipleImages(i.Type))) + var itemImages = item.ImageInfos; + + foreach (var image in itemImages.Where(i => !item.AllowsMultipleImages(i.Type))) { var info = GetImageInfo(item, image, null); @@ -283,14 +285,14 @@ namespace MediaBrowser.Api.Images } } - foreach (var imageType in item.ImageInfos.Select(i => i.Type).Distinct().Where(item.AllowsMultipleImages)) + foreach (var imageType in itemImages.Select(i => i.Type).Distinct().Where(item.AllowsMultipleImages)) { var index = 0; // Prevent implicitly captured closure var currentImageType = imageType; - foreach (var image in item.ImageInfos.Where(i => i.Type == currentImageType)) + foreach (var image in itemImages.Where(i => i.Type == currentImageType)) { var info = GetImageInfo(item, image, index); diff --git a/MediaBrowser.Api/StartupWizardService.cs b/MediaBrowser.Api/StartupWizardService.cs index 40bf4a2ac4..7cdc3b6a2e 100644 --- a/MediaBrowser.Api/StartupWizardService.cs +++ b/MediaBrowser.Api/StartupWizardService.cs @@ -117,7 +117,7 @@ namespace MediaBrowser.Api config.EnableStandaloneMusicKeys = true; config.EnableCaseSensitiveItemIds = true; //config.EnableFolderView = true; - config.SchemaVersion = 97; + config.SchemaVersion = 99; } public void Post(UpdateStartupConfiguration request) diff --git a/MediaBrowser.Controller/Entities/Book.cs b/MediaBrowser.Controller/Entities/Book.cs index 96fad670e1..76f54edea9 100644 --- a/MediaBrowser.Controller/Entities/Book.cs +++ b/MediaBrowser.Controller/Entities/Book.cs @@ -17,8 +17,14 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] public string SeriesName { get; set; } + public string FindSeriesName() + { + return SeriesName; + } + public override bool CanDownload() { var locationType = LocationType; diff --git a/MediaBrowser.Controller/Entities/IHasSeries.cs b/MediaBrowser.Controller/Entities/IHasSeries.cs index 64c33a3766..1a262ed283 100644 --- a/MediaBrowser.Controller/Entities/IHasSeries.cs +++ b/MediaBrowser.Controller/Entities/IHasSeries.cs @@ -7,6 +7,8 @@ namespace MediaBrowser.Controller.Entities /// Gets the name of the series. /// /// The name of the series. - string SeriesName { get; } + string SeriesName { get; set; } + + string FindSeriesName(); } } diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs index 2dc459239d..d7526a535f 100644 --- a/MediaBrowser.Controller/Entities/TV/Episode.cs +++ b/MediaBrowser.Controller/Entities/TV/Episode.cs @@ -25,11 +25,11 @@ namespace MediaBrowser.Controller.Entities.TV public List RemoteTrailerIds { get; set; } public List RemoteTrailers { get; set; } - /// - /// Gets the season in which it aired. - /// - /// The aired season. - public int? AirsBeforeSeasonNumber { get; set; } + /// + /// Gets the season in which it aired. + /// + /// The aired season. + public int? AirsBeforeSeasonNumber { get; set; } public int? AirsAfterSeasonNumber { get; set; } public int? AirsBeforeEpisodeNumber { get; set; } @@ -166,13 +166,21 @@ namespace MediaBrowser.Controller.Entities.TV } [IgnoreDataMember] - public string SeriesName - { - get - { - var series = Series; - return series == null ? null : series.Name; - } + public string SeriesName { get; set; } + + [IgnoreDataMember] + public string SeasonName { get; set; } + + public string FindSeasonName() + { + var season = Season; + return season == null ? SeasonName : season.Name; + } + + public string FindSeriesName() + { + var series = Series; + return series == null ? SeriesName : series.Name; } /// diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index 9a90148443..a689ca5508 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -235,13 +235,12 @@ namespace MediaBrowser.Controller.Entities.TV } [IgnoreDataMember] - public string SeriesName + public string SeriesName { get; set; } + + public string FindSeriesName() { - get - { - var series = Series; - return series == null ? null : series.Name; - } + var series = Series; + return series == null ? SeriesName : series.Name; } /// diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 8805d567ab..67ae24f3e3 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -1076,15 +1076,11 @@ namespace MediaBrowser.Server.Implementations.Dto dto.PreferredMetadataCountryCode = item.PreferredMetadataCountryCode; dto.PreferredMetadataLanguage = item.PreferredMetadataLanguage; - var hasCriticRating = item as IHasCriticRating; - if (hasCriticRating != null) - { - dto.CriticRating = hasCriticRating.CriticRating; + dto.CriticRating = item.CriticRating; - if (fields.Contains(ItemFields.CriticRatingSummary)) - { - dto.CriticRatingSummary = hasCriticRating.CriticRatingSummary; - } + if (fields.Contains(ItemFields.CriticRatingSummary)) + { + dto.CriticRatingSummary = item.CriticRatingSummary; } var hasTrailers = item as IHasTrailers; @@ -1127,11 +1123,7 @@ namespace MediaBrowser.Server.Implementations.Dto if (fields.Contains(ItemFields.ShortOverview)) { - var hasShortOverview = item as IHasShortOverview; - if (hasShortOverview != null) - { - dto.ShortOverview = hasShortOverview.ShortOverview; - } + dto.ShortOverview = item.ShortOverview; } // If there are no backdrops, indicate what parent has them in case the Ui wants to allow inheritance @@ -1426,14 +1418,7 @@ namespace MediaBrowser.Server.Implementations.Dto dto.SeasonId = seasonId.Value.ToString("N"); } - var episodeSeason = episode.Season; - if (episodeSeason != null) - { - if (fields.Contains(ItemFields.SeasonName)) - { - dto.SeasonName = episodeSeason.Name; - } - } + dto.SeasonName = episode.SeasonName; var episodeSeries = episode.Series; @@ -1483,14 +1468,19 @@ namespace MediaBrowser.Server.Implementations.Dto var season = item as Season; if (season != null) { + dto.SeriesName = season.SeriesName; + series = season.Series; if (series != null) { dto.SeriesId = GetDtoId(series); - dto.SeriesName = series.Name; dto.AirTime = series.AirTime; - dto.SeriesStudio = series.Studios.FirstOrDefault(); + + if (fields.Contains(ItemFields.SeriesStudio)) + { + dto.SeriesStudio = series.Studios.FirstOrDefault(); + } if (options.GetImageLimit(ImageType.Primary) > 0) { diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index 5b492c240e..0416474395 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -95,7 +95,7 @@ namespace MediaBrowser.Server.Implementations.Persistence private IDbCommand _updateInheritedRatingCommand; private IDbCommand _updateInheritedTagsCommand; - public const int LatestSchemaVersion = 97; + public const int LatestSchemaVersion = 99; /// /// Initializes a new instance of the class. @@ -271,6 +271,7 @@ namespace MediaBrowser.Server.Implementations.Persistence _connection.AddColumn(Logger, "TypedBaseItems", "IsVirtualItem", "BIT"); _connection.AddColumn(Logger, "TypedBaseItems", "SeriesName", "Text"); _connection.AddColumn(Logger, "TypedBaseItems", "UserDataKey", "Text"); + _connection.AddColumn(Logger, "TypedBaseItems", "SeasonName", "Text"); _connection.AddColumn(Logger, "UserDataKeys", "Priority", "INT"); _connection.AddColumn(Logger, "ItemValues", "CleanValue", "Text"); @@ -402,7 +403,9 @@ namespace MediaBrowser.Server.Implementations.Persistence "Album", "CriticRating", "CriticRatingSummary", - "IsVirtualItem" + "IsVirtualItem", + "SeriesName", + "SeasonName" }; private readonly string[] _mediaStreamSaveColumns = @@ -522,7 +525,8 @@ namespace MediaBrowser.Server.Implementations.Persistence "Album", "IsVirtualItem", "SeriesName", - "UserDataKey" + "UserDataKey", + "SeasonName" }; _saveItemCommand = _connection.CreateCommand(); _saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values ("; @@ -944,7 +948,7 @@ namespace MediaBrowser.Server.Implementations.Persistence var hasSeries = item as IHasSeries; if (hasSeries != null) { - _saveItemCommand.GetParameter(index++).Value = hasSeries.SeriesName; + _saveItemCommand.GetParameter(index++).Value = hasSeries.FindSeriesName(); } else { @@ -953,6 +957,16 @@ namespace MediaBrowser.Server.Implementations.Persistence _saveItemCommand.GetParameter(index++).Value = item.GetUserDataKeys().FirstOrDefault(); + var episode = item as Episode; + if (episode != null) + { + _saveItemCommand.GetParameter(index++).Value = episode.FindSeasonName(); + } + else + { + _saveItemCommand.GetParameter(index++).Value = null; + } + _saveItemCommand.Transaction = transaction; _saveItemCommand.ExecuteNonQuery(); @@ -1375,6 +1389,24 @@ namespace MediaBrowser.Server.Implementations.Persistence item.IsVirtualItem = reader.GetBoolean(58); } + var hasSeries = item as IHasSeries; + if (hasSeries != null) + { + if (!reader.IsDBNull(59)) + { + hasSeries.SeriesName = reader.GetString(59); + } + } + + var episode = item as Episode; + if (episode != null) + { + if (!reader.IsDBNull(60)) + { + episode.SeasonName = reader.GetString(60); + } + } + return item; }