|
@@ -160,8 +160,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
"create table if not exists UserDataKeys (ItemId GUID, UserDataKey TEXT Priority INT, PRIMARY KEY (ItemId, UserDataKey))",
|
|
|
|
|
|
"create table if not exists ItemValues (ItemId GUID, Type INT, Value TEXT, CleanValue TEXT)",
|
|
|
- //"create index if not exists idx_ItemValues on ItemValues(ItemId)",
|
|
|
- "create index if not exists idx_ItemValues2 on ItemValues(ItemId,Type)",
|
|
|
|
|
|
"create table if not exists ProviderIds (ItemId GUID, Name TEXT, Value TEXT, PRIMARY KEY (ItemId, Name))",
|
|
|
// covering index
|
|
@@ -321,6 +319,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
|
|
|
// items by name
|
|
|
"create index if not exists idx_ItemValues6 on ItemValues(ItemId,Type,CleanValue)",
|
|
|
+ "create index if not exists idx_ItemValues7 on ItemValues(Type,CleanValue,ItemId)",
|
|
|
|
|
|
// covering index
|
|
|
"create index if not exists idx_UserDataKeys3 on UserDataKeys(ItemId,Priority,UserDataKey)"
|
|
@@ -1776,9 +1775,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
return string.Empty;
|
|
|
}
|
|
|
|
|
|
- private string GetFromText()
|
|
|
+ private string GetFromText(string alias = "A")
|
|
|
{
|
|
|
- return " from TypedBaseItems A";
|
|
|
+ return " from TypedBaseItems " + alias;
|
|
|
}
|
|
|
|
|
|
public List<BaseItem> GetItemList(InternalItemsQuery query)
|
|
@@ -3661,19 +3660,14 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
|
|
|
var typesToCount = query.IncludeItemTypes.ToList();
|
|
|
|
|
|
- if (typesToCount.Count == 0)
|
|
|
- {
|
|
|
- //typesToCount.Add("Item");
|
|
|
- }
|
|
|
-
|
|
|
- foreach (var type in typesToCount)
|
|
|
+ if (typesToCount.Count > 0)
|
|
|
{
|
|
|
- var itemCountColumnQuery = "Select Count(CleanValue) from ItemValues where ItemValues.CleanValue=CleanName AND Type=@ItemValueType AND ItemId in (";
|
|
|
- itemCountColumnQuery += "select guid" + GetFromText();
|
|
|
+ var itemCountColumnQuery = "select group_concat(type, '|')" + GetFromText("B");
|
|
|
|
|
|
var typeSubQuery = new InternalItemsQuery(query.User)
|
|
|
{
|
|
|
ExcludeItemTypes = query.ExcludeItemTypes,
|
|
|
+ IncludeItemTypes = query.IncludeItemTypes,
|
|
|
MediaTypes = query.MediaTypes,
|
|
|
AncestorIds = query.AncestorIds,
|
|
|
ExcludeItemIds = query.ExcludeItemIds,
|
|
@@ -3682,15 +3676,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
ParentId = query.ParentId,
|
|
|
IsPlayed = query.IsPlayed
|
|
|
};
|
|
|
- if (string.Equals(type, "Item", StringComparison.OrdinalIgnoreCase))
|
|
|
- {
|
|
|
- typeSubQuery.IncludeItemTypes = query.IncludeItemTypes;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- typeSubQuery.IncludeItemTypes = new[] { type };
|
|
|
- }
|
|
|
- var whereClauses = GetWhereClauses(typeSubQuery, cmd, type);
|
|
|
+ var whereClauses = GetWhereClauses(typeSubQuery, cmd, "itemTypes");
|
|
|
+
|
|
|
+ whereClauses.Add("guid in (select ItemId from ItemValues where ItemValues.CleanValue=A.CleanName AND Type=@ItemValueType)");
|
|
|
|
|
|
var typeWhereText = whereClauses.Count == 0 ?
|
|
|
string.Empty :
|
|
@@ -3698,11 +3686,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
|
|
|
itemCountColumnQuery += typeWhereText;
|
|
|
|
|
|
- itemCountColumnQuery += ")";
|
|
|
+ //itemCountColumnQuery += ")";
|
|
|
|
|
|
- var columnName = type + "Count";
|
|
|
-
|
|
|
- itemCountColumns.Add(new Tuple<string, string>(columnName, "(" + itemCountColumnQuery + ") as " + columnName));
|
|
|
+ itemCountColumns.Add(new Tuple<string, string>("itemTypes", "(" + itemCountColumnQuery + ") as itemTypes"));
|
|
|
}
|
|
|
|
|
|
var columns = _retriveItemColumns.ToList();
|
|
@@ -3731,7 +3717,15 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
" where " + string.Join(" AND ", innerWhereClauses.ToArray());
|
|
|
|
|
|
var whereText = " where Type=@SelectType";
|
|
|
- whereText += " And CleanName In (Select CleanValue from ItemValues where Type=@ItemValueType AND ItemId in (select guid from TypedBaseItems" + innerWhereText + "))";
|
|
|
+
|
|
|
+ if (typesToCount.Count == 0)
|
|
|
+ {
|
|
|
+ whereText += " And CleanName In (Select CleanValue from ItemValues where Type=@ItemValueType AND ItemId in (select guid from TypedBaseItems" + innerWhereText + "))";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ whereText += " And itemTypes not null";
|
|
|
+ }
|
|
|
|
|
|
var outerQuery = new InternalItemsQuery(query.User)
|
|
|
{
|
|
@@ -3812,6 +3806,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
? (CommandBehavior.SequentialAccess | CommandBehavior.SingleResult)
|
|
|
: CommandBehavior.SequentialAccess;
|
|
|
|
|
|
+ //Logger.Debug("GetItemValues: " + cmd.CommandText);
|
|
|
+
|
|
|
using (var reader = cmd.ExecuteReader(commandBehavior))
|
|
|
{
|
|
|
LogQueryTime("GetItemValues", cmd, now);
|
|
@@ -3830,7 +3826,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
var item = GetItem(reader);
|
|
|
if (item != null)
|
|
|
{
|
|
|
- var countStartColumn = columns.Count - typesToCount.Count;
|
|
|
+ var countStartColumn = columns.Count - 1;
|
|
|
|
|
|
list.Add(new Tuple<BaseItem, ItemCounts>(item, GetItemCounts(reader, countStartColumn, typesToCount)));
|
|
|
}
|
|
@@ -3861,35 +3857,54 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|
|
{
|
|
|
var counts = new ItemCounts();
|
|
|
|
|
|
- for (var i = 0; i < typesToCount.Count; i++)
|
|
|
+ if (typesToCount.Count == 0)
|
|
|
+ {
|
|
|
+ return counts;
|
|
|
+ }
|
|
|
+
|
|
|
+ var typeString = reader.IsDBNull(countStartColumn) ? null : reader.GetString(countStartColumn);
|
|
|
+
|
|
|
+ if (string.IsNullOrWhiteSpace(typeString))
|
|
|
{
|
|
|
- var value = reader.GetInt32(countStartColumn + i);
|
|
|
+ return counts;
|
|
|
+ }
|
|
|
|
|
|
- var type = typesToCount[i];
|
|
|
- if (string.Equals(type, "Series", StringComparison.OrdinalIgnoreCase))
|
|
|
+ var allTypes = typeString.Split(new[] {'|'}, StringSplitOptions.RemoveEmptyEntries)
|
|
|
+ .ToLookup(i => i).ToList();
|
|
|
+
|
|
|
+ foreach (var type in allTypes)
|
|
|
+ {
|
|
|
+ var value = type.ToList().Count;
|
|
|
+ var typeName = type.Key;
|
|
|
+
|
|
|
+ if (string.Equals(typeName, typeof(Series).FullName, StringComparison.OrdinalIgnoreCase))
|
|
|
{
|
|
|
counts.SeriesCount = value;
|
|
|
}
|
|
|
- else if (string.Equals(type, "Episode", StringComparison.OrdinalIgnoreCase))
|
|
|
+ else if (string.Equals(typeName, typeof(Episode).FullName, StringComparison.OrdinalIgnoreCase))
|
|
|
{
|
|
|
counts.EpisodeCount = value;
|
|
|
}
|
|
|
- else if (string.Equals(type, "Movie", StringComparison.OrdinalIgnoreCase))
|
|
|
+ else if (string.Equals(typeName, typeof(Movie).FullName, StringComparison.OrdinalIgnoreCase))
|
|
|
{
|
|
|
counts.MovieCount = value;
|
|
|
}
|
|
|
- else if (string.Equals(type, "MusicAlbum", StringComparison.OrdinalIgnoreCase))
|
|
|
+ else if (string.Equals(typeName, typeof(MusicAlbum).FullName, StringComparison.OrdinalIgnoreCase))
|
|
|
{
|
|
|
counts.AlbumCount = value;
|
|
|
}
|
|
|
- else if (string.Equals(type, "Audio", StringComparison.OrdinalIgnoreCase))
|
|
|
+ else if (string.Equals(typeName, typeof(Audio).FullName, StringComparison.OrdinalIgnoreCase))
|
|
|
{
|
|
|
counts.SongCount = value;
|
|
|
}
|
|
|
- else if (string.Equals(type, "Game", StringComparison.OrdinalIgnoreCase))
|
|
|
+ else if (string.Equals(typeName, typeof(Game).FullName, StringComparison.OrdinalIgnoreCase))
|
|
|
{
|
|
|
counts.GameCount = value;
|
|
|
}
|
|
|
+ else if (string.Equals(typeName, typeof(Trailer).FullName, StringComparison.OrdinalIgnoreCase))
|
|
|
+ {
|
|
|
+ counts.TrailerCount = value;
|
|
|
+ }
|
|
|
counts.ItemCount += value;
|
|
|
}
|
|
|
|