diff --git a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs index 8a8f693bd7..eeb7cb4022 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedMediaTests.cs @@ -108,7 +108,44 @@ namespace Umbraco.Tests.PublishedContent return GetNode(id, GetUmbracoContext("/test", 1234)); } - [Test] + [Test] + public void Do_Not_Find_In_Recycle_Bin() + { + var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString())); + var indexInit = new IndexInitializer(); + var indexer = indexInit.GetUmbracoIndexer(newIndexFolder); + indexer.RebuildIndex(); + var searcher = indexInit.GetUmbracoSearcher(newIndexFolder); + var store = new DefaultPublishedMediaStore(searcher); + var ctx = GetUmbracoContext("/test", 1234); + + //ensure it is found + var publishedMedia = store.GetDocumentById(ctx, 3113); + Assert.IsNotNull(publishedMedia); + + //move item to recycle bin + var newXml = XElement.Parse(@" + + 115 + 268 + 10726 + jpg + "); + indexer.ReIndexNode(newXml, "media"); + + //ensure it still exists in the index (raw examine search) + var criteria = searcher.CreateSearchCriteria(); + var filter = criteria.Id(3113); + var found = searcher.Search(filter.Compile()); + Assert.IsNotNull(found); + Assert.AreEqual(1, found.TotalItemCount); + + //ensure it does not show up in the published media store + var recycledMedia = store.GetDocumentById(ctx, 3113); + Assert.IsNull(recycledMedia); + } + + [Test] public void Children_With_Examine() { var newIndexFolder = new DirectoryInfo(Path.Combine("App_Data\\CWSIndexSetTest", Guid.NewGuid().ToString())); diff --git a/src/Umbraco.Web/DefaultPublishedMediaStore.cs b/src/Umbraco.Web/DefaultPublishedMediaStore.cs index 2a35ca3619..64c6d760f0 100644 --- a/src/Umbraco.Web/DefaultPublishedMediaStore.cs +++ b/src/Umbraco.Web/DefaultPublishedMediaStore.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Xml.XPath; using Examine; +using Examine.LuceneEngine.SearchCriteria; using Examine.Providers; using Lucene.Net.Documents; using Umbraco.Core; @@ -108,7 +109,11 @@ namespace Umbraco.Web { //first check in Examine as this is WAY faster var criteria = searchProvider.CreateSearchCriteria("media"); - var filter = criteria.Id(id).Not().Field(UmbracoContentIndexer.IndexPathFieldName, "-21"); + + var filter = criteria.Id(id).Not().Field(UmbracoContentIndexer.IndexPathFieldName, "-1,-21,".MultipleCharacterWildcard()); + //the above filter will create a query like this, NOTE: That since the use of the wildcard, it automatically escapes it in Lucene. + //+(+__NodeId:3113 -__Path:-1,-21,*) +__IndexType:media + var results = searchProvider.Search(filter.Compile()); if (results.Any()) { diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Search/ExamineEvents.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Search/ExamineEvents.cs index 45abc5be22..e3077abd09 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Search/ExamineEvents.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Search/ExamineEvents.cs @@ -62,12 +62,12 @@ namespace umbraco.presentation.umbraco.Search void ContentService_Trashed(IContentService sender, Umbraco.Core.Events.MoveEventArgs e) { - IndexContent(e.Entity); + DeleteContent(e.Entity); } void MediaService_Trashed(IMediaService sender, Umbraco.Core.Events.MoveEventArgs e) { - IndexMedia(e.Entity); + DeleteMedia(e.Entity); } void ContentService_Moved(IContentService sender, Umbraco.Core.Events.MoveEventArgs e) @@ -77,16 +77,13 @@ namespace umbraco.presentation.umbraco.Search void ContentService_Deleted(IContentService sender, Umbraco.Core.Events.DeleteEventArgs e) { - e.DeletedEntities.ForEach( - content => - ExamineManager.Instance.DeleteFromIndex( - content.Id.ToString(), - ExamineManager.Instance.IndexProviderCollection.OfType().Where(x => x.EnableDefaultEventHandler))); + e.DeletedEntities.ForEach(DeleteContent); } void ContentService_Saved(IContentService sender, Umbraco.Core.Events.SaveEventArgs e) { - e.SavedEntities.ForEach(IndexContent); + //ensure we do not re-index it if it is in the bin + e.SavedEntities.Where(x => !x.Trashed).ForEach(IndexContent); } void MediaService_Moved(IMediaService sender, Umbraco.Core.Events.MoveEventArgs e) @@ -96,16 +93,13 @@ namespace umbraco.presentation.umbraco.Search void MediaService_Deleted(IMediaService sender, Umbraco.Core.Events.DeleteEventArgs e) { - e.DeletedEntities.ForEach( - media => - ExamineManager.Instance.DeleteFromIndex( - media.Id.ToString(), - ExamineManager.Instance.IndexProviderCollection.OfType().Where(x => x.EnableDefaultEventHandler))); + e.DeletedEntities.ForEach(DeleteMedia); } void MediaService_Saved(IMediaService sender, Umbraco.Core.Events.SaveEventArgs e) { - e.SavedEntities.ForEach(IndexMedia); + //ensure we do not re-index it if it is in the bin + e.SavedEntities.Where(x => !x.Trashed).ForEach(IndexMedia); } private void IndexMedia(IMedia sender) @@ -115,6 +109,20 @@ namespace umbraco.presentation.umbraco.Search ExamineManager.Instance.IndexProviderCollection.OfType().Where(x => x.EnableDefaultEventHandler)); } + private void DeleteContent(IContent sender) + { + ExamineManager.Instance.DeleteFromIndex( + sender.Id.ToString(), + ExamineManager.Instance.IndexProviderCollection.OfType().Where(x => x.EnableDefaultEventHandler)); + } + + private void DeleteMedia(IMedia sender) + { + ExamineManager.Instance.DeleteFromIndex( + sender.Id.ToString(), + ExamineManager.Instance.IndexProviderCollection.OfType().Where(x => x.EnableDefaultEventHandler)); + } + private void IndexContent(IContent sender) { ExamineManager.Instance.ReIndexNode(