From 5a80b30289ff25b5640145331b7ca0659220c4da Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 28 Jan 2021 14:28:09 +1100 Subject: [PATCH] Fixes SQL (oops), wasn't appending the joins --- .../NuCache/DataSource/DatabaseDataSource.cs | 116 ++++++++++-------- 1 file changed, 63 insertions(+), 53 deletions(-) diff --git a/src/Umbraco.Web/PublishedCache/NuCache/DataSource/DatabaseDataSource.cs b/src/Umbraco.Web/PublishedCache/NuCache/DataSource/DatabaseDataSource.cs index 4584344891..0ca882b014 100644 --- a/src/Umbraco.Web/PublishedCache/NuCache/DataSource/DatabaseDataSource.cs +++ b/src/Umbraco.Web/PublishedCache/NuCache/DataSource/DatabaseDataSource.cs @@ -28,7 +28,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource // we want arrays, we want them all loaded, not an enumerable - private Sql SqlContentSourcesSelect(IScope scope, Func, Sql> joins = null) + private Sql SqlContentSourcesSelect(IScope scope, Func> joins = null) { var sqlTemplate = scope.SqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.ContentSourcesSelect, tsql => tsql.Select(x => Alias(x.NodeId, "Id"), x => Alias(x.UniqueId, "Uid"), @@ -56,7 +56,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource // TODO: I'm unsure how we can format the below into SQL templates also because right.Current and right.Published end up being parameters if (joins != null) - sql = joins(sql); + sql = sql.Append(joins(sql.SqlContext)); sql = sql .InnerJoin().On((left, right) => left.NodeId == right.NodeId) @@ -75,48 +75,58 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource return sql; } - private Sql SqlContentSourcesSelectUmbracoNodeJoin(Sql s) + private Sql SqlContentSourcesSelectUmbracoNodeJoin(ISqlContext sqlContext) { - var syntax = s.SqlContext.SqlSyntax; - var sqlTemplate = s.SqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.SourcesSelectUmbracoNodeJoin, s => - s.InnerJoin("x") + var syntax = sqlContext.SqlSyntax; + + var sqlTemplate = sqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.SourcesSelectUmbracoNodeJoin, builder => + builder.InnerJoin("x") .On((left, right) => left.NodeId == right.NodeId || SqlText(left.Path, right.Path, (lp, rp) => $"({lp} LIKE {syntax.GetConcat(rp, "',%'")})"), aliasRight: "x")); + var sql = sqlTemplate.Sql(); return sql; } - private Sql SqlWhereNodeId(Sql s, int id) + private Sql SqlWhereNodeId(ISqlContext sqlContext, int id) { - var syntax = s.SqlContext.SqlSyntax; - var sqlTemplate = s.SqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.WhereNodeId, s => - s.Where(x => x.NodeId == SqlTemplate.Arg("id"))); + var syntax = sqlContext.SqlSyntax; + + var sqlTemplate = sqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.WhereNodeId, builder => + builder.Where(x => x.NodeId == SqlTemplate.Arg("id"))); + var sql = sqlTemplate.Sql(id); return sql; } - private Sql SqlWhereNodeIdX(Sql s, int id) + private Sql SqlWhereNodeIdX(ISqlContext sqlContext, int id) { - var syntax = s.SqlContext.SqlSyntax; - var sqlTemplate = s.SqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.WhereNodeIdX, s => + var syntax = sqlContext.SqlSyntax; + + var sqlTemplate = sqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.WhereNodeIdX, s => s.Where(x => x.NodeId == SqlTemplate.Arg("id"), "x")); + var sql = sqlTemplate.Sql(id); return sql; } - private Sql SqlOrderByLevelIdSortOrder(Sql s) + private Sql SqlOrderByLevelIdSortOrder(ISqlContext sqlContext) { - var syntax = s.SqlContext.SqlSyntax; - var sqlTemplate = s.SqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.OrderByLevelIdSortOrder, s => + var syntax = sqlContext.SqlSyntax; + + var sqlTemplate = sqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.OrderByLevelIdSortOrder, s => s.OrderBy(x => x.Level, x => x.ParentId, x => x.SortOrder)); + var sql = sqlTemplate.Sql(); return sql; } - private Sql SqlObjectTypeNotTrashed(Sql s, Guid nodeObjectType) + private Sql SqlObjectTypeNotTrashed(ISqlContext sqlContext, Guid nodeObjectType) { - var syntax = s.SqlContext.SqlSyntax; - var sqlTemplate = s.SqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.ObjectTypeNotTrashedFilter, s => + var syntax = sqlContext.SqlSyntax; + + var sqlTemplate = sqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.ObjectTypeNotTrashedFilter, s => s.Where(x => x.NodeObjectType == SqlTemplate.Arg("nodeObjectType") && x.Trashed == SqlTemplate.Arg("trashed"))); + var sql = sqlTemplate.Sql(nodeObjectType, false); return sql; } @@ -126,7 +136,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource /// /// /// - private Sql SqlContentSourcesCount(IScope scope, Func, Sql> joins = null) + private Sql SqlContentSourcesCount(IScope scope, Func> joins = null) { var sqlTemplate = scope.SqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.ContentSourcesCount, tsql => tsql.Select(x => Alias(x.NodeId, "Id")) @@ -137,7 +147,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource var sql = sqlTemplate.Sql(); if (joins != null) - sql = joins(sql); + sql = sql.Append(joins(sql.SqlContext)); // TODO: We can't use a template with this one because of the 'right.Current' and 'right.Published' ends up being a parameter so not sure how we can do that sql = sql @@ -150,7 +160,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource return sql; } - private Sql SqlMediaSourcesSelect(IScope scope, Func, Sql> joins = null) + private Sql SqlMediaSourcesSelect(IScope scope, Func> joins = null) { var sqlTemplate = scope.SqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.MediaSourcesSelect, tsql => tsql.Select(x => Alias(x.NodeId, "Id"), x => Alias(x.UniqueId, "Uid"), @@ -165,7 +175,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource var sql = sqlTemplate.Sql(); if (joins != null) - sql = joins(sql); + sql = sql.Append(joins(sql.SqlContext)); // TODO: We can't use a template with this one because of the 'right.Published' ends up being a parameter so not sure how we can do that sql = sql @@ -175,7 +185,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource return sql; } - private Sql SqlMediaSourcesCount(IScope scope, Func, Sql> joins = null) + private Sql SqlMediaSourcesCount(IScope scope, Func> joins = null) { var sqlTemplate = scope.SqlContext.Templates.Get(Constants.SqlTemplates.NuCacheDatabaseDataSource.MediaSourcesCount, tsql => tsql.Select(x => Alias(x.NodeId, "Id")).From()); @@ -183,7 +193,7 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource var sql = sqlTemplate.Sql(); if (joins != null) - sql = joins(sql); + sql = sql.Append(joins(sql.SqlContext)); // TODO: We can't use a template with this one because of the 'right.Current' ends up being a parameter so not sure how we can do that sql = sql @@ -196,9 +206,9 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource public ContentNodeKit GetContentSource(IScope scope, int id) { var sql = SqlContentSourcesSelect(scope) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Document)) - .Append(SqlWhereNodeId(scope.SqlContext.Sql(), id)) - .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext.Sql())); + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Document)) + .Append(SqlWhereNodeId(scope.SqlContext, id)) + .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext)); var dto = scope.Database.Fetch(sql).FirstOrDefault(); @@ -211,12 +221,12 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource public IEnumerable GetAllContentSources(IScope scope) { var sql = SqlContentSourcesSelect(scope) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Document)) - .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext.Sql())); + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Document)) + .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext)); // Use a more efficient COUNT query var sqlCountQuery = SqlContentSourcesCount(scope) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Document)); + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Document)); var sqlCount = scope.SqlContext.Sql("SELECT COUNT(*) FROM (").Append(sqlCountQuery).Append(") npoco_tbl"); @@ -234,14 +244,14 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource public IEnumerable GetBranchContentSources(IScope scope, int id) { var sql = SqlContentSourcesSelect(scope, SqlContentSourcesSelectUmbracoNodeJoin) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Document)) - .Append(SqlWhereNodeIdX(scope.SqlContext.Sql(), id)) - .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext.Sql())); + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Document)) + .Append(SqlWhereNodeIdX(scope.SqlContext, id)) + .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext)); // Use a more efficient COUNT query var sqlCountQuery = SqlContentSourcesCount(scope, SqlContentSourcesSelectUmbracoNodeJoin) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Document)) - .Append(SqlWhereNodeIdX(scope.SqlContext.Sql(), id)); + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Document)) + .Append(SqlWhereNodeIdX(scope.SqlContext, id)); var sqlCount = scope.SqlContext.Sql("SELECT COUNT(*) FROM (").Append(sqlCountQuery).Append(") npoco_tbl"); var serializer = _contentCacheDataSerializerFactory.Create(ContentCacheDataSerializerEntityType.Document); @@ -260,13 +270,13 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource if (!ids.Any()) yield break; var sql = SqlContentSourcesSelect(scope) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Document)) + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Document)) .WhereIn(x => x.ContentTypeId, ids) - .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext.Sql())); + .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext)); // Use a more efficient COUNT query var sqlCountQuery = SqlContentSourcesCount(scope) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Document)) + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Document)) .WhereIn(x => x.ContentTypeId, ids); var sqlCount = scope.SqlContext.Sql("SELECT COUNT(*) FROM (").Append(sqlCountQuery).Append(") npoco_tbl"); @@ -284,9 +294,9 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource public ContentNodeKit GetMediaSource(IScope scope, int id) { var sql = SqlMediaSourcesSelect(scope) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Media)) - .Append(SqlWhereNodeId(scope.SqlContext.Sql(), id)) - .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext.Sql())); + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Media)) + .Append(SqlWhereNodeId(scope.SqlContext, id)) + .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext)); var dto = scope.Database.Fetch(sql).FirstOrDefault(); @@ -299,12 +309,12 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource public IEnumerable GetAllMediaSources(IScope scope) { var sql = SqlMediaSourcesSelect(scope) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Media)) - .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext.Sql())); + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Media)) + .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext)); // Use a more efficient COUNT query var sqlCountQuery = SqlMediaSourcesCount(scope) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Media)); + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Media)); var sqlCount = scope.SqlContext.Sql("SELECT COUNT(*) FROM (").Append(sqlCountQuery).Append(") npoco_tbl"); var serializer = _contentCacheDataSerializerFactory.Create(ContentCacheDataSerializerEntityType.Media); @@ -321,14 +331,14 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource public IEnumerable GetBranchMediaSources(IScope scope, int id) { var sql = SqlMediaSourcesSelect(scope, SqlContentSourcesSelectUmbracoNodeJoin) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Media)) - .Append(SqlWhereNodeIdX(scope.SqlContext.Sql(), id)) - .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext.Sql())); + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Media)) + .Append(SqlWhereNodeIdX(scope.SqlContext, id)) + .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext)); // Use a more efficient COUNT query var sqlCountQuery = SqlMediaSourcesCount(scope, SqlContentSourcesSelectUmbracoNodeJoin) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Media)) - .Append(SqlWhereNodeIdX(scope.SqlContext.Sql(), id)); + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Media)) + .Append(SqlWhereNodeIdX(scope.SqlContext, id)); var sqlCount = scope.SqlContext.Sql("SELECT COUNT(*) FROM (").Append(sqlCountQuery).Append(") npoco_tbl"); var serializer = _contentCacheDataSerializerFactory.Create(ContentCacheDataSerializerEntityType.Media); @@ -347,13 +357,13 @@ namespace Umbraco.Web.PublishedCache.NuCache.DataSource if (!ids.Any()) yield break; var sql = SqlMediaSourcesSelect(scope) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Media)) + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Media)) .WhereIn(x => x.ContentTypeId, ids) - .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext.Sql())); + .Append(SqlOrderByLevelIdSortOrder(scope.SqlContext)); // Use a more efficient COUNT query var sqlCountQuery = SqlMediaSourcesCount(scope) - .Append(SqlObjectTypeNotTrashed(scope.SqlContext.Sql(), Constants.ObjectTypes.Media)) + .Append(SqlObjectTypeNotTrashed(scope.SqlContext, Constants.ObjectTypes.Media)) .WhereIn(x => x.ContentTypeId, ids); var sqlCount = scope.SqlContext.Sql("SELECT COUNT(*) FROM (").Append(sqlCountQuery).Append(") npoco_tbl");