Decouple Lucene from Content Delivery API (#15493)
* Decouples Lucene from the Content Delivery API * oops removes other refs
This commit is contained in:
@@ -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>();
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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())
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user