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(