Skip to content

Commit

Permalink
Optimizing "Bulk Publishing" view, refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
napernik committed Sep 6, 2016
1 parent b7046e9 commit d21f9de
Show file tree
Hide file tree
Showing 8 changed files with 90 additions and 68 deletions.
@@ -1,5 +1,4 @@
using System;
using System.Linq;
using Composite.Data.Types;
using Composite.Data;
using System.Workflow.Activities;
Expand All @@ -24,7 +23,7 @@ private void initializeCodeActivity_UpdateBindings_ExecuteCode(object sender, Ev
pageType.Id = Guid.NewGuid();
pageType.Available = true;
pageType.PresetMenuTitle = true;
pageType.HomepageRelation = PageTypeHomepageRelation.NoRestriction.ToPageTypeHomepageRelationString();
pageType.HomepageRelation = nameof(PageTypeHomepageRelation.NoRestriction);
pageType.DefaultTemplateId = Guid.Empty;
pageType.DefaultChildPageType = Guid.Empty;

Expand Down
Expand Up @@ -73,7 +73,7 @@ private void initializeCodeActivity_UpdateBindings_ExecuteCode(object sender, Ev
Func<PageTypeHomepageRelation, KeyValuePair<string, string> > getOption =
relation =>
new KeyValuePair<string, string>(
relation.ToPageTypeHomepageRelationString(),
relation.ToString(),
GetText($"PageType.EditPageTypeWorkflow.HomepageRelationKeySelector.{relation}Label"));

this.Bindings.Add("HomepageRelationOptions", new List<KeyValuePair<string, string>> {
Expand All @@ -88,14 +88,14 @@ private void initializeCodeActivity_UpdateBindings_ExecuteCode(object sender, Ev
OrderBy(f => f.Title).
ToList(f => new KeyValuePair<Guid, string>(f.Id, f.Title));

var defaultPageTempatesOptions = new List<KeyValuePair<Guid, string>>
var defaultPageTemplateOptions = new List<KeyValuePair<Guid, string>>
{
new KeyValuePair<Guid, string>(Guid.Empty,
Texts.PageType_EditPageTypeWorkflow_DefaultPageTemplateKeySelector_NoneSelectedLabel)
};
defaultPageTempatesOptions.AddRange(pageTemplates);
defaultPageTemplateOptions.AddRange(pageTemplates);

this.Bindings.Add("DefaultTemplateOptions", defaultPageTempatesOptions);
this.Bindings.Add("DefaultTemplateOptions", defaultPageTemplateOptions);


this.Bindings.Add("TemplateRestrictionOptions", pageTemplates);
Expand Down Expand Up @@ -180,7 +180,8 @@ private void editCodeActivity_ValidateBindings(object sender, ConditionalEventAr
return;
}

if ((pageType.HomepageRelation == PageTypeHomepageRelation.OnlyHomePages.ToPageTypeHomepageRelationString()) && (selectedPageTypeParentRestrictions.Count > 0))
if (pageType.HomepageRelation == nameof(PageTypeHomepageRelation.OnlyHomePages)
&& selectedPageTypeParentRestrictions.Count > 0)
{
this.ShowFieldMessage("PageType.HomepageRelation", Texts.PageType_EditPageTypeWorkflow_ValidationError_HomepageRelationConflictsWithParentRestrictions);
SetSaveStatus(false);
Expand Down
7 changes: 1 addition & 6 deletions Composite/Core/Extensions/IQueryableExtensionMethods.cs
Expand Up @@ -47,12 +47,7 @@ public static bool IsEnumerableQuery<T>(this IQueryable<T> query)
return (query as DataFacadeQueryable<T>).IsEnumerableQuery;
}

if (query is CachingQueryable<T>)
{
return true;
}

return query.GetType().GetGenericTypeDefinition() == typeof(EnumerableQuery<>);
return query is CachingQueryable<T> || query is EnumerableQuery<T>;
}


Expand Down
38 changes: 29 additions & 9 deletions Composite/Data/PageFolderFacade.cs
Expand Up @@ -4,6 +4,7 @@
using System.Linq.Expressions;
using System.Reflection;
using System.Transactions;
using Composite.Core.Extensions;
using Composite.Data.DynamicTypes;
using Composite.Data.Foundation;
using Composite.Data.Types;
Expand Down Expand Up @@ -43,9 +44,15 @@ public static IEnumerable<Type> GetAllFolderTypes()
/// <returns></returns>
public static bool HasFolderDefinitions(this IPage page)
{
Verify.ArgumentNotNull(page, "page");
Verify.ArgumentNotNull(page, nameof(page));

Guid pageId = page.Id;

return DataFacade.GetData<IPageFolderDefinition>().Any(f => f.PageId == page.Id);
var definitions = DataFacade.GetData<IPageFolderDefinition>();

return definitions.IsEnumerableQuery()
? definitions.AsEnumerable().Any(f => f.PageId == pageId)
: definitions.Any(f => f.PageId == pageId);
}


Expand All @@ -57,19 +64,32 @@ public static bool HasFolderDefinitions(this IPage page)
/// <returns></returns>
public static IEnumerable<Type> GetDefinedFolderTypes(this IPage page)
{
Verify.ArgumentNotNull(page, "page");
Verify.ArgumentNotNull(page, nameof(page));

IEnumerable<Guid> typeIds =
DataFacade.GetData<IPageFolderDefinition>().
Where(f => f.PageId == page.Id).
Select(f => f.FolderTypeId).
Evaluate();
var folderDefinitions = DataFacade.GetData<IPageFolderDefinition>();

IEnumerable<Guid> typeIds;

if (folderDefinitions.IsEnumerableQuery())
{
typeIds = folderDefinitions
.Evaluate()
.Where(f => f.PageId == page.Id)
.Select(f => f.FolderTypeId);
}
else
{
typeIds = folderDefinitions
.Where(f => f.PageId == page.Id)
.Select(f => f.FolderTypeId)
.Evaluate();
}

foreach (Guid typeId in typeIds)
{
var dataTypeDescriptor = DynamicTypeManager.GetDataTypeDescriptor(typeId);
Verify.IsNotNull(dataTypeDescriptor, "Missing a page data folder type with id '{0}', referenced by a IPageFolderDefinition record", typeId);

yield return TypeManager.GetType(dataTypeDescriptor.TypeManagerTypeName);
}
}
Expand Down
59 changes: 25 additions & 34 deletions Composite/Data/Types/IPageType.cs
Expand Up @@ -36,12 +36,12 @@ public static class PageTypeHomepageRelationExtensionMethods
/// <exclude />
public static PageTypeHomepageRelation GetPageTypeHomepageRelation(this string value)
{
if (string.IsNullOrEmpty(value)) throw new ArgumentNullException("value");
if (string.IsNullOrEmpty(value)) throw new ArgumentNullException(nameof(value));

PageTypeHomepageRelation result;
if (Enum.TryParse<PageTypeHomepageRelation>(value, out result) == false)
if (!Enum.TryParse<PageTypeHomepageRelation>(value, out result))
{
throw new ArgumentException(string.Format("The argument is wrongly formattet"));
throw new ArgumentException("The argument is wrongly formatted");
}

return result;
Expand All @@ -50,6 +50,7 @@ public static PageTypeHomepageRelation GetPageTypeHomepageRelation(this string v


/// <exclude />
[Obsolete("Use nameof() keyword instead", true)]
public static string ToPageTypeHomepageRelationString(this PageTypeHomepageRelation pageTypeHomepageRelation)
{
return pageTypeHomepageRelation.ToString();
Expand All @@ -59,7 +60,7 @@ public static string ToPageTypeHomepageRelationString(this PageTypeHomepageRelat



/// <summary>
/// <summary>
/// </summary>
/// <exclude />
[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
Expand All @@ -68,47 +69,37 @@ public static class PageTypeExtensionMethods
/// <exclude />
public static IEnumerable<IPageType> GetChildPageSelectablePageTypes(this IPage parentPage, IPage childPage = null)
{
var pageTypes = DataFacade.GetData<IPageType>().AsEnumerable()
.Where(pt => pt.Available);

pageTypes = pageTypes.OrderBy(f => f.Name);

if (parentPage == null)
{
return
DataFacade.GetData<IPageType>().
Where(f => f.Available && f.HomepageRelation != PageTypeHomepageRelation.OnlySubPages.ToString()).
OrderBy(f => f.Name).
Evaluate();
return pageTypes
.Where(f => f.HomepageRelation != nameof(PageTypeHomepageRelation.OnlySubPages))
.Evaluate();
}

IEnumerable<IPageType> pageTypes;
if (childPage == null)
{
pageTypes =
DataFacade.GetData<IPageType>().
Where(f => f.Available && f.HomepageRelation != PageTypeHomepageRelation.OnlyHomePages.ToString()).
OrderBy(f => f.Name).
Evaluate();
}
else
{
pageTypes =
DataFacade.GetData<IPageType>().
Where(f =>
f.Available &&
(f.HomepageRelation != PageTypeHomepageRelation.OnlyHomePages.ToString() || f.Id == childPage.PageTypeId)).
OrderBy(f => f.Name).
Evaluate();
}
pageTypes = pageTypes
.Where(f => f.HomepageRelation != nameof(PageTypeHomepageRelation.OnlyHomePages)
&& (childPage == null || f.Id == childPage.PageTypeId))
.Evaluate();

ICollection<IPageTypeParentRestriction> parentRestrictions = null;

var result = new List<IPageType>();
foreach (IPageType pageType in pageTypes)
{
if (childPage != null && pageType.Id == childPage.PageTypeId)
{
result.Add(pageType);
result.Add(pageType);
continue;
}

var parentRestrictions = DataFacade.GetData<IPageTypeParentRestriction>()
.Where(f => f.PageTypeId == pageType.Id)
.ToList();
parentRestrictions = parentRestrictions ??
DataFacade.GetData<IPageTypeParentRestriction>().AsEnumerable()
.Where(f => f.PageTypeId == pageType.Id).ToList();

if (parentRestrictions.Count == 0 || parentRestrictions.Any(f => f.AllowedParentPageTypeId == parentPage.PageTypeId))
{
Expand All @@ -122,7 +113,7 @@ public static IEnumerable<IPageType> GetChildPageSelectablePageTypes(this IPage



/// <summary>
/// <summary>
/// </summary>
/// <exclude />
[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
Expand All @@ -149,7 +140,7 @@ public interface IPageType : IData

/// <exclude />
[StoreFieldType(PhysicalStoreFieldType.LargeString)]
[ImmutableFieldId("{CCAA5F15-63E4-42BF-8CDA-3AD0407520A7}")]
[ImmutableFieldId("{CCAA5F15-63E4-42BF-8CDA-3AD0407520A7}")]
string Description { get; set; }


Expand Down
23 changes: 18 additions & 5 deletions Composite/Data/Types/PageServices.cs
Expand Up @@ -4,6 +4,7 @@
using System.Linq;
using Composite.C1Console.Trees;
using Composite.C1Console.Users;
using Composite.Core.Extensions;
using Composite.Core.Linq;
using Composite.Data.ProcessControlled;
using Composite.Data.Transactions;
Expand Down Expand Up @@ -58,11 +59,23 @@ public static IQueryable<IPage> GetChildren(this IPage page)
/// <exclude />
public static IQueryable<IPage> GetChildren(Guid parentId)
{
return from ps in DataFacade.GetData<IPageStructure>()
join p in DataFacade.GetData<IPage>() on ps.Id equals p.Id
where ps.ParentId == parentId
orderby ps.LocalOrdering
select p;
var structure = DataFacade.GetData<IPageStructure>();
var pages = DataFacade.GetData<IPage>();

if (structure.IsEnumerableQuery() && pages.IsEnumerableQuery())
{
return (from ps in structure.AsEnumerable()
where ps.ParentId == parentId
join p in pages.AsEnumerable() on ps.Id equals p.Id
orderby ps.LocalOrdering
select p).AsQueryable();
}

return from ps in structure
where ps.ParentId == parentId
join p in pages on ps.Id equals p.Id
orderby ps.LocalOrdering
select p;

#warning revisit this - we return all versions (by design so far). Any ordering on page versions? - check history for original intent
}
Expand Down
Expand Up @@ -128,11 +128,11 @@ public IEnumerable<Element> GetRoots(SearchToken searchToken)
}
};

var allPageTypes = DataFacade.GetData<IPageType>();
var allPageTypes = DataFacade.GetData<IPageType>().AsEnumerable();

foreach (
var pageType in
allPageTypes.Where(f => f.HomepageRelation != PageTypeHomepageRelation.OnlySubPages.ToPageTypeHomepageRelationString())
allPageTypes.Where(f => f.HomepageRelation != nameof(PageTypeHomepageRelation.OnlySubPages))
.OrderByDescending(f=>f.Id))
{
element.AddAction(
Expand Down Expand Up @@ -670,7 +670,7 @@ private List<Element> GetElements(List<KeyValuePair<PageLocaleState, IPage>> pag
string localizePageLabel = StringResourceSystemFacade.GetString("Composite.Plugins.PageElementProvider", "PageElementProvider.LocalizePage");
string localizePageToolTip = StringResourceSystemFacade.GetString("Composite.Plugins.PageElementProvider", "PageElementProvider.LocalizePageToolTip");
string addNewPageLabel = StringResourceSystemFacade.GetString("Composite.Plugins.PageElementProvider", "PageElementProvider.AddSubPageFormat");
string addNewPageToolTip = StringResourceSystemFacade.GetString("Composite.Plugins.PageElementProvider", "PageElementProvider.AddSubPageToolTip");
//string addNewPageToolTip = StringResourceSystemFacade.GetString("Composite.Plugins.PageElementProvider", "PageElementProvider.AddSubPageToolTip");
string deletePageLabel = StringResourceSystemFacade.GetString("Composite.Plugins.PageElementProvider", "PageElementProvider.Delete");
string deletePageToolTip = StringResourceSystemFacade.GetString("Composite.Plugins.PageElementProvider", "PageElementProvider.DeleteToolTip");

Expand All @@ -681,7 +681,7 @@ private List<Element> GetElements(List<KeyValuePair<PageLocaleState, IPage>> pag
}

var elements = new Element[pages.Count];
var allPageTypes = DataFacade.GetData<IPageType>();
var allPageTypes = DataFacade.GetData<IPageType>().AsEnumerable();

ParallelFacade.For("PageElementProvider. Getting elements", 0, pages.Count, i =>
{
Expand All @@ -696,7 +696,7 @@ private List<Element> GetElements(List<KeyValuePair<PageLocaleState, IPage>> pag
var element = new Element(_context.CreateElementHandle(entityToken), MakeVisualData(page, kvp.Key, urlMappingName, rootPages), dragAndDropInfo);
element.PropertyBag.Add("Uri", "~/page({0})".FormatWith(page.Id));
element.PropertyBag.Add("Uri", $"~/page({page.Id})");
element.PropertyBag.Add("ElementType", "application/x-composite-page");
element.PropertyBag.Add("DataId", page.Id.ToString());
Expand Down
7 changes: 5 additions & 2 deletions Website/Composite/services/Tree/TreeServices.asmx
Expand Up @@ -189,9 +189,12 @@ namespace Composite.Services
elementBundles.Add(elementBundle);
}

foreach (var element in GetPublishControlledDescendants(child.ElementHandle))
if (child.VisualData.HasChildren)
{
yield return element;
foreach (var element in GetPublishControlledDescendants(child.ElementHandle))
{
yield return element;
}
}
}
}
Expand Down

0 comments on commit d21f9de

Please sign in to comment.