Merge remote-tracking branch 'origin/v8/bugfix/7245-missing-indexes' into v8/dev

This commit is contained in:
Claus
2020-01-03 13:26:32 +01:00
5 changed files with 94 additions and 28 deletions

View File

@@ -185,6 +185,7 @@ namespace Umbraco.Core.Migrations.Upgrade
// to 8.6.0
To<AddPropertyTypeValidationMessageColumns>("{3D67D2C8-5E65-47D0-A9E1-DC2EE0779D6B}");
To<MissingContentVersionsIndexes>("{EE288A91-531B-4995-8179-1D62D9AA3E2E}");
//FINAL
}

View File

@@ -0,0 +1,24 @@
using Umbraco.Core.Persistence.Dtos;
namespace Umbraco.Core.Migrations.Upgrade.V_8_6_0
{
public class MissingContentVersionsIndexes : MigrationBase
{
public MissingContentVersionsIndexes(IMigrationContext context) : base(context)
{
}
public override void Migrate()
{
Create
.Index("IX_" + ContentVersionDto.TableName + "_NodeId")
.OnTable(ContentVersionDto.TableName)
.OnColumn("nodeId")
.Ascending()
.OnColumn("current")
.Ascending()
.WithOptions().NonClustered()
.Do();
}
}
}

View File

@@ -19,6 +19,7 @@ namespace Umbraco.Core.Persistence.Dtos
[Column("nodeId")]
[ForeignKey(typeof(ContentDto))]
[Index(IndexTypes.NonClustered, Name = "IX_" + TableName + "_NodeId", ForColumns = "nodeId,current")]
public int NodeId { get; set; }
[Column("versionDate")] // TODO: db rename to 'updateDate'
@@ -30,7 +31,6 @@ namespace Umbraco.Core.Persistence.Dtos
[NullSetting(NullSetting = NullSettings.Null)]
public int? UserId { get => _userId == 0 ? null : _userId; set => _userId = value; } //return null if zero
// TODO: we need an index on this it is used almost always in querying and sorting
[Column("current")]
public bool Current { get; set; }

View File

@@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq;
using NPoco;
using Umbraco.Core.Cache;
using Umbraco.Core.Exceptions;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Entities;
@@ -75,7 +74,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
if (ids.Any())
sql.WhereIn<NodeDto>(x => x.NodeId, ids);
return MapDtosToContent(Database.Fetch<DocumentDto>(sql));
return MapDtosToContent(Database.Fetch<DocumentDto>(sql), false,
// load everything
true, true, true, true);
}
protected override IEnumerable<IContent> PerformGetByQuery(IQuery<IContent> query)
@@ -87,7 +88,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
AddGetByQueryOrderBy(sql);
return MapDtosToContent(Database.Fetch<DocumentDto>(sql));
return MapDtosToContent(Database.Fetch<DocumentDto>(sql), false,
// load everything
true, true, true, true);
}
private void AddGetByQueryOrderBy(Sql<ISqlContext> sql)
@@ -226,7 +229,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
.OrderByDescending<ContentVersionDto>(x => x.Current)
.AndByDescending<ContentVersionDto>(x => x.VersionDate);
return MapDtosToContent(Database.Fetch<DocumentDto>(sql), true);
return MapDtosToContent(Database.Fetch<DocumentDto>(sql), true, true, true, true, true);
}
public override IEnumerable<IContent> GetAllVersionsSlim(int nodeId, int skip, int take)
@@ -236,7 +239,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
.OrderByDescending<ContentVersionDto>(x => x.Current)
.AndByDescending<ContentVersionDto>(x => x.VersionDate);
return MapDtosToContent(Database.Fetch<DocumentDto>(sql), true, true).Skip(skip).Take(take);
return MapDtosToContent(Database.Fetch<DocumentDto>(sql), true,
// load bare minimum
false, false, false, false).Skip(skip).Take(take);
}
public override IContent GetVersion(int versionId)
@@ -832,7 +837,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
}
return GetPage<DocumentDto>(query, pageIndex, pageSize, out totalRecords,
x => MapDtosToContent(x),
x => MapDtosToContent(x, false,
// load properties but nothing else
true, false, false, false),
filterSql,
ordering);
}
@@ -919,7 +926,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
if (ids.Length > 0)
sql.WhereIn<NodeDto>(x => x.UniqueId, ids);
return _outerRepo.MapDtosToContent(Database.Fetch<DocumentDto>(sql));
return _outerRepo.MapDtosToContent(Database.Fetch<DocumentDto>(sql), false,
// load everything
true, true, true, true);
}
protected override IEnumerable<IContent> PerformGetByQuery(IQuery<IContent> query)
@@ -977,7 +986,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
AddGetByQueryOrderBy(sql);
return MapDtosToContent(Database.Fetch<DocumentDto>(sql));
return MapDtosToContent(Database.Fetch<DocumentDto>(sql),
// load the bare minimum
false, false, false, false, false);
}
/// <inheritdoc />
@@ -993,7 +1004,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
AddGetByQueryOrderBy(sql);
return MapDtosToContent(Database.Fetch<DocumentDto>(sql));
return MapDtosToContent(Database.Fetch<DocumentDto>(sql),
// load the bare minimum
false, false, false, false, false);
}
#endregion
@@ -1056,7 +1069,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
return base.ApplySystemOrdering(ref sql, ordering);
}
private IEnumerable<IContent> MapDtosToContent(List<DocumentDto> dtos, bool withCache = false, bool slim = false)
private IEnumerable<IContent> MapDtosToContent(List<DocumentDto> dtos,
bool withCache,
bool loadProperties,
bool loadTemplates,
bool loadSchedule,
bool loadVariants)
{
var temps = new List<TempContent<Content>>();
var contentTypes = new Dictionary<int, IContentType>();
@@ -1089,7 +1107,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
var c = content[i] = ContentBaseFactory.BuildEntity(dto, contentType);
if (!slim)
if (loadTemplates)
{
// need templates
var templateId = dto.DocumentVersionDto.TemplateId;
@@ -1114,49 +1132,71 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
temps.Add(temp);
}
if (!slim)
Dictionary<int, ITemplate> templates = null;
if (loadTemplates)
{
// load all required templates in 1 query, and index
var templates = _templateRepository.GetMany(templateIds.ToArray())
templates = _templateRepository.GetMany(templateIds.ToArray())
.ToDictionary(x => x.Id, x => x);
}
IDictionary<int, PropertyCollection> properties = null;
if (loadProperties)
{
// load all properties for all documents from database in 1 query - indexed by version id
var properties = GetPropertyCollections(temps);
var schedule = GetContentSchedule(temps.Select(x => x.Content.Id).ToArray());
properties = GetPropertyCollections(temps);
}
// assign templates and properties
foreach (var temp in temps)
var schedule = GetContentSchedule(temps.Select(x => x.Content.Id).ToArray());
// assign templates and properties
foreach (var temp in temps)
{
if (loadTemplates)
{
// set the template ID if it matches an existing template
if (temp.Template1Id.HasValue && templates.ContainsKey(temp.Template1Id.Value))
temp.Content.TemplateId = temp.Template1Id;
if (temp.Template2Id.HasValue && templates.ContainsKey(temp.Template2Id.Value))
temp.Content.PublishTemplateId = temp.Template2Id;
}
// set properties
// set properties
if (loadProperties)
{
if (properties.ContainsKey(temp.VersionId))
temp.Content.Properties = properties[temp.VersionId];
else
throw new InvalidOperationException($"No property data found for version: '{temp.VersionId}'.");
}
if (loadSchedule)
{
// load in the schedule
if (schedule.TryGetValue(temp.Content.Id, out var s))
temp.Content.ContentSchedule = s;
}
}
// set variations, if varying
temps = temps.Where(x => x.ContentType.VariesByCulture()).ToList();
if (temps.Count > 0)
if (loadVariants)
{
// load all variations for all documents from database, in one query
var contentVariations = GetContentVariations(temps);
var documentVariations = GetDocumentVariations(temps);
foreach (var temp in temps)
SetVariations(temp.Content, contentVariations, documentVariations);
// set variations, if varying
temps = temps.Where(x => x.ContentType.VariesByCulture()).ToList();
if (temps.Count > 0)
{
// load all variations for all documents from database, in one query
var contentVariations = GetContentVariations(temps);
var documentVariations = GetDocumentVariations(temps);
foreach (var temp in temps)
SetVariations(temp.Content, contentVariations, documentVariations);
}
}
foreach(var c in content)
foreach (var c in content)
c.ResetDirtyProperties(false); // reset dirty initial properties (U4-1946)
return content;

View File

@@ -128,6 +128,7 @@
</Compile>
-->
<Compile Include="AssemblyExtensions.cs" />
<Compile Include="Migrations\Upgrade\V_8_6_0\MissingContentVersionsIndexes.cs" />
<Compile Include="SystemLock.cs" />
<Compile Include="Attempt.cs" />
<Compile Include="AttemptOfTResult.cs" />