Skip to content

Commit

Permalink
Decouple Lucene from Content Delivery API (umbraco#15493)
Browse files Browse the repository at this point in the history
* Decouples Lucene from the Content Delivery API

* oops removes other refs
  • Loading branch information
Shazwazza authored Jan 2, 2024
1 parent 8b82add commit a36c7be
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
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;
Expand Down Expand Up @@ -55,6 +56,7 @@ public static IUmbracoBuilder AddDeliveryApi(this IUmbracoBuilder builder)
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>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Examine;
using Examine;
using Examine.Search;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
Expand Down Expand Up @@ -27,6 +27,7 @@ internal sealed class ApiContentQueryProvider : IApiContentQueryProvider
public ApiContentQueryProvider(
IExamineManager examineManager,
ContentIndexHandlerCollection indexHandlers,
IApiContentQueryFactory apiContentQueryFactory,
IOptions<DeliveryApiSettings> deliveryApiSettings,
ILogger<ApiContentQueryProvider> logger)
{
Expand All @@ -41,7 +42,7 @@ public ApiContentQueryProvider(

// 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);

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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
Expand All @@ -26,14 +28,7 @@ public ApiContentQuerySelectorBuilder(DeliveryApiSettings deliveryApiSettings)

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())
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}

0 comments on commit a36c7be

Please sign in to comment.