|  | @@ -87,9 +87,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
 | 
	
		
			
				|  |  |          private IDbCommand _deleteAncestorsCommand;
 | 
	
		
			
				|  |  |          private IDbCommand _saveAncestorCommand;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private IDbCommand _deleteUserDataKeysCommand;
 | 
	
		
			
				|  |  | -        private IDbCommand _saveUserDataKeysCommand;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          private IDbCommand _deleteItemValuesCommand;
 | 
	
		
			
				|  |  |          private IDbCommand _saveItemValuesCommand;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -169,8 +166,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
 | 
	
		
			
				|  |  |                                  "create index if not exists idx_AncestorIds1 on AncestorIds(AncestorId)",
 | 
	
		
			
				|  |  |                                  "create index if not exists idx_AncestorIds2 on AncestorIds(AncestorIdText)",
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                                "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 table if not exists ProviderIds (ItemId GUID, Name TEXT, Value TEXT, PRIMARY KEY (ItemId, Name))",
 | 
	
	
		
			
				|  | @@ -192,6 +187,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                                  "create index if not exists idx_mediastreams1 on mediastreams(ItemId)",
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +                                //"drop table if exists UserDataKeys"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                                 };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              _connection.RunQueries(queries, Logger);
 | 
	
	
		
			
				|  | @@ -289,7 +286,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
 | 
	
		
			
				|  |  |              _connection.AddColumn(Logger, "TypedBaseItems", "ThemeSongIds", "Text");
 | 
	
		
			
				|  |  |              _connection.AddColumn(Logger, "TypedBaseItems", "ThemeVideoIds", "Text");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            _connection.AddColumn(Logger, "UserDataKeys", "Priority", "INT");
 | 
	
		
			
				|  |  |              _connection.AddColumn(Logger, "ItemValues", "CleanValue", "Text");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              _connection.AddColumn(Logger, ChaptersTableName, "ImageDateModified", "DATETIME");
 | 
	
	
		
			
				|  | @@ -316,6 +312,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
 | 
	
		
			
				|  |  |                  "drop index if exists idx_ItemValues3",
 | 
	
		
			
				|  |  |                  "drop index if exists idx_ItemValues4",
 | 
	
		
			
				|  |  |                  "drop index if exists idx_ItemValues5",
 | 
	
		
			
				|  |  | +                "drop index if exists idx_UserDataKeys3",
 | 
	
		
			
				|  |  | +                "drop table if exists UserDataKeys",
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  "create index if not exists idx_PathTypedBaseItems on TypedBaseItems(Path)",
 | 
	
		
			
				|  |  |                  "create index if not exists idx_ParentIdTypedBaseItems on TypedBaseItems(ParentId)",
 | 
	
	
		
			
				|  | @@ -347,10 +345,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)"
 | 
	
		
			
				|  |  | +                "create index if not exists idx_ItemValues7 on ItemValues(Type,CleanValue,ItemId)"
 | 
	
		
			
				|  |  |                  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              _connection.RunQueries(postQueries, Logger);
 | 
	
	
		
			
				|  | @@ -653,17 +648,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
 | 
	
		
			
				|  |  |              _updateInheritedTagsCommand.Parameters.Add(_updateInheritedTagsCommand, "@Guid");
 | 
	
		
			
				|  |  |              _updateInheritedTagsCommand.Parameters.Add(_updateInheritedTagsCommand, "@InheritedTags");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            // user data
 | 
	
		
			
				|  |  | -            _deleteUserDataKeysCommand = _connection.CreateCommand();
 | 
	
		
			
				|  |  | -            _deleteUserDataKeysCommand.CommandText = "delete from UserDataKeys where ItemId=@Id";
 | 
	
		
			
				|  |  | -            _deleteUserDataKeysCommand.Parameters.Add(_deleteUserDataKeysCommand, "@Id");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            _saveUserDataKeysCommand = _connection.CreateCommand();
 | 
	
		
			
				|  |  | -            _saveUserDataKeysCommand.CommandText = "insert into UserDataKeys (ItemId, UserDataKey, Priority) values (@ItemId, @UserDataKey, @Priority)";
 | 
	
		
			
				|  |  | -            _saveUserDataKeysCommand.Parameters.Add(_saveUserDataKeysCommand, "@ItemId");
 | 
	
		
			
				|  |  | -            _saveUserDataKeysCommand.Parameters.Add(_saveUserDataKeysCommand, "@UserDataKey");
 | 
	
		
			
				|  |  | -            _saveUserDataKeysCommand.Parameters.Add(_saveUserDataKeysCommand, "@Priority");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              // item values
 | 
	
		
			
				|  |  |              _deleteItemValuesCommand = _connection.CreateCommand();
 | 
	
		
			
				|  |  |              _deleteItemValuesCommand.CommandText = "delete from ItemValues where ItemId=@Id";
 | 
	
	
		
			
				|  | @@ -1071,7 +1055,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
 | 
	
		
			
				|  |  |                          UpdateAncestors(item.Id, item.GetAncestorIds().Distinct().ToList(), transaction);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                    UpdateUserDataKeys(item.Id, item.GetUserDataKeys().Distinct(StringComparer.OrdinalIgnoreCase).ToList(), transaction);
 | 
	
		
			
				|  |  |                      UpdateImages(item.Id, item.ImageInfos, transaction);
 | 
	
		
			
				|  |  |                      UpdateProviderIds(item.Id, item.ProviderIds, transaction);
 | 
	
		
			
				|  |  |                      UpdateItemValues(item.Id, GetItemValuesToSave(item), transaction);
 | 
	
	
		
			
				|  | @@ -2343,12 +2326,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
 | 
	
		
			
				|  |  |                  return string.Empty;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            if (_config.Configuration.SchemaVersion >= 96)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                return " left join UserDataDb.UserData on UserDataKey=UserDataDb.UserData.Key And (UserId=@UserId)";
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            return " left join UserDataDb.UserData on (select UserDataKey from UserDataKeys where ItemId=Guid order by Priority LIMIT 1)=UserDataDb.UserData.Key And (UserId=@UserId)";
 | 
	
		
			
				|  |  | +            return " left join UserDataDb.UserData on UserDataKey=UserDataDb.UserData.Key And (UserId=@UserId)";
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          private string GetGroupBy(InternalItemsQuery query)
 | 
	
	
		
			
				|  | @@ -4176,11 +4154,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
 | 
	
		
			
				|  |  |                  _deleteAncestorsCommand.Transaction = transaction;
 | 
	
		
			
				|  |  |                  _deleteAncestorsCommand.ExecuteNonQuery();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                // Delete user data keys
 | 
	
		
			
				|  |  | -                _deleteUserDataKeysCommand.GetParameter(0).Value = id;
 | 
	
		
			
				|  |  | -                _deleteUserDataKeysCommand.Transaction = transaction;
 | 
	
		
			
				|  |  | -                _deleteUserDataKeysCommand.ExecuteNonQuery();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |                  // Delete item values
 | 
	
		
			
				|  |  |                  _deleteItemValuesCommand.GetParameter(0).Value = id;
 | 
	
		
			
				|  |  |                  _deleteItemValuesCommand.Transaction = transaction;
 | 
	
	
		
			
				|  | @@ -4949,39 +4922,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private void UpdateUserDataKeys(Guid itemId, List<string> keys, IDbTransaction transaction)
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -            if (itemId == Guid.Empty)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                throw new ArgumentNullException("itemId");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if (keys == null)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                throw new ArgumentNullException("keys");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            CheckDisposed();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            // First delete 
 | 
	
		
			
				|  |  | -            _deleteUserDataKeysCommand.GetParameter(0).Value = itemId;
 | 
	
		
			
				|  |  | -            _deleteUserDataKeysCommand.Transaction = transaction;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            _deleteUserDataKeysCommand.ExecuteNonQuery();
 | 
	
		
			
				|  |  | -            var index = 0;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            foreach (var key in keys)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                _saveUserDataKeysCommand.GetParameter(0).Value = itemId;
 | 
	
		
			
				|  |  | -                _saveUserDataKeysCommand.GetParameter(1).Value = key;
 | 
	
		
			
				|  |  | -                _saveUserDataKeysCommand.GetParameter(2).Value = index;
 | 
	
		
			
				|  |  | -                index++;
 | 
	
		
			
				|  |  | -                _saveUserDataKeysCommand.Transaction = transaction;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                _saveUserDataKeysCommand.ExecuteNonQuery();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          public async Task UpdatePeople(Guid itemId, List<PersonInfo> people)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              if (itemId == Guid.Empty)
 |