fix block by inherited tags

This commit is contained in:
Luke Pulverenti 2016-04-14 22:39:39 -04:00
parent 57e3bb72f9
commit 7f2b2e1b9a
3 changed files with 144 additions and 7 deletions

View File

@ -1348,6 +1348,24 @@ namespace MediaBrowser.Controller.Entities
return LocalizationManager.GetRatingLevel(rating); return LocalizationManager.GetRatingLevel(rating);
} }
public List<string> GetInheritedTags()
{
var list = new List<string>();
list.AddRange(Tags);
foreach (var parent in GetParents())
{
list.AddRange(parent.Tags);
}
foreach (var parent in LibraryManager.GetCollectionFolders(this))
{
list.AddRange(parent.Tags);
}
return list.Distinct(StringComparer.OrdinalIgnoreCase).ToList();
}
private bool IsVisibleViaTags(User user) private bool IsVisibleViaTags(User user)
{ {
var hasTags = this as IHasTags; var hasTags = this as IHasTags;

View File

@ -33,6 +33,7 @@ namespace MediaBrowser.Controller.Entities
public string[] IncludeItemTypes { get; set; } public string[] IncludeItemTypes { get; set; }
public string[] ExcludeItemTypes { get; set; } public string[] ExcludeItemTypes { get; set; }
public string[] ExcludeTags { get; set; } public string[] ExcludeTags { get; set; }
public string[] ExcludeInheritedTags { get; set; }
public string[] Genres { get; set; } public string[] Genres { get; set; }
public bool? IsMissing { get; set; } public bool? IsMissing { get; set; }
@ -157,6 +158,7 @@ namespace MediaBrowser.Controller.Entities
AncestorIds = new string[] { }; AncestorIds = new string[] { };
TopParentIds = new string[] { }; TopParentIds = new string[] { };
ExcludeTags = new string[] { }; ExcludeTags = new string[] { };
ExcludeInheritedTags = new string[] { };
LocationTypes = new LocationType[] { }; LocationTypes = new LocationType[] { };
ExcludeLocationTypes = new LocationType[] { }; ExcludeLocationTypes = new LocationType[] { };
PresetViews = new string[] { }; PresetViews = new string[] { };
@ -181,7 +183,7 @@ namespace MediaBrowser.Controller.Entities
BlockUnratedItems = policy.BlockUnratedItems; BlockUnratedItems = policy.BlockUnratedItems;
} }
ExcludeTags = policy.BlockedTags; ExcludeInheritedTags = policy.BlockedTags;
User = user; User = user;
} }

View File

@ -78,8 +78,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
private IDbCommand _saveAncestorCommand; private IDbCommand _saveAncestorCommand;
private IDbCommand _updateInheritedRatingCommand; private IDbCommand _updateInheritedRatingCommand;
private IDbCommand _updateInheritedTagsCommand;
private const int LatestSchemaVersion = 58; private const int LatestSchemaVersion = 61;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="SqliteItemRepository"/> class. /// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
@ -135,7 +136,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
"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)",
"create index if not exists idx_AncestorIds2 on AncestorIds(AncestorIdText)", "create index if not exists idx_AncestorIds2 on AncestorIds(AncestorIdText)",
"create table if not exists People (ItemId GUID, Name TEXT NOT NULL, Role TEXT, PersonType TEXT, SortOrder int, ListOrder int)", "create table if not exists People (ItemId GUID, Name TEXT NOT NULL, Role TEXT, PersonType TEXT, SortOrder int, ListOrder int)",
"create index if not exists idxPeopleItemId on People(ItemId)", "create index if not exists idxPeopleItemId on People(ItemId)",
"create index if not exists idxPeopleName on People(Name)", "create index if not exists idxPeopleName on People(Name)",
@ -224,6 +225,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
_connection.AddColumn(Logger, "TypedBaseItems", "CriticRating", "Float"); _connection.AddColumn(Logger, "TypedBaseItems", "CriticRating", "Float");
_connection.AddColumn(Logger, "TypedBaseItems", "CriticRatingSummary", "Text"); _connection.AddColumn(Logger, "TypedBaseItems", "CriticRatingSummary", "Text");
_connection.AddColumn(Logger, "TypedBaseItems", "DateModifiedDuringLastRefresh", "DATETIME"); _connection.AddColumn(Logger, "TypedBaseItems", "DateModifiedDuringLastRefresh", "DATETIME");
_connection.AddColumn(Logger, "TypedBaseItems", "InheritedTags", "Text");
PrepareStatements(); PrepareStatements();
@ -402,7 +404,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
"guid", "guid",
"type", "type",
"data", "data",
"Path", "Path",
"StartDate", "StartDate",
"EndDate", "EndDate",
"ChannelId", "ChannelId",
@ -462,7 +464,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
"TrailerTypes", "TrailerTypes",
"CriticRating", "CriticRating",
"CriticRatingSummary", "CriticRatingSummary",
"DateModifiedDuringLastRefresh" "DateModifiedDuringLastRefresh",
"InheritedTags"
}; };
_saveItemCommand = _connection.CreateCommand(); _saveItemCommand = _connection.CreateCommand();
_saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values ("; _saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (";
@ -540,8 +543,13 @@ namespace MediaBrowser.Server.Implementations.Persistence
_updateInheritedRatingCommand = _connection.CreateCommand(); _updateInheritedRatingCommand = _connection.CreateCommand();
_updateInheritedRatingCommand.CommandText = "Update TypedBaseItems set InheritedParentalRatingValue=@InheritedParentalRatingValue where Guid=@Guid"; _updateInheritedRatingCommand.CommandText = "Update TypedBaseItems set InheritedParentalRatingValue=@InheritedParentalRatingValue where Guid=@Guid";
_updateInheritedRatingCommand.Parameters.Add(_updateInheritedRatingCommand, "@InheritedParentalRatingValue");
_updateInheritedRatingCommand.Parameters.Add(_updateInheritedRatingCommand, "@Guid"); _updateInheritedRatingCommand.Parameters.Add(_updateInheritedRatingCommand, "@Guid");
_updateInheritedRatingCommand.Parameters.Add(_updateInheritedRatingCommand, "@InheritedParentalRatingValue");
_updateInheritedTagsCommand = _connection.CreateCommand();
_updateInheritedTagsCommand.CommandText = "Update TypedBaseItems set InheritedTags=@InheritedTags where Guid=@Guid";
_updateInheritedTagsCommand.Parameters.Add(_updateInheritedTagsCommand, "@Guid");
_updateInheritedTagsCommand.Parameters.Add(_updateInheritedTagsCommand, "@InheritedTags");
} }
/// <summary> /// <summary>
@ -715,7 +723,15 @@ namespace MediaBrowser.Server.Implementations.Persistence
_saveItemCommand.GetParameter(index++).Value = item.ServiceName; _saveItemCommand.GetParameter(index++).Value = item.ServiceName;
_saveItemCommand.GetParameter(index++).Value = string.Join("|", item.Tags.ToArray()); if (item.Tags.Count > 0)
{
_saveItemCommand.GetParameter(index++).Value = string.Join("|", item.Tags.ToArray());
}
else
{
_saveItemCommand.GetParameter(index++).Value = null;
}
_saveItemCommand.GetParameter(index++).Value = item.IsFolder; _saveItemCommand.GetParameter(index++).Value = item.IsFolder;
_saveItemCommand.GetParameter(index++).Value = item.GetBlockUnratedType().ToString(); _saveItemCommand.GetParameter(index++).Value = item.GetBlockUnratedType().ToString();
@ -765,6 +781,16 @@ namespace MediaBrowser.Server.Implementations.Persistence
_saveItemCommand.GetParameter(index++).Value = item.DateModifiedDuringLastRefresh.Value; _saveItemCommand.GetParameter(index++).Value = item.DateModifiedDuringLastRefresh.Value;
} }
var inheritedTags = item.GetInheritedTags();
if (inheritedTags.Count > 0)
{
_saveItemCommand.GetParameter(index++).Value = string.Join("|", inheritedTags.ToArray());
}
else
{
_saveItemCommand.GetParameter(index++).Value = null;
}
_saveItemCommand.Transaction = transaction; _saveItemCommand.Transaction = transaction;
_saveItemCommand.ExecuteNonQuery(); _saveItemCommand.ExecuteNonQuery();
@ -2165,6 +2191,14 @@ namespace MediaBrowser.Server.Implementations.Persistence
excludeTagIndex++; excludeTagIndex++;
} }
excludeTagIndex = 0;
foreach (var excludeTag in query.ExcludeInheritedTags)
{
whereClauses.Add("InheritedTags not like @excludeInheritedTag" + excludeTagIndex);
cmd.Parameters.Add(cmd, "@excludeInheritedTag" + excludeTagIndex, DbType.String).Value = "%" + excludeTag + "%";
excludeTagIndex++;
}
if (addPaging) if (addPaging)
{ {
if (query.StartIndex.HasValue && query.StartIndex.Value > 0) if (query.StartIndex.HasValue && query.StartIndex.Value > 0)
@ -2224,6 +2258,88 @@ namespace MediaBrowser.Server.Implementations.Persistence
}; };
public async Task UpdateInheritedValues(CancellationToken cancellationToken) public async Task UpdateInheritedValues(CancellationToken cancellationToken)
{
await UpdateInheritedParentalRating(cancellationToken).ConfigureAwait(false);
await UpdateInheritedTags(cancellationToken).ConfigureAwait(false);
}
private async Task UpdateInheritedTags(CancellationToken cancellationToken)
{
var newValues = new List<Tuple<Guid, string>>();
using (var cmd = _connection.CreateCommand())
{
cmd.CommandText = "select Guid,InheritedTags,(select group_concat(Tags, '|') from TypedBaseItems where (guid=outer.guid) OR (guid in (Select AncestorId from AncestorIds where ItemId=Outer.guid))) as NewInheritedTags from typedbaseitems as Outer where NewInheritedTags <> InheritedTags";
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
{
while (reader.Read())
{
var id = reader.GetGuid(0);
string value = reader.IsDBNull(2) ? null : reader.GetString(2);
newValues.Add(new Tuple<Guid, string>(id, value));
}
}
}
Logger.Debug("UpdateInheritedTags - {0} rows", newValues.Count);
if (newValues.Count == 0)
{
return;
}
await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false);
IDbTransaction transaction = null;
try
{
transaction = _connection.BeginTransaction();
foreach (var item in newValues)
{
_updateInheritedTagsCommand.GetParameter(0).Value = item.Item1;
_updateInheritedTagsCommand.GetParameter(1).Value = item.Item2;
_updateInheritedTagsCommand.Transaction = transaction;
_updateInheritedTagsCommand.ExecuteNonQuery();
}
transaction.Commit();
}
catch (OperationCanceledException)
{
if (transaction != null)
{
transaction.Rollback();
}
throw;
}
catch (Exception e)
{
Logger.ErrorException("Error running query:", e);
if (transaction != null)
{
transaction.Rollback();
}
throw;
}
finally
{
if (transaction != null)
{
transaction.Dispose();
}
WriteLock.Release();
}
}
private async Task UpdateInheritedParentalRating(CancellationToken cancellationToken)
{ {
var newValues = new List<Tuple<Guid, int>>(); var newValues = new List<Tuple<Guid, int>>();
@ -2243,6 +2359,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
} }
} }
Logger.Debug("UpdateInheritedParentalRatings - {0} rows", newValues.Count);
if (newValues.Count == 0) if (newValues.Count == 0)
{ {
return; return;