diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicGrouping.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicGrouping.cs new file mode 100644 index 0000000000..2d98dc8b21 --- /dev/null +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicGrouping.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Collections; + +namespace umbraco.MacroEngines +{ + public class DynamicGrouping : IEnumerable + { + public IEnumerable> Inner; + + public DynamicGrouping OrderBy(string expression) + { + return this; + } + + public DynamicGrouping(DynamicNodeList list, string groupBy) + { + Inner = + list + .Items + .GroupBy(item => + { + object result = null; + item.TryGetMember(new DynamicQueryableGetMemberBinder(groupBy, false), out result); + return result; + }) + .Select(item => new Grouping() + { + Key = item.Key, + Elements = item.Select(inner => inner) + }); + } + public DynamicGrouping(IEnumerable> source) + { + this.Inner = source; + } + + public IEnumerator GetEnumerator() + { + return Inner.GetEnumerator(); + } + } +} diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeList.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeList.cs index 715b3e77f4..ce2468897e 100644 --- a/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeList.cs +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/DynamicNodeList.cs @@ -60,7 +60,7 @@ namespace umbraco.MacroEngines int groupSize = 0; if (int.TryParse(args.First().ToString(), out groupSize)) { - result = new DynamicNodeList(this.InGroupsOf(groupSize).ToList()); + result = this.InGroupsOf(groupSize); return true; } result = new DynamicNull(); @@ -71,7 +71,7 @@ namespace umbraco.MacroEngines int groupCount = 0; if (int.TryParse(args.First().ToString(), out groupCount)) { - result = new DynamicNodeList(this.GroupedInto(groupCount).ToList()); + result = this.GroupedInto(groupCount); return true; } result = new DynamicNull(); @@ -79,7 +79,7 @@ namespace umbraco.MacroEngines } if (name == "GroupBy") { - result = new DynamicNodeList(this.GroupBy(args.First().ToString()).ToList()); + result = this.GroupBy(args.First().ToString()); return true; } @@ -252,20 +252,38 @@ namespace umbraco.MacroEngines { return ((IQueryable)Items.AsQueryable()).OrderBy(key); } - public IQueryable GroupBy(string key) + public DynamicGrouping GroupBy(string key) { - //return ((IQueryable)Items.AsQueryable()).OrderBy(key); - return null; + DynamicGrouping group = new DynamicGrouping(this, key); + return group; } - public IQueryable GroupedInto(int groupCount) + public DynamicGrouping GroupedInto(int groupCount) { - //return ((IQueryable)Items.AsQueryable()).OrderBy(key); - return null; + int groupSize = (int)Math.Ceiling(((decimal)Items.Count / groupCount)); + return new DynamicGrouping( + this + .Items + .Select((node, index) => new KeyValuePair(index, node)) + .GroupBy(kv => (object)(kv.Key / groupSize)) + .Select(item => new Grouping() + { + Key = item.Key, + Elements = item.Select(inner => inner.Value) + })); } - public IQueryable InGroupsOf(int groupSize) + public DynamicGrouping InGroupsOf(int groupSize) { - //return ((IQueryable)Items.AsQueryable()).OrderBy(key); - return null; + return new DynamicGrouping( + this + .Items + .Select((node, index) => new KeyValuePair(index, node)) + .GroupBy(kv => (object)(kv.Key / groupSize)) + .Select(item => new Grouping() + { + Key = item.Key, + Elements = item.Select(inner => inner.Value) + })); + } public IQueryable Select(string predicate, params object[] values) diff --git a/umbraco.MacroEngines.Juno/RazorDynamicNode/Grouping.cs b/umbraco.MacroEngines.Juno/RazorDynamicNode/Grouping.cs new file mode 100644 index 0000000000..7082944562 --- /dev/null +++ b/umbraco.MacroEngines.Juno/RazorDynamicNode/Grouping.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Collections; + +namespace umbraco.MacroEngines +{ + public class Grouping : IGrouping + { + public K Key { get; set; } + public IEnumerable Elements; + + public IEnumerator GetEnumerator() + { + return Elements.GetEnumerator(); + } + IEnumerator IEnumerable.GetEnumerator() + { + return (IEnumerator)GetEnumerator(); + } + } + +} diff --git a/umbraco.MacroEngines.Juno/umbraco.MacroEngines.csproj b/umbraco.MacroEngines.Juno/umbraco.MacroEngines.csproj index 6cce515d78..89b314a3b2 100644 --- a/umbraco.MacroEngines.Juno/umbraco.MacroEngines.csproj +++ b/umbraco.MacroEngines.Juno/umbraco.MacroEngines.csproj @@ -73,6 +73,7 @@ + Code @@ -81,6 +82,7 @@ +