Fix Deduplication and Save of Items

This commit is contained in:
JPVenson
2024-11-13 14:25:26 +00:00
parent fcb1dfc010
commit 7b81a39ee1
6 changed files with 1694 additions and 48 deletions

View File

@@ -1270,6 +1270,7 @@ public sealed class BaseItemRepository(
}
else
{
context.BaseItemProviders.Where(e => e.ItemId == entity.Id).ExecuteDelete();
context.BaseItems.Attach(entity).State = EntityState.Modified;
}
@@ -1289,22 +1290,23 @@ public sealed class BaseItemRepository(
}
var itemValuesToSave = GetItemValuesToSave(item.Item, item.InheritedTags);
var itemValues = itemValuesToSave.Select(e => e.Value).ToArray();
context.ItemValuesMap.Where(e => e.ItemId == entity.Id).ExecuteDelete();
entity.ItemValues = new List<ItemValueMap>();
var referenceValues = context.ItemValues.Where(e => itemValues.Any(f => f == e.CleanValue)).ToArray();
foreach (var itemValue in itemValuesToSave)
{
var refValue = referenceValues.FirstOrDefault(f => f.CleanValue == itemValue.Value && (int)f.Type == itemValue.MagicNumber);
if (refValue is not null)
var refValue = context.ItemValues
.Where(f => f.CleanValue == GetCleanValue(itemValue.Value) && (int)f.Type == itemValue.MagicNumber)
.Select(e => e.ItemValueId)
.FirstOrDefault();
if (!refValue.IsEmpty())
{
entity.ItemValues.Add(new ItemValueMap()
{
Item = entity,
ItemId = entity.Id,
ItemValue = null!,
ItemValueId = refValue.ItemValueId
ItemValueId = refValue
});
}
else

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Jellyfin.Server.Implementations.Migrations
{
/// <inheritdoc />
public partial class EnforceUniqueItemValue : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "IX_ItemValues_Type_CleanValue",
table: "ItemValues");
migrationBuilder.CreateIndex(
name: "IX_ItemValues_Type_CleanValue",
table: "ItemValues",
columns: new[] { "Type", "CleanValue" },
unique: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "IX_ItemValues_Type_CleanValue",
table: "ItemValues");
migrationBuilder.CreateIndex(
name: "IX_ItemValues_Type_CleanValue",
table: "ItemValues",
columns: new[] { "Type", "CleanValue" });
}
}
}

View File

@@ -690,7 +690,8 @@ namespace Jellyfin.Server.Implementations.Migrations
b.HasKey("ItemValueId");
b.HasIndex("Type", "CleanValue");
b.HasIndex("Type", "CleanValue")
.IsUnique();
b.ToTable("ItemValues");
});

View File

@@ -14,6 +14,6 @@ public class ItemValuesConfiguration : IEntityTypeConfiguration<ItemValue>
public void Configure(EntityTypeBuilder<ItemValue> builder)
{
builder.HasKey(e => e.ItemValueId);
builder.HasIndex(e => new { e.Type, e.CleanValue });
builder.HasIndex(e => new { e.Type, e.CleanValue }).IsUnique();
}
}