Updates latest examine + api updates + fixes tests, gets different validation working (valid, failed, filtered)

This commit is contained in:
Shannon
2018-12-03 22:10:56 +11:00
parent 6103832b8a
commit f8d203abff
26 changed files with 343 additions and 279 deletions

View File

@@ -125,13 +125,11 @@ namespace Umbraco.Web.Search
//create the indexes and register them with the manager
foreach(var index in indexCreator.Create())
{
_examineManager.AddIndex(index);
}
profilingLogger.Logger.Debug<ExamineComponent>("Examine shutdown registered with MainDom");
var registeredIndexers = examineManager.IndexProviders.Values.OfType<IUmbracoIndexer>().Count(x => x.EnableDefaultEventHandler);
var registeredIndexers = examineManager.Indexes.OfType<IUmbracoIndexer>().Count(x => x.EnableDefaultEventHandler);
profilingLogger.Logger.Info<ExamineComponent>("Adding examine event handlers for {RegisteredIndexers} index providers.", registeredIndexers);
@@ -205,7 +203,7 @@ namespace Umbraco.Web.Search
_isConfigured = true;
foreach (var luceneIndexer in examineManager.IndexProviders.Values.OfType<LuceneIndex>())
foreach (var luceneIndexer in examineManager.Indexes.OfType<LuceneIndex>())
{
//We now need to disable waiting for indexing for Examine so that the appdomain is shutdown immediately and doesn't wait for pending
//indexing operations. We used to wait for indexing operations to complete but this can cause more problems than that is worth because
@@ -377,7 +375,7 @@ namespace Umbraco.Web.Search
//Delete all content of this content/media/member type that is in any content indexer by looking up matched examine docs
foreach (var id in ci.Value.removedIds)
{
foreach (var index in _examineManager.IndexProviders.Values.OfType<IUmbracoIndexer>())
foreach (var index in _examineManager.Indexes.OfType<IUmbracoIndexer>())
{
var searcher = index.GetSearcher();
@@ -707,7 +705,7 @@ namespace Umbraco.Web.Search
{
var valueSet = examineComponent._contentValueSetBuilder.GetValueSets(content).ToList();
foreach (var index in examineComponent._examineManager.IndexProviders.Values.OfType<IUmbracoIndexer>()
foreach (var index in examineComponent._examineManager.Indexes.OfType<IUmbracoIndexer>()
// only for the specified indexers
.Where(x => supportUnpublished.HasValue == false || supportUnpublished.Value == x.SupportSoftDelete)
.Where(x => x.EnableDefaultEventHandler))
@@ -739,7 +737,7 @@ namespace Umbraco.Web.Search
{
var valueSet = examineComponent._mediaValueSetBuilder.GetValueSets(media).ToList();
foreach (var index in examineComponent._examineManager.IndexProviders.Values.OfType<IUmbracoIndexer>()
foreach (var index in examineComponent._examineManager.Indexes.OfType<IUmbracoIndexer>()
// index this item for all indexers if the media is not trashed, otherwise if the item is trashed
// then only index this for indexers supporting unpublished media
.Where(x => isPublished || (x.SupportSoftDelete))
@@ -769,7 +767,7 @@ namespace Umbraco.Web.Search
public static void Execute(ExamineComponent examineComponent, IMember member)
{
var valueSet = examineComponent._memberValueSetBuilder.GetValueSets(member).ToList();
foreach (var index in examineComponent._examineManager.IndexProviders.Values.OfType<IUmbracoIndexer>()
foreach (var index in examineComponent._examineManager.Indexes.OfType<IUmbracoIndexer>()
//ensure that only the providers are flagged to listen execute
.Where(x => x.EnableDefaultEventHandler))
{
@@ -799,7 +797,7 @@ namespace Umbraco.Web.Search
public static void Execute(ExamineComponent examineComponent, int id, bool keepIfUnpublished)
{
var strId = id.ToString(CultureInfo.InvariantCulture);
foreach (var index in examineComponent._examineManager.IndexProviders.Values.OfType<IUmbracoIndexer>()
foreach (var index in examineComponent._examineManager.Indexes.OfType<IUmbracoIndexer>()
// if keepIfUnpublished == true then only delete this item from indexes not supporting unpublished content,
// otherwise if keepIfUnpublished == false then remove from all indexes
.Where(x => keepIfUnpublished == false || x.SupportSoftDelete == false)

View File

@@ -11,26 +11,11 @@ namespace Umbraco.Web.Search
{
public ExamineSearcherModel()
{
ProviderProperties = new Dictionary<string, string>();
}
/// <summary>
/// If the index is not healthy this represents the index error state
/// </summary>
[DataMember(Name = "error")]
public string Error { get; set; }
/// <summary>
/// If the index can be open/read
/// </summary>
[DataMember(Name = "isHealthy")]
public bool IsHealthy { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "providerProperties")]
public IDictionary<string, string> ProviderProperties { get; private set; }
}
}

View File

@@ -110,12 +110,12 @@ namespace Umbraco.Web.Search
return luceneDir;
}
public virtual IValueSetValidator GetContentValueSetValidator()
public virtual IContentValueSetValidator GetContentValueSetValidator()
{
return new ContentValueSetValidator(true, true, PublicAccessService);
}
public virtual IValueSetValidator GetPublishedContentValueSetValidator()
public virtual IContentValueSetValidator GetPublishedContentValueSetValidator()
{
return new ContentValueSetValidator(false, false, PublicAccessService);
}

View File

@@ -11,15 +11,27 @@ using Umbraco.Core.Composing;
using Umbraco.Core.Models;
using Umbraco.Core.Services;
using Umbraco.Web.Models.ContentEditing;
using Umbraco.Web.Trees;
namespace Umbraco.Web.Search
{
internal class UmbracoTreeSearcher
/// <summary>
/// Used for internal Umbraco implementations of <see cref="ISearchableTree"/>
/// </summary>
public class UmbracoTreeSearcher
{
private readonly IExamineManager _examineManager;
private readonly UmbracoHelper _umbracoHelper;
public UmbracoTreeSearcher(IExamineManager examineManager, UmbracoHelper umbracoHelper)
{
_examineManager = examineManager ?? throw new ArgumentNullException(nameof(examineManager));
_umbracoHelper = umbracoHelper ?? throw new ArgumentNullException(nameof(umbracoHelper));
}
/// <summary>
/// Searches for results based on the entity type
/// </summary>
/// <param name="umbracoHelper"></param>
/// <param name="query"></param>
/// <param name="entityType"></param>
/// <param name="totalFound"></param>
@@ -30,7 +42,6 @@ namespace Umbraco.Web.Search
/// <param name="pageIndex"></param>
/// <returns></returns>
public IEnumerable<SearchResultItem> ExamineSearch(
UmbracoHelper umbracoHelper,
string query,
UmbracoEntityTypes entityType,
int pageSize,
@@ -39,16 +50,16 @@ namespace Umbraco.Web.Search
var sb = new StringBuilder();
string type;
var indexer = Constants.Examine.InternalIndexer;
var indexName = Constants.Examine.InternalIndexer;
var fields = new[] { "id", "__NodeId" };
var umbracoContext = umbracoHelper.UmbracoContext;
var umbracoContext = _umbracoHelper.UmbracoContext;
//TODO: WE should really just allow passing in a lucene raw query
switch (entityType)
{
case UmbracoEntityTypes.Member:
indexer = Constants.Examine.InternalMemberIndexer;
indexName = Constants.Examine.InternalMemberIndexer;
type = "member";
fields = new[] { "id", "__NodeId", "email", "loginName" };
if (searchFrom != null && searchFrom != Constants.Conventions.MemberTypes.AllMembersListId && searchFrom.Trim() != "-1")
@@ -72,7 +83,10 @@ namespace Umbraco.Web.Search
throw new NotSupportedException("The " + typeof(UmbracoTreeSearcher) + " currently does not support searching against object type " + entityType);
}
var internalSearcher = ExamineManager.Instance.GetSearcher(indexer);
if (!_examineManager.TryGetIndex(indexName, out var index))
throw new InvalidOperationException("No index found by name " + indexName);
var internalSearcher = index.GetSearcher();
//build a lucene query:
// the __nodeName will be boosted 10x without wildcards
@@ -197,7 +211,7 @@ namespace Umbraco.Web.Search
case UmbracoEntityTypes.Media:
return MediaFromSearchResults(pagedResult);
case UmbracoEntityTypes.Document:
return ContentFromSearchResults(umbracoHelper, pagedResult);
return ContentFromSearchResults(pagedResult);
default:
throw new NotSupportedException("The " + typeof(UmbracoTreeSearcher) + " currently does not support searching against object type " + entityType);
}
@@ -205,15 +219,13 @@ namespace Umbraco.Web.Search
private void AppendPath(StringBuilder sb, UmbracoObjectTypes objectType, int[] startNodeIds, string searchFrom, IEntityService entityService)
{
if (sb == null) throw new ArgumentNullException("sb");
if (entityService == null) throw new ArgumentNullException("entityService");
if (sb == null) throw new ArgumentNullException(nameof(sb));
if (entityService == null) throw new ArgumentNullException(nameof(entityService));
Udi udi;
Udi.TryParse(searchFrom, true, out udi);
Udi.TryParse(searchFrom, true, out var udi);
searchFrom = udi == null ? searchFrom : entityService.GetId(udi).Result.ToString();
int searchFromId;
var entityPath = int.TryParse(searchFrom, out searchFromId) && searchFromId > 0
var entityPath = int.TryParse(searchFrom, out var searchFromId) && searchFromId > 0
? entityService.GetAllPaths(objectType, searchFromId).FirstOrDefault()
: null;
if (entityPath != null)
@@ -284,8 +296,7 @@ namespace Umbraco.Web.Search
}
if (searchResult.Values.ContainsKey("__key") && searchResult.Values["__key"] != null)
{
Guid key;
if (Guid.TryParse(searchResult.Values["__key"], out key))
if (Guid.TryParse(searchResult.Values["__key"], out var key))
{
m.Key = key;
}
@@ -317,10 +328,9 @@ namespace Umbraco.Web.Search
/// <summary>
/// Returns a collection of entities for content based on search results
/// </summary>
/// <param name="umbracoHelper"></param>
/// <param name="results"></param>
/// <returns></returns>
private IEnumerable<SearchResultItem> ContentFromSearchResults(UmbracoHelper umbracoHelper, IEnumerable<SearchResult> results)
private IEnumerable<SearchResultItem> ContentFromSearchResults(IEnumerable<SearchResult> results)
{
var mapped = Mapper.Map<IEnumerable<SearchResultItem>>(results).ToArray();
//add additional data
@@ -329,7 +339,7 @@ namespace Umbraco.Web.Search
var intId = m.Id.TryConvertTo<int>();
if (intId.Success)
{
m.AdditionalData["Url"] = umbracoHelper.Url(intId.Result);
m.AdditionalData["Url"] = _umbracoHelper.Url(intId.Result);
}
}
return mapped;