Decouple Lucene from Content Delivery API (#15493)

* Decouples Lucene from the Content Delivery API

* oops removes other refs
This commit is contained in:
Shannon Deminick
2024-01-02 08:20:53 -07:00
committed by GitHub
parent 8b82addd53
commit a36c7beabf
5 changed files with 55 additions and 13 deletions

View File

@@ -15,6 +15,7 @@ using Umbraco.Cms.Api.Delivery.Rendering;
using Umbraco.Cms.Api.Delivery.Routing;
using Umbraco.Cms.Api.Delivery.Security;
using Umbraco.Cms.Api.Delivery.Services;
using Umbraco.Cms.Api.Delivery.Services.QueryBuilders;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.DeliveryApi;
@@ -55,6 +56,7 @@ public static class UmbracoBuilderExtensions
builder.Services.AddSingleton<IApiAccessService, ApiAccessService>();
builder.Services.AddSingleton<IApiContentQueryService, ApiContentQueryService>();
builder.Services.AddSingleton<IApiContentQueryProvider, ApiContentQueryProvider>();
builder.Services.AddSingleton<IApiContentQueryFactory, ApiContentQueryFactory>();
builder.Services.AddSingleton<IApiMediaQueryService, ApiMediaQueryService>();
builder.Services.AddTransient<IMemberApplicationManager, MemberApplicationManager>();
builder.Services.AddTransient<IRequestMemberAccessService, RequestMemberAccessService>();

View File

@@ -1,4 +1,4 @@
using Examine;
using Examine;
using Examine.Search;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
@@ -27,6 +27,7 @@ internal sealed class ApiContentQueryProvider : IApiContentQueryProvider
public ApiContentQueryProvider(
IExamineManager examineManager,
ContentIndexHandlerCollection indexHandlers,
IApiContentQueryFactory apiContentQueryFactory,
IOptions<DeliveryApiSettings> deliveryApiSettings,
ILogger<ApiContentQueryProvider> logger)
{
@@ -41,7 +42,7 @@ internal sealed class ApiContentQueryProvider : IApiContentQueryProvider
// for the time being we're going to keep these as internal implementation details.
// perhaps later on it will make sense to expose them through the DI.
_selectorBuilder = new ApiContentQuerySelectorBuilder(deliveryApiSettings.Value);
_selectorBuilder = new ApiContentQuerySelectorBuilder(deliveryApiSettings.Value, apiContentQueryFactory);
_filterBuilder = new ApiContentQueryFilterBuilder(fieldTypes, _logger);
_sortBuilder = new ApiContentQuerySortBuilder(fieldTypes, _logger);

View File

@@ -0,0 +1,26 @@
using Examine;
using Examine.Lucene.Providers;
using Examine.Lucene.Search;
using Examine.Search;
using Umbraco.Cms.Infrastructure.Examine;
namespace Umbraco.Cms.Api.Delivery.Services.QueryBuilders
{
internal sealed class ApiContentQueryFactory : IApiContentQueryFactory
{
/// <inheritdoc/>
public IQuery CreateApiContentQuery(IIndex index)
{
// Needed for enabling leading wildcards searches
BaseLuceneSearcher searcher = index.Searcher as BaseLuceneSearcher ?? throw new InvalidOperationException($"Index searcher must be of type {nameof(BaseLuceneSearcher)}.");
IQuery query = searcher.CreateQuery(
IndexTypes.Content,
BooleanOperation.And,
searcher.LuceneAnalyzer,
new LuceneSearchOptions { AllowLeadingWildcard = true });
return query;
}
}
}

View File

@@ -1,6 +1,4 @@
using Examine;
using Examine.Lucene.Providers;
using Examine.Lucene.Search;
using Examine.Search;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.DeliveryApi;
@@ -13,11 +11,15 @@ namespace Umbraco.Cms.Api.Delivery.Services.QueryBuilders;
internal sealed class ApiContentQuerySelectorBuilder
{
private readonly DeliveryApiSettings _deliveryApiSettings;
private readonly IApiContentQueryFactory _queryFactory;
private readonly string _fallbackGuidValue;
public ApiContentQuerySelectorBuilder(DeliveryApiSettings deliveryApiSettings)
public ApiContentQuerySelectorBuilder(
DeliveryApiSettings deliveryApiSettings,
IApiContentQueryFactory queryFactory)
{
_deliveryApiSettings = deliveryApiSettings;
_queryFactory = queryFactory;
// A fallback value is needed for Examine queries in case we don't have a value - we can't pass null or empty string
// It is set to a random guid since this would be highly unlikely to yield any results
@@ -26,14 +28,7 @@ internal sealed class ApiContentQuerySelectorBuilder
public IBooleanOperation Build(SelectorOption selectorOption, IIndex index, string culture, ProtectedAccess protectedAccess, bool preview)
{
// Needed for enabling leading wildcards searches
BaseLuceneSearcher searcher = index.Searcher as BaseLuceneSearcher ?? throw new InvalidOperationException($"Index searcher must be of type {nameof(BaseLuceneSearcher)}.");
IQuery query = searcher.CreateQuery(
IndexTypes.Content,
BooleanOperation.And,
searcher.LuceneAnalyzer,
new LuceneSearchOptions { AllowLeadingWildcard = true });
IQuery query = _queryFactory.CreateApiContentQuery(index);
IBooleanOperation selectorOperation = selectorOption.Values.Length == 1
? query.Field(selectorOption.FieldName, selectorOption.Values.First())

View File

@@ -0,0 +1,18 @@
using Examine;
using Examine.Search;
namespace Umbraco.Cms.Api.Delivery.Services.QueryBuilders
{
/// <summary>
/// Used to create an <see cref="IQuery"/> instance for content items for the content delivery api.
/// </summary>
public interface IApiContentQueryFactory
{
/// <summary>
/// Creates an <see cref="IQuery"/> for content items for the content delivery api.
/// </summary>
/// <param name="index">The <see cref="IIndex"/>.</param>
/// <returns>An <see cref="IQuery"/> instance.</returns>
IQuery CreateApiContentQuery(IIndex index);
}
}