diff --git a/src/Umbraco.Web/Editors/EntityController.cs b/src/Umbraco.Web/Editors/EntityController.cs
index ef475603eb..71864e8bf7 100644
--- a/src/Umbraco.Web/Editors/EntityController.cs
+++ b/src/Umbraco.Web/Editors/EntityController.cs
@@ -133,7 +133,7 @@ namespace Umbraco.Web.Editors
result[treeAttribute.GetRootNodeDisplayName(Services.TextService)] = new TreeSearchResult
{
- Results = searchableTree.Value.SearchableTree.Search(query, 200, 0, out total),
+ Results = searchableTree.Value.SearchableTree.Search(Umbraco, query, 200, 0, out total),
TreeAlias = searchableTree.Key,
AppAlias = searchableTree.Value.AppAlias,
JsFormatterService = searchableTreeAttribute == null ? "" : searchableTreeAttribute.ServiceName,
diff --git a/src/Umbraco.Web/Search/ISearchableTree.cs b/src/Umbraco.Web/Search/ISearchableTree.cs
index 616b8e5763..c5eaea2258 100644
--- a/src/Umbraco.Web/Search/ISearchableTree.cs
+++ b/src/Umbraco.Web/Search/ISearchableTree.cs
@@ -14,6 +14,7 @@ namespace Umbraco.Web.Search
///
/// Searches for results based on the entity type
///
+ ///
///
///
///
@@ -22,6 +23,6 @@ namespace Umbraco.Web.Search
///
///
///
- IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null);
+ IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null);
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs b/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs
index 08c8fca2c2..843980e143 100644
--- a/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs
+++ b/src/Umbraco.Web/Search/UmbracoTreeSearcher.cs
@@ -7,6 +7,7 @@ using System.Text.RegularExpressions;
using AutoMapper;
using Examine;
using Umbraco.Core;
+using Umbraco.Core.Models;
using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Web.Search
@@ -28,9 +29,9 @@ namespace Umbraco.Web.Search
///
public IEnumerable ExamineSearch(
UmbracoHelper umbracoHelper,
- string query,
- UmbracoEntityTypes entityType,
- int pageSize,
+ string query,
+ UmbracoEntityTypes entityType,
+ int pageSize,
long pageIndex, out long totalFound, string searchFrom = null)
{
var sb = new StringBuilder();
@@ -55,35 +56,13 @@ namespace Umbraco.Web.Search
break;
case UmbracoEntityTypes.Media:
type = "media";
-
- var mediaSearchFrom = int.MinValue;
-
- if (umbracoHelper.UmbracoContext.Security.CurrentUser.StartMediaId > 0 ||
- //if searchFrom is specified and it is greater than 0
- (searchFrom != null && int.TryParse(searchFrom, out mediaSearchFrom) && mediaSearchFrom > 0))
- {
- sb.Append("+__Path: \\-1*\\,");
- sb.Append(mediaSearchFrom > 0
- ? mediaSearchFrom.ToString(CultureInfo.InvariantCulture)
- : umbracoHelper.UmbracoContext.Security.CurrentUser.StartMediaId.ToString(CultureInfo.InvariantCulture));
- sb.Append("\\,* ");
- }
+ var allMediaStartNodes = umbracoHelper.UmbracoContext.Security.CurrentUser.CalculateMediaStartNodeIds(ApplicationContext.Current.Services.EntityService);
+ AppendPath(sb, UmbracoObjectTypes.Media, allMediaStartNodes, searchFrom);
break;
case UmbracoEntityTypes.Document:
type = "content";
-
- var contentSearchFrom = int.MinValue;
-
- if (umbracoHelper.UmbracoContext.Security.CurrentUser.StartContentId > 0 ||
- //if searchFrom is specified and it is greater than 0
- (searchFrom != null && int.TryParse(searchFrom, out contentSearchFrom) && contentSearchFrom > 0))
- {
- sb.Append("+__Path: \\-1*\\,");
- sb.Append(contentSearchFrom > 0
- ? contentSearchFrom.ToString(CultureInfo.InvariantCulture)
- : umbracoHelper.UmbracoContext.Security.CurrentUser.StartContentId.ToString(CultureInfo.InvariantCulture));
- sb.Append("\\,* ");
- }
+ var allContentStartNodes = umbracoHelper.UmbracoContext.Security.CurrentUser.CalculateContentStartNodeIds(ApplicationContext.Current.Services.EntityService);
+ AppendPath(sb, UmbracoObjectTypes.Document, allContentStartNodes, searchFrom);
break;
default:
throw new NotSupportedException("The " + typeof(UmbracoTreeSearcher) + " currently does not support searching against object type " + entityType);
@@ -220,6 +199,58 @@ namespace Umbraco.Web.Search
}
}
+ private void AppendPath(StringBuilder sb, UmbracoObjectTypes objectType, int[] startNodeIds, string searchFrom)
+ {
+ var entityService = ApplicationContext.Current.Services.EntityService;
+
+ int searchFromId;
+ var entityPath = int.TryParse(searchFrom, out searchFromId) && searchFromId > 0
+ ? entityService.GetAllPaths(objectType, searchFromId).FirstOrDefault()
+ : null;
+ if (entityPath != null)
+ {
+ // find... only what's underneath
+ sb.Append("+__Path:");
+ AppendPath(sb, entityPath.Path, false);
+ sb.Append(" ");
+ }
+ else if (startNodeIds.Length == 0)
+ {
+ // make sure we don't find anything
+ sb.Append("+__Path:none ");
+ }
+ else if (startNodeIds.Contains(-1) == false) // -1 = no restriction
+ {
+ var entityPaths = entityService.GetAllPaths(objectType, startNodeIds);
+
+ // for each start node, find the start node, and what's underneath
+ // +__Path:(-1*,1234 -1*,1234,* -1*,5678 -1*,5678,* ...)
+ sb.Append("+__Path:(");
+ var first = true;
+ foreach (var ep in entityPaths)
+ {
+ if (first)
+ first = false;
+ else
+ sb.Append(" ");
+ AppendPath(sb, ep.Path, true);
+ }
+ sb.Append(") ");
+ }
+ }
+
+ private void AppendPath(StringBuilder sb, string path, bool includeThisNode)
+ {
+ path = path.Replace("-", "\\-").Replace(",", "\\,");
+ if (includeThisNode)
+ {
+ sb.Append(path);
+ sb.Append(" ");
+ }
+ sb.Append(path);
+ sb.Append("\\,*");
+ }
+
///
/// Returns a collection of entities for media based on search results
///
diff --git a/src/Umbraco.Web/Trees/ContentTreeController.cs b/src/Umbraco.Web/Trees/ContentTreeController.cs
index 9b3a6e82f8..2fc1356f5d 100644
--- a/src/Umbraco.Web/Trees/ContentTreeController.cs
+++ b/src/Umbraco.Web/Trees/ContentTreeController.cs
@@ -259,9 +259,9 @@ namespace Umbraco.Web.Trees
return menu;
}
- public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
+ public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
{
- return _treeSearcher.ExamineSearch(Umbraco, query, UmbracoEntityTypes.Document, pageSize, pageIndex, out totalFound, searchFrom);
+ return _treeSearcher.ExamineSearch(umbracoHelper, query, UmbracoEntityTypes.Document, pageSize, pageIndex, out totalFound, searchFrom);
}
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs
index 7f3a6dfddf..f6b3231f66 100644
--- a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs
+++ b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs
@@ -142,7 +142,7 @@ namespace Umbraco.Web.Trees
return menu;
}
- public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
+ public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
{
var results = Services.EntityService.GetPagedDescendantsFromRoot(UmbracoObjectTypes.DocumentType, pageIndex, pageSize, out totalFound, filter: query);
return Mapper.Map>(results);
diff --git a/src/Umbraco.Web/Trees/DataTypeTreeController.cs b/src/Umbraco.Web/Trees/DataTypeTreeController.cs
index b19d79c817..e635e84fd1 100644
--- a/src/Umbraco.Web/Trees/DataTypeTreeController.cs
+++ b/src/Umbraco.Web/Trees/DataTypeTreeController.cs
@@ -127,7 +127,7 @@ namespace Umbraco.Web.Trees
return menu;
}
- public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
+ public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
{
var results = Services.EntityService.GetPagedDescendantsFromRoot(UmbracoObjectTypes.DataType, pageIndex, pageSize, out totalFound, filter: query);
return Mapper.Map>(results);
diff --git a/src/Umbraco.Web/Trees/MediaTreeController.cs b/src/Umbraco.Web/Trees/MediaTreeController.cs
index 679d4a2d6a..114aa9cf2f 100644
--- a/src/Umbraco.Web/Trees/MediaTreeController.cs
+++ b/src/Umbraco.Web/Trees/MediaTreeController.cs
@@ -173,9 +173,9 @@ namespace Umbraco.Web.Trees
return Security.CurrentUser.HasPathAccess(media, Services.EntityService);
}
- public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
+ public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
{
- return _treeSearcher.ExamineSearch(Umbraco, query, UmbracoEntityTypes.Media, pageSize, pageIndex, out totalFound, searchFrom);
+ return _treeSearcher.ExamineSearch(umbracoHelper, query, UmbracoEntityTypes.Media, pageSize, pageIndex, out totalFound, searchFrom);
}
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs
index e402b5d64b..4708b7d79c 100644
--- a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs
+++ b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs
@@ -129,7 +129,7 @@ namespace Umbraco.Web.Trees
return menu;
}
- public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
+ public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
{
var results = Services.EntityService.GetPagedDescendantsFromRoot(UmbracoObjectTypes.MediaType, pageIndex, pageSize, out totalFound, filter: query);
return Mapper.Map>(results);
diff --git a/src/Umbraco.Web/Trees/MemberTreeController.cs b/src/Umbraco.Web/Trees/MemberTreeController.cs
index 68f12ef6ca..cc294b7fb3 100644
--- a/src/Umbraco.Web/Trees/MemberTreeController.cs
+++ b/src/Umbraco.Web/Trees/MemberTreeController.cs
@@ -184,9 +184,9 @@ namespace Umbraco.Web.Trees
return menu;
}
- public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
+ public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
{
- return _treeSearcher.ExamineSearch(Umbraco, query, UmbracoEntityTypes.Member, pageSize, pageIndex, out totalFound, searchFrom);
+ return _treeSearcher.ExamineSearch(umbracoHelper, query, UmbracoEntityTypes.Member, pageSize, pageIndex, out totalFound, searchFrom);
}
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Web/Trees/TemplatesTreeController.cs b/src/Umbraco.Web/Trees/TemplatesTreeController.cs
index c5c3c3dc70..303d47f307 100644
--- a/src/Umbraco.Web/Trees/TemplatesTreeController.cs
+++ b/src/Umbraco.Web/Trees/TemplatesTreeController.cs
@@ -133,7 +133,7 @@ namespace Umbraco.Web.Trees
: null;
}
- public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
+ public IEnumerable Search(UmbracoHelper umbracoHelper, string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null)
{
var results = Services.EntityService.GetPagedDescendantsFromRoot(UmbracoObjectTypes.Template, pageIndex, pageSize, out totalFound, filter: query);
return Mapper.Map>(results);