Skip to content

Commit 52b69e7

Browse files
authored
Merge pull request #140 from Vettvangur/feature/performance-update
Feature/performance update
2 parents d166abf + 2ea3c98 commit 52b69e7

File tree

4 files changed

+92
-4
lines changed

4 files changed

+92
-4
lines changed

src/Umbraco.Cms.Integrations.Search.Algolia/Builders/ContentRecordBuilder.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,56 @@ public ContentRecordBuilder(IUserService userService, IPublishedUrlProvider urlP
2626

2727
_algoliaSearchPropertyIndexValueFactory = algoliaSearchPropertyIndexValueFactory;
2828
}
29+
public ContentRecordBuilder BuildFromContent(IPublishedContent content, Func<IPublishedProperty, bool> filter = null)
30+
{
31+
_record.ObjectID = content.Key.ToString();
32+
33+
_record.Id = content.Id;
34+
_record.Name = content.Name;
35+
36+
_record.CreateDate = content.CreateDate.ToString();
37+
_record.CreatorName = content.CreatorName();
38+
_record.UpdateDate = content.UpdateDate.ToString();
39+
_record.WriterName = content.WriterName();
40+
41+
_record.TemplateId = content.TemplateId.HasValue ? content.TemplateId.Value : -1;
42+
_record.Level = content.Level;
43+
_record.Path = content.Path;
44+
_record.ContentTypeAlias = content.ContentType.Alias;
45+
_record.Url = _urlProvider.GetUrl(content.Id);
46+
47+
if (content.Cultures.Any())
48+
{
49+
foreach (var culture in content.Cultures)
50+
{
51+
_record.Data.Add($"name{(!string.IsNullOrEmpty(culture.Value.Culture) ? "-" + culture.Value.Culture : "")}", culture.Value.Name);
52+
_record.Data.Add($"url{(!string.IsNullOrEmpty(culture.Value.Culture) ? "-" + culture.Value.Culture : "")}", content.Url(culture.Value.Culture));
53+
}
54+
}
2955

56+
foreach (var property in content.Properties.Where(filter ?? (p => true)))
57+
{
58+
if (!_record.Data.ContainsKey(property.Alias))
59+
{
60+
if (property.PropertyType.VariesByCulture())
61+
{
62+
foreach (var culture in content.Cultures)
63+
{
64+
var indexValue = _algoliaSearchPropertyIndexValueFactory.GetValue(property, culture.Value.Culture);
65+
_record.Data.Add($"{indexValue.Key}-{culture.Value.Culture}", indexValue.Value);
66+
}
67+
}
68+
else
69+
{
70+
var indexValue = _algoliaSearchPropertyIndexValueFactory.GetValue(property, string.Empty);
71+
_record.Data.Add(indexValue.Key, indexValue.Value);
72+
}
73+
74+
}
75+
}
76+
77+
return this;
78+
}
3079
public ContentRecordBuilder BuildFromContent(IContent content, Func<IProperty, bool> filter = null)
3180
{
3281
_record.ObjectID = content.Key.ToString();

src/Umbraco.Cms.Integrations.Search.Algolia/Controllers/SearchController.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
using Algolia.Search.Models.Search;
1+
using System.Diagnostics;
2+
using Algolia.Search.Models.Search;
23

34
using Microsoft.AspNetCore.Mvc;
45

56
using System.Text.Json;
6-
7+
using Microsoft.Extensions.Logging;
78
using Umbraco.Cms.Core.Routing;
89
using Umbraco.Cms.Core.Services;
910
using Umbraco.Cms.Core.Services.Implement;
@@ -40,6 +41,8 @@ public class SearchController : UmbracoAuthorizedApiController
4041

4142
private readonly IUmbracoContextFactory _umbracoContextFactory;
4243

44+
private readonly ILogger<SearchController> _logger;
45+
4346
public SearchController(
4447
IAlgoliaIndexService indexService,
4548
IAlgoliaSearchService<SearchResponse<Record>> searchService,
@@ -49,7 +52,8 @@ public SearchController(
4952
IPublishedUrlProvider urlProvider,
5053
IContentService contentService,
5154
IAlgoliaSearchPropertyIndexValueFactory algoliaSearchPropertyIndexValueFactory,
52-
IUmbracoContextFactory umbracoContextFactory)
55+
IUmbracoContextFactory umbracoContextFactory,
56+
ILogger<SearchController> logger)
5357
{
5458
_indexService = indexService;
5559

@@ -68,6 +72,8 @@ public SearchController(
6872
_algoliaSearchPropertyIndexValueFactory = algoliaSearchPropertyIndexValueFactory;
6973

7074
_umbracoContextFactory = umbracoContextFactory;
75+
76+
_logger = logger;
7177
}
7278

7379
[HttpGet]
@@ -122,18 +128,27 @@ public async Task<IActionResult> BuildIndex([FromBody] IndexConfiguration indexC
122128

123129
foreach (var contentDataItem in indexContentData)
124130
{
131+
var sw = new Stopwatch();
132+
sw.Start();
133+
125134
using var ctx = _umbracoContextFactory.EnsureUmbracoContext();
126135
var contentType = ctx.UmbracoContext.Content.GetContentType(contentDataItem.ContentType.Alias);
127136
var contentItems = ctx.UmbracoContext.Content.GetByContentType(contentType);
128137

138+
_logger.LogInformation("Building index for {ContentType} with {Count} items", contentDataItem.ContentType.Alias, contentItems.Count());
139+
129140
foreach (var contentItem in contentItems)
130141
{
131142
var record = new ContentRecordBuilder(_userService, _urlProvider, _algoliaSearchPropertyIndexValueFactory)
132-
.BuildFromContent(_contentService.GetById(contentItem.Id), (p) => contentDataItem.Properties.Any(q => q.Alias == p.Alias))
143+
.BuildFromContent(contentItem, (p) => contentDataItem.Properties.Any(q => q.Alias == p.Alias))
133144
.Build();
134145

135146
payload.Add(record);
136147
}
148+
149+
sw.Stop();
150+
151+
_logger.LogInformation("Finished building index for {ContentType} in {Elapsed} ms", contentDataItem.ContentType.Alias, sw.ElapsedMilliseconds);
137152
}
138153

139154
var result = await _indexService.PushData(index.Name, payload);

src/Umbraco.Cms.Integrations.Search.Algolia/Services/AlgoliaSearchPropertyIndexValueFactory.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Text.Json;
22

33
using Umbraco.Cms.Core.Models;
4+
using Umbraco.Cms.Core.Models.PublishedContent;
45
using Umbraco.Cms.Core.Services;
56

67
namespace Umbraco.Cms.Integrations.Search.Algolia.Services
@@ -46,6 +47,21 @@ public virtual KeyValuePair<string, string> GetValue(IProperty property, string
4647

4748
return new KeyValuePair<string, string>(indexValue.Key, ParseIndexValue(indexValue.Value));
4849
}
50+
public virtual KeyValuePair<string, string> GetValue(IPublishedProperty property, string culture)
51+
{
52+
53+
var listOfObjects = new List<object> { property.GetSourceValue(culture) };
54+
55+
var indexValue = new KeyValuePair<string, IEnumerable<object>>(property.Alias, listOfObjects);
56+
57+
if (Converters.ContainsKey(property.PropertyType.EditorAlias))
58+
{
59+
var result = Converters[property.PropertyType.EditorAlias].Invoke(indexValue);
60+
return new KeyValuePair<string, string>(property.Alias, result);
61+
}
62+
63+
return new KeyValuePair<string, string>(indexValue.Key, ParseIndexValue(indexValue.Value));
64+
}
4965

5066
public string ParseIndexValue(IEnumerable<object> values)
5167
{

src/Umbraco.Cms.Integrations.Search.Algolia/Services/IAlgoliaSearchPropertyIndexValueFactory.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Umbraco.Cms.Core.Models;
2+
using Umbraco.Cms.Core.Models.PublishedContent;
23

34
namespace Umbraco.Cms.Integrations.Search.Algolia.Services
45
{
@@ -13,5 +14,12 @@ public interface IAlgoliaSearchPropertyIndexValueFactory
1314
/// <param name="culture"></param>
1415
/// <returns>[alias, value] pair</returns>
1516
KeyValuePair<string, string> GetValue(IProperty property, string culture);
17+
/// <summary>
18+
/// Get property indexed value
19+
/// </summary>
20+
/// <param name="property"></param>
21+
/// <param name="culture"></param>
22+
/// <returns>[alias, value] pair</returns>
23+
KeyValuePair<string, string> GetValue(IPublishedProperty property, string culture);
1624
}
1725
}

0 commit comments

Comments
 (0)