aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/Data/SqliteItemRepository.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Server.Implementations/Data/SqliteItemRepository.cs')
-rw-r--r--Emby.Server.Implementations/Data/SqliteItemRepository.cs652
1 files changed, 486 insertions, 166 deletions
diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs
index 451ec2dfe..3c4b50eda 100644
--- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs
+++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs
@@ -207,8 +207,6 @@ namespace Emby.Server.Implementations.Data
AddColumn(db, "TypedBaseItems", "DateCreated", "DATETIME", existingColumnNames);
AddColumn(db, "TypedBaseItems", "DateModified", "DATETIME", existingColumnNames);
- AddColumn(db, "TypedBaseItems", "ForcedSortName", "Text", existingColumnNames);
-
AddColumn(db, "TypedBaseItems", "IsSeries", "BIT", existingColumnNames);
AddColumn(db, "TypedBaseItems", "IsLive", "BIT", existingColumnNames);
AddColumn(db, "TypedBaseItems", "IsNews", "BIT", existingColumnNames);
@@ -241,7 +239,6 @@ namespace Emby.Server.Implementations.Data
AddColumn(db, "TypedBaseItems", "InheritedTags", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "CleanName", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "PresentationUniqueKey", "Text", existingColumnNames);
- AddColumn(db, "TypedBaseItems", "SlugName", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "OriginalTitle", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "PrimaryVersionId", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "DateLastMediaAdded", "DATETIME", existingColumnNames);
@@ -427,7 +424,7 @@ namespace Emby.Server.Implementations.Data
"OfficialRating",
"HomePageUrl",
"DisplayMediaType",
- "ForcedSortName",
+ "SortName",
"RunTimeTicks",
"VoteCount",
"DateCreated",
@@ -550,7 +547,6 @@ namespace Emby.Server.Implementations.Data
"DisplayMediaType",
"DateCreated",
"DateModified",
- "ForcedSortName",
"PreferredMetadataLanguage",
"PreferredMetadataCountryCode",
"IsHD",
@@ -573,7 +569,6 @@ namespace Emby.Server.Implementations.Data
"InheritedTags",
"CleanName",
"PresentationUniqueKey",
- "SlugName",
"OriginalTitle",
"PrimaryVersionId",
"DateLastMediaAdded",
@@ -828,8 +823,6 @@ namespace Emby.Server.Implementations.Data
saveItemStatement.TryBind("@DateCreated", item.DateCreated);
saveItemStatement.TryBind("@DateModified", item.DateModified);
- saveItemStatement.TryBind("@ForcedSortName", item.ForcedSortName);
-
saveItemStatement.TryBind("@PreferredMetadataLanguage", item.PreferredMetadataLanguage);
saveItemStatement.TryBind("@PreferredMetadataCountryCode", item.PreferredMetadataCountryCode);
saveItemStatement.TryBind("@IsHD", item.IsHD);
@@ -950,7 +943,6 @@ namespace Emby.Server.Implementations.Data
}
saveItemStatement.TryBind("@PresentationUniqueKey", item.PresentationUniqueKey);
- saveItemStatement.TryBind("@SlugName", item.SlugName);
saveItemStatement.TryBind("@OriginalTitle", item.OriginalTitle);
var video = item as Video;
@@ -1240,7 +1232,7 @@ namespace Emby.Server.Implementations.Data
foreach (var row in statement.ExecuteQuery())
{
- return GetItem(row);
+ return GetItem(row, new InternalItemsQuery());
}
}
@@ -1249,19 +1241,10 @@ namespace Emby.Server.Implementations.Data
}
}
- private BaseItem GetItem(IReadOnlyList<IResultSetValue> reader)
- {
- return GetItem(reader, new InternalItemsQuery());
- }
-
private bool TypeRequiresDeserialization(Type type)
{
if (_config.Configuration.SkipDeserializationForBasicTypes)
{
- if (type == typeof(Person))
- {
- return false;
- }
if (type == typeof(Channel))
{
return false;
@@ -1280,6 +1263,10 @@ namespace Emby.Server.Implementations.Data
}
}
+ if (type == typeof(Person))
+ {
+ return false;
+ }
if (type == typeof(MusicGenre))
{
return false;
@@ -1361,6 +1348,11 @@ namespace Emby.Server.Implementations.Data
private BaseItem GetItem(IReadOnlyList<IResultSetValue> reader, InternalItemsQuery query)
{
+ return GetItem(reader, query, HasProgramAttributes(query), HasEpisodeAttributes(query), HasStartDate(query), HasTrailerTypes(query), HasArtistFields(query), HasSeriesFields(query));
+ }
+
+ private BaseItem GetItem(IReadOnlyList<IResultSetValue> reader, InternalItemsQuery query, bool enableProgramAttributes, bool hasEpisodeAttributes, bool queryHasStartDate, bool hasTrailerTypes, bool hasArtistFields, bool hasSeriesFields)
+ {
var typeString = reader.GetString(0);
var type = _typeMapper.GetType(typeString);
@@ -1407,87 +1399,96 @@ namespace Emby.Server.Implementations.Data
return null;
}
- if (!reader.IsDBNull(2))
+ var index = 2;
+
+ if (queryHasStartDate)
{
- var hasStartDate = item as IHasStartDate;
- if (hasStartDate != null)
+ if (!reader.IsDBNull(index))
{
- hasStartDate.StartDate = reader[2].ReadDateTime();
+ var hasStartDate = item as IHasStartDate;
+ if (hasStartDate != null)
+ {
+ hasStartDate.StartDate = reader[index].ReadDateTime();
+ }
}
+ index++;
}
- if (!reader.IsDBNull(3))
+ if (!reader.IsDBNull(index))
{
- item.EndDate = reader[3].ReadDateTime();
+ item.EndDate = reader[index].ReadDateTime();
}
+ index++;
- if (!reader.IsDBNull(4))
+ if (!reader.IsDBNull(index))
{
- item.ChannelId = reader.GetString(4);
+ item.ChannelId = reader.GetString(index);
}
+ index++;
- var index = 5;
-
- var hasProgramAttributes = item as IHasProgramAttributes;
- if (hasProgramAttributes != null)
+ if (enableProgramAttributes)
{
- if (!reader.IsDBNull(index))
+ var hasProgramAttributes = item as IHasProgramAttributes;
+ if (hasProgramAttributes != null)
{
- hasProgramAttributes.IsMovie = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsMovie = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.IsSports = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsSports = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.IsKids = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsKids = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.IsSeries = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsSeries = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.IsLive = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsLive = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.IsNews = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsNews = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.IsPremiere = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsPremiere = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.EpisodeTitle = reader.GetString(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.EpisodeTitle = reader.GetString(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsRepeat = reader.GetBoolean(index);
+ }
+ index++;
+ }
+ else
{
- hasProgramAttributes.IsRepeat = reader.GetBoolean(index);
+ index += 9;
}
- index++;
- }
- else
- {
- index += 9;
}
if (!reader.IsDBNull(index))
@@ -1496,7 +1497,7 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (query.HasField(ItemFields.CustomRating))
+ if (HasField(query, ItemFields.CustomRating))
{
if (!reader.IsDBNull(index))
{
@@ -1511,7 +1512,7 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (query.HasField(ItemFields.Settings))
+ if (HasField(query, ItemFields.Settings))
{
if (!reader.IsDBNull(index))
{
@@ -1538,17 +1539,23 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (!reader.IsDBNull(index))
+ if (HasField(query, ItemFields.ExternalEtag))
{
- item.ExternalEtag = reader.GetString(index);
+ if (!reader.IsDBNull(index))
+ {
+ item.ExternalEtag = reader.GetString(index);
+ }
+ index++;
}
- index++;
- if (!reader.IsDBNull(index))
+ if (HasField(query, ItemFields.DateLastRefreshed))
{
- item.DateLastRefreshed = reader[index].ReadDateTime();
+ if (!reader.IsDBNull(index))
+ {
+ item.DateLastRefreshed = reader[index].ReadDateTime();
+ }
+ index++;
}
- index++;
if (!reader.IsDBNull(index))
{
@@ -1568,7 +1575,7 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (query.HasField(ItemFields.Overview))
+ if (HasField(query, ItemFields.Overview))
{
if (!reader.IsDBNull(index))
{
@@ -1595,7 +1602,7 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (query.HasField(ItemFields.HomePageUrl))
+ if (HasField(query, ItemFields.HomePageUrl))
{
if (!reader.IsDBNull(index))
{
@@ -1604,7 +1611,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.DisplayMediaType))
+ if (HasField(query, ItemFields.DisplayMediaType))
{
if (!reader.IsDBNull(index))
{
@@ -1613,11 +1620,11 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.SortName))
+ if (HasField(query, ItemFields.SortName))
{
if (!reader.IsDBNull(index))
{
- item.ForcedSortName = reader.GetString(index);
+ item.SortName = reader.GetString(index);
}
index++;
}
@@ -1628,7 +1635,7 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (query.HasField(ItemFields.VoteCount))
+ if (HasField(query, ItemFields.VoteCount))
{
if (!reader.IsDBNull(index))
{
@@ -1637,7 +1644,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.DateCreated))
+ if (HasField(query, ItemFields.DateCreated))
{
if (!reader.IsDBNull(index))
{
@@ -1655,7 +1662,7 @@ namespace Emby.Server.Implementations.Data
item.Id = reader.GetGuid(index);
index++;
- if (query.HasField(ItemFields.Genres))
+ if (HasField(query, ItemFields.Genres))
{
if (!reader.IsDBNull(index))
{
@@ -1690,13 +1697,16 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (!reader.IsDBNull(index))
+ if (HasField(query, ItemFields.DateLastSaved))
{
- item.DateLastSaved = reader[index].ReadDateTime();
+ if (!reader.IsDBNull(index))
+ {
+ item.DateLastSaved = reader[index].ReadDateTime();
+ }
+ index++;
}
- index++;
- if (query.HasField(ItemFields.Settings))
+ if (HasField(query, ItemFields.Settings))
{
if (!reader.IsDBNull(index))
{
@@ -1705,7 +1715,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.Studios))
+ if (HasField(query, ItemFields.Studios))
{
if (!reader.IsDBNull(index))
{
@@ -1714,7 +1724,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.Tags))
+ if (HasField(query, ItemFields.Tags))
{
if (!reader.IsDBNull(index))
{
@@ -1729,17 +1739,20 @@ namespace Emby.Server.Implementations.Data
}
index++;
- var trailer = item as Trailer;
- if (trailer != null)
+ if (hasTrailerTypes)
{
- if (!reader.IsDBNull(index))
+ var trailer = item as Trailer;
+ if (trailer != null)
{
- trailer.TrailerTypes = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => (TrailerType)Enum.Parse(typeof(TrailerType), i, true)).ToList();
+ if (!reader.IsDBNull(index))
+ {
+ trailer.TrailerTypes = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => (TrailerType)Enum.Parse(typeof(TrailerType), i, true)).ToList();
+ }
}
+ index++;
}
- index++;
- if (query.HasField(ItemFields.OriginalTitle))
+ if (HasField(query, ItemFields.OriginalTitle))
{
if (!reader.IsDBNull(index))
{
@@ -1758,7 +1771,7 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (query.HasField(ItemFields.DateLastMediaAdded))
+ if (HasField(query, ItemFields.DateLastMediaAdded))
{
var folder = item as Folder;
if (folder != null && !reader.IsDBNull(index))
@@ -1787,68 +1800,89 @@ namespace Emby.Server.Implementations.Data
index++;
var hasSeries = item as IHasSeries;
- if (hasSeries != null)
+ if (hasSeriesFields)
{
- if (!reader.IsDBNull(index))
+ if (hasSeries != null)
{
- hasSeries.SeriesName = reader.GetString(index);
+ if (!reader.IsDBNull(index))
+ {
+ hasSeries.SeriesName = reader.GetString(index);
+ }
}
+ index++;
}
- index++;
- var episode = item as Episode;
- if (episode != null)
+ if (hasEpisodeAttributes)
{
- if (!reader.IsDBNull(index))
+ var episode = item as Episode;
+ if (episode != null)
{
- episode.SeasonName = reader.GetString(index);
+ if (!reader.IsDBNull(index))
+ {
+ episode.SeasonName = reader.GetString(index);
+ }
+ index++;
+ if (!reader.IsDBNull(index))
+ {
+ episode.SeasonId = reader.GetGuid(index);
+ }
}
- index++;
- if (!reader.IsDBNull(index))
+ else
{
- episode.SeasonId = reader.GetGuid(index);
+ index++;
}
+ index++;
}
- else
+
+ if (hasSeriesFields)
{
+ if (hasSeries != null)
+ {
+ if (!reader.IsDBNull(index))
+ {
+ hasSeries.SeriesId = reader.GetGuid(index);
+ }
+ }
index++;
}
- index++;
- if (hasSeries != null)
+ if (HasField(query, ItemFields.PresentationUniqueKey))
{
if (!reader.IsDBNull(index))
{
- hasSeries.SeriesId = reader.GetGuid(index);
+ item.PresentationUniqueKey = reader.GetString(index);
}
+ index++;
}
- index++;
- if (!reader.IsDBNull(index))
+ if (HasField(query, ItemFields.InheritedParentalRatingValue))
{
- item.PresentationUniqueKey = reader.GetString(index);
+ if (!reader.IsDBNull(index))
+ {
+ item.InheritedParentalRatingValue = reader.GetInt32(index);
+ }
+ index++;
}
- index++;
- if (!reader.IsDBNull(index))
+ if (HasField(query, ItemFields.Tags))
{
- item.InheritedParentalRatingValue = reader.GetInt32(index);
- }
- index++;
-
- if (!reader.IsDBNull(index))
- {
- item.InheritedTags = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
+ if (!reader.IsDBNull(index))
+ {
+ item.InheritedTags = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
+ }
+ index++;
}
- index++;
- if (!reader.IsDBNull(index))
+ if (HasField(query, ItemFields.ExternalSeriesId))
{
- item.ExternalSeriesId = reader.GetString(index);
+ if (!reader.IsDBNull(index))
+ {
+ item.ExternalSeriesId = reader.GetString(index);
+ }
+ index++;
}
- index++;
- if (query.HasField(ItemFields.Taglines))
+ if (HasField(query, ItemFields.Taglines))
{
if (!reader.IsDBNull(index))
{
@@ -1857,7 +1891,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.Keywords))
+ if (HasField(query, ItemFields.Keywords))
{
if (!reader.IsDBNull(index))
{
@@ -1881,7 +1915,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.ProductionLocations))
+ if (HasField(query, ItemFields.ProductionLocations))
{
if (!reader.IsDBNull(index))
{
@@ -1890,7 +1924,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.ThemeSongIds))
+ if (HasField(query, ItemFields.ThemeSongIds))
{
if (!reader.IsDBNull(index))
{
@@ -1899,7 +1933,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.ThemeVideoIds))
+ if (HasField(query, ItemFields.ThemeVideoIds))
{
if (!reader.IsDBNull(index))
{
@@ -1920,19 +1954,22 @@ namespace Emby.Server.Implementations.Data
}
index++;
- var hasArtists = item as IHasArtist;
- if (hasArtists != null && !reader.IsDBNull(index))
+ if (hasArtistFields)
{
- hasArtists.Artists = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
- }
- index++;
+ var hasArtists = item as IHasArtist;
+ if (hasArtists != null && !reader.IsDBNull(index))
+ {
+ hasArtists.Artists = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
+ }
+ index++;
- var hasAlbumArtists = item as IHasAlbumArtist;
- if (hasAlbumArtists != null && !reader.IsDBNull(index))
- {
- hasAlbumArtists.AlbumArtists = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
+ var hasAlbumArtists = item as IHasAlbumArtist;
+ if (hasAlbumArtists != null && !reader.IsDBNull(index))
+ {
+ hasAlbumArtists.AlbumArtists = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
+ }
+ index++;
}
- index++;
if (!reader.IsDBNull(index))
{
@@ -1940,14 +1977,17 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (hasSeries != null)
+ if (HasField(query, ItemFields.SeriesPresentationUniqueKey))
{
- if (!reader.IsDBNull(index))
+ if (hasSeries != null)
{
- hasSeries.SeriesPresentationUniqueKey = reader.GetString(index);
+ if (!reader.IsDBNull(index))
+ {
+ hasSeries.SeriesPresentationUniqueKey = reader.GetString(index);
+ }
}
+ index++;
}
- index++;
return item;
}
@@ -2243,23 +2283,225 @@ namespace Emby.Server.Implementations.Data
}
if (field == ItemFields.SortName)
{
- return new[] { "ForcedSortName" };
+ return new[] { "SortName" };
}
if (field == ItemFields.Taglines)
{
return new[] { "Tagline" };
}
+ if (field == ItemFields.Tags)
+ {
+ return new[] { "Tags", "InheritedTags" };
+ }
return new[] { field.ToString() };
}
+ private bool HasField(InternalItemsQuery query, ItemFields name)
+ {
+ var fields = query.DtoOptions.Fields;
+
+ switch (name)
+ {
+ case ItemFields.HomePageUrl:
+ case ItemFields.Keywords:
+ case ItemFields.DisplayMediaType:
+ case ItemFields.VoteCount:
+ case ItemFields.CustomRating:
+ case ItemFields.ProductionLocations:
+ case ItemFields.Settings:
+ case ItemFields.OriginalTitle:
+ case ItemFields.Taglines:
+ case ItemFields.SortName:
+ case ItemFields.Studios:
+ case ItemFields.Tags:
+ case ItemFields.ThemeSongIds:
+ case ItemFields.ThemeVideoIds:
+ case ItemFields.DateCreated:
+ case ItemFields.Overview:
+ case ItemFields.Genres:
+ case ItemFields.DateLastMediaAdded:
+ case ItemFields.ExternalEtag:
+ case ItemFields.PresentationUniqueKey:
+ case ItemFields.InheritedParentalRatingValue:
+ case ItemFields.ExternalSeriesId:
+ case ItemFields.SeriesPresentationUniqueKey:
+ case ItemFields.DateLastRefreshed:
+ case ItemFields.DateLastSaved:
+ return fields.Contains(name);
+ case ItemFields.ServiceName:
+ return true;
+ default:
+ return true;
+ }
+ }
+
+ private bool HasProgramAttributes(InternalItemsQuery query)
+ {
+ var excludeParentTypes = new string[]
+ {
+ "Series",
+ "Season",
+ "MusicAlbum",
+ "MusicArtist",
+ "PhotoAlbum"
+ };
+
+ if (excludeParentTypes.Contains(query.ParentType ?? string.Empty, StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ if (query.IncludeItemTypes.Length == 0)
+ {
+ return true;
+ }
+
+ var types = new string[]
+ {
+ "Program",
+ "Recording",
+ "TvChannel",
+ "LiveTvAudioRecording",
+ "LiveTvVideoRecording",
+ "LiveTvProgram",
+ "LiveTvTvChannel"
+ };
+
+ return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase));
+ }
+
+ private bool HasStartDate(InternalItemsQuery query)
+ {
+ var excludeParentTypes = new string[]
+ {
+ "Series",
+ "Season",
+ "MusicAlbum",
+ "MusicArtist",
+ "PhotoAlbum"
+ };
+
+ if (excludeParentTypes.Contains(query.ParentType ?? string.Empty, StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ if (query.IncludeItemTypes.Length == 0)
+ {
+ return true;
+ }
+
+ var types = new string[]
+ {
+ "Program",
+ "Recording",
+ "LiveTvAudioRecording",
+ "LiveTvVideoRecording",
+ "LiveTvProgram"
+ };
+
+ return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase));
+ }
+
+ private bool HasEpisodeAttributes(InternalItemsQuery query)
+ {
+ if (query.IncludeItemTypes.Length == 0)
+ {
+ return true;
+ }
+
+ var types = new string[]
+ {
+ "Episode"
+ };
+
+ return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase));
+ }
+
+ private bool HasTrailerTypes(InternalItemsQuery query)
+ {
+ if (query.IncludeItemTypes.Length == 0)
+ {
+ return true;
+ }
+
+ var types = new string[]
+ {
+ "Trailer"
+ };
+
+ return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase));
+ }
+
+ private bool HasArtistFields(InternalItemsQuery query)
+ {
+ var excludeParentTypes = new string[]
+ {
+ "Series",
+ "Season",
+ "PhotoAlbum"
+ };
+
+ if (excludeParentTypes.Contains(query.ParentType ?? string.Empty, StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ if (query.IncludeItemTypes.Length == 0)
+ {
+ return true;
+ }
+
+ var types = new string[]
+ {
+ "Audio",
+ "MusicAlbum",
+ "MusicVideo",
+ "AudioBook",
+ "AudioPodcast",
+ "LiveTvAudioRecording",
+ "Recording"
+ };
+
+ return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase));
+ }
+
+ private bool HasSeriesFields(InternalItemsQuery query)
+ {
+ var excludeParentTypes = new string[]
+ {
+ "PhotoAlbum"
+ };
+
+ if (excludeParentTypes.Contains(query.ParentType ?? string.Empty, StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ if (query.IncludeItemTypes.Length == 0)
+ {
+ return true;
+ }
+
+ var types = new string[]
+ {
+ "Book",
+ "AudioBook",
+ "Episode",
+ "Season"
+ };
+
+ return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase));
+ }
+
private string[] GetFinalColumnsToSelect(InternalItemsQuery query, string[] startColumns)
{
var list = startColumns.ToList();
foreach (var field in allFields)
{
- if (!query.HasField(field))
+ if (!HasField(query, field))
{
foreach (var fieldToRemove in GetColumnNamesFromField(field).ToList())
{
@@ -2268,6 +2510,53 @@ namespace Emby.Server.Implementations.Data
}
}
+ if (!HasProgramAttributes(query))
+ {
+ list.Remove("IsKids");
+ list.Remove("IsMovie");
+ list.Remove("IsSports");
+ list.Remove("IsSeries");
+ list.Remove("IsLive");
+ list.Remove("IsNews");
+ list.Remove("IsPremiere");
+ list.Remove("EpisodeTitle");
+ list.Remove("IsRepeat");
+ }
+
+ if (!HasEpisodeAttributes(query))
+ {
+ list.Remove("SeasonName");
+ list.Remove("SeasonId");
+ }
+
+ if (!HasStartDate(query))
+ {
+ list.Remove("StartDate");
+ }
+
+ if (!HasTrailerTypes(query))
+ {
+ list.Remove("TrailerTypes");
+ }
+
+ if (!HasArtistFields(query))
+ {
+ list.Remove("AlbumArtists");
+ list.Remove("Artists");
+ }
+
+ if (!HasSeriesFields(query))
+ {
+ list.Remove("SeriesId");
+ list.Remove("SeriesName");
+ }
+
+ if (!HasEpisodeAttributes(query))
+ {
+ list.Remove("SeasonName");
+ list.Remove("SeasonId");
+ }
+
if (!query.DtoOptions.EnableImages)
{
list.Remove("Images");
@@ -2394,7 +2683,7 @@ namespace Emby.Server.Implementations.Data
query.Limit = query.Limit.Value + 4;
}
- var commandText = "select " + string.Join(",", GetFinalColumnsToSelect(query, new [] { "count(distinct PresentationUniqueKey)" })) + GetFromText();
+ var commandText = "select " + string.Join(",", GetFinalColumnsToSelect(query, new[] { "count(distinct PresentationUniqueKey)" })) + GetFromText();
commandText += GetJoinUserDataText(query);
var whereClauses = GetWhereClauses(query, null);
@@ -2499,9 +2788,16 @@ namespace Emby.Server.Implementations.Data
// Running this again will bind the params
GetWhereClauses(query, statement);
+ var hasEpisodeAttributes = HasEpisodeAttributes(query);
+ var hasProgramAttributes = HasProgramAttributes(query);
+ var hasStartDate = HasStartDate(query);
+ var hasTrailerTypes = HasTrailerTypes(query);
+ var hasArtistFields = HasArtistFields(query);
+ var hasSeriesFields = HasSeriesFields(query);
+
foreach (var row in statement.ExecuteQuery())
{
- var item = GetItem(row, query);
+ var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields);
if (item != null)
{
list.Add(item);
@@ -2701,9 +2997,16 @@ namespace Emby.Server.Implementations.Data
// Running this again will bind the params
GetWhereClauses(query, statement);
+ var hasEpisodeAttributes = HasEpisodeAttributes(query);
+ var hasProgramAttributes = HasProgramAttributes(query);
+ var hasStartDate = HasStartDate(query);
+ var hasTrailerTypes = HasTrailerTypes(query);
+ var hasArtistFields = HasArtistFields(query);
+ var hasSeriesFields = HasSeriesFields(query);
+
foreach (var row in statement.ExecuteQuery())
{
- var item = GetItem(row, query);
+ var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields);
if (item != null)
{
list.Add(item);
@@ -3471,6 +3774,15 @@ namespace Emby.Server.Implementations.Data
}
}
+ if (query.MinDateLastSavedForUser.HasValue)
+ {
+ whereClauses.Add("DateLastSaved>=@MinDateLastSaved");
+ if (statement != null)
+ {
+ statement.TryBind("@MinDateLastSaved", query.MinDateLastSavedForUser.Value);
+ }
+ }
+
//if (query.MinPlayers.HasValue)
//{
// whereClauses.Add("Players>=@MinPlayers");
@@ -3665,10 +3977,10 @@ namespace Emby.Server.Implementations.Data
if (!string.IsNullOrWhiteSpace(query.SlugName))
{
- whereClauses.Add("SlugName=@SlugName");
+ whereClauses.Add("CleanName=@SlugName");
if (statement != null)
{
- statement.TryBind("@SlugName", query.SlugName);
+ statement.TryBind("@SlugName", GetCleanValue(query.SlugName));
}
}
@@ -4919,7 +5231,9 @@ namespace Emby.Server.Implementations.Data
var columns = _retriveItemColumns.ToList();
columns.AddRange(itemCountColumns.Select(i => i.Item2).ToArray());
- var commandText = "select " + string.Join(",", GetFinalColumnsToSelect(query, columns.ToArray())) + GetFromText();
+ columns = GetFinalColumnsToSelect(query, columns.ToArray()).ToList();
+
+ var commandText = "select " + string.Join(",", columns.ToArray()) + GetFromText();
commandText += GetJoinUserDataText(query);
var innerQuery = new InternalItemsQuery(query.User)
@@ -4962,7 +5276,6 @@ namespace Emby.Server.Implementations.Data
NameLessThan = query.NameLessThan,
NameStartsWith = query.NameStartsWith,
NameStartsWithOrGreater = query.NameStartsWithOrGreater,
- AlbumArtistStartsWithOrGreater = query.AlbumArtistStartsWithOrGreater,
Tags = query.Tags,
OfficialRatings = query.OfficialRatings,
GenreIds = query.GenreIds,
@@ -5043,9 +5356,16 @@ namespace Emby.Server.Implementations.Data
GetWhereClauses(innerQuery, statement);
GetWhereClauses(outerQuery, statement);
+ var hasEpisodeAttributes = HasEpisodeAttributes(query);
+ var hasProgramAttributes = HasProgramAttributes(query);
+ var hasStartDate = HasStartDate(query);
+ var hasTrailerTypes = HasTrailerTypes(query);
+ var hasArtistFields = HasArtistFields(query);
+ var hasSeriesFields = HasSeriesFields(query);
+
foreach (var row in statement.ExecuteQuery())
{
- var item = GetItem(row);
+ var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields);
if (item != null)
{
var countStartColumn = columns.Count - 1;