Skip to content

Commit eabd1c6

Browse files
authored
Merge pull request #1888 from johnhenley/dev98/features/filtered-topics-1883
ENH: Refactor filtered topic views: performance & UX
2 parents f468f5e + 251a176 commit eabd1c6

46 files changed

Lines changed: 2240 additions & 402 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Dnn.CommunityForums/App_LocalResources/SharedResources.de-DE.resx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1901,4 +1901,22 @@ Von
19011901
<data name="[RESX:Attachment].Text" xml:space="preserve">
19021902
<value>Anhang</value>
19031903
</data>
1904+
<data name="ActiveTopics.241920min" xml:space="preserve">
1905+
<value>Letzte 6 Monate</value>
1906+
</data>
1907+
<data name="ActiveTopics.483840min" xml:space="preserve">
1908+
<value>Letzte 12 Monate</value>
1909+
</data>
1910+
<data name="ActiveTopics-241920min.Text" xml:space="preserve">
1911+
<value>Letzte 6 Monate</value>
1912+
</data>
1913+
<data name="ActiveTopics-483840min.Text" xml:space="preserve">
1914+
<value>Letzte 12 Monate</value>
1915+
</data>
1916+
<data name="ActiveTopics.2147483647min" xml:space="preserve">
1917+
<value>Ewig</value>
1918+
</data>
1919+
<data name="ActiveTopics-2147483647min.Text" xml:space="preserve">
1920+
<value>Ewig</value>
1921+
</data>
19041922
</root>

Dnn.CommunityForums/App_LocalResources/SharedResources.es-ES.resx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,4 +1900,22 @@ De
19001900
<data name="[RESX:Attachment].Text" xml:space="preserve">
19011901
<value>Anexo</value>
19021902
</data>
1903+
<data name="ActiveTopics.241920min" xml:space="preserve">
1904+
<value>Últimos 6 meses</value>
1905+
</data>
1906+
<data name="ActiveTopics.483840min" xml:space="preserve">
1907+
<value>Últimos 12 meses</value>
1908+
</data>
1909+
<data name="ActiveTopics-241920min.Text" xml:space="preserve">
1910+
<value>Últimos 6 meses</value>
1911+
</data>
1912+
<data name="ActiveTopics-483840min.Text" xml:space="preserve">
1913+
<value>Últimos 12 meses</value>
1914+
</data>
1915+
<data name="ActiveTopics.2147483647min" xml:space="preserve">
1916+
<value>Para siempre</value>
1917+
</data>
1918+
<data name="ActiveTopics-2147483647min.Text" xml:space="preserve">
1919+
<value>Para siempre</value>
1920+
</data>
19031921
</root>

Dnn.CommunityForums/App_LocalResources/SharedResources.fr-FR.resx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,4 +1897,22 @@ De,
18971897
<data name="[RESX:Attachment].Text" xml:space="preserve">
18981898
<value>Attachement</value>
18991899
</data>
1900+
<data name="ActiveTopics.241920min" xml:space="preserve">
1901+
<value>Les 6 derniers mois</value>
1902+
</data>
1903+
<data name="ActiveTopics.483840min" xml:space="preserve">
1904+
<value>Les 12 derniers mois</value>
1905+
</data>
1906+
<data name="ActiveTopics-241920min.Text" xml:space="preserve">
1907+
<value>Six derniers mois</value>
1908+
</data>
1909+
<data name="ActiveTopics-483840min.Text" xml:space="preserve">
1910+
<value>Les 12 derniers mois</value>
1911+
</data>
1912+
<data name="ActiveTopics.2147483647min" xml:space="preserve">
1913+
<value>Pour toujours</value>
1914+
</data>
1915+
<data name="ActiveTopics-2147483647min.Text" xml:space="preserve">
1916+
<value>Pour toujours</value>
1917+
</data>
19001918
</root>

Dnn.CommunityForums/App_LocalResources/SharedResources.it-IT.resx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,4 +1900,22 @@ Da
19001900
<data name="[RESX:Attachment].Text" xml:space="preserve">
19011901
<value>Allegamento</value>
19021902
</data>
1903+
<data name="ActiveTopics.241920min" xml:space="preserve">
1904+
<value>Ultimi 6 mesi</value>
1905+
</data>
1906+
<data name="ActiveTopics.483840min" xml:space="preserve">
1907+
<value>Ultimi 12 mesi</value>
1908+
</data>
1909+
<data name="ActiveTopics-241920min.Text" xml:space="preserve">
1910+
<value>Ultimi 6 mesi</value>
1911+
</data>
1912+
<data name="ActiveTopics-483840min.Text" xml:space="preserve">
1913+
<value>Ultimi 12 mesi</value>
1914+
</data>
1915+
<data name="ActiveTopics.2147483647min" xml:space="preserve">
1916+
<value>Per sempre</value>
1917+
</data>
1918+
<data name="ActiveTopics-2147483647min.Text" xml:space="preserve">
1919+
<value>Per sempre</value>
1920+
</data>
19031921
</root>

Dnn.CommunityForums/App_LocalResources/SharedResources.nl-NL.resx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1936,4 +1936,22 @@ Van,
19361936
<data name="[RESX:Attachment].Text" xml:space="preserve">
19371937
<value>Aanhechting</value>
19381938
</data>
1939+
<data name="ActiveTopics.241920min" xml:space="preserve">
1940+
<value>Laatste 6 maanden</value>
1941+
</data>
1942+
<data name="ActiveTopics.483840min" xml:space="preserve">
1943+
<value>Laatste 12 maanden</value>
1944+
</data>
1945+
<data name="ActiveTopics-241920min.Text" xml:space="preserve">
1946+
<value>Laatste 6 maanden</value>
1947+
</data>
1948+
<data name="ActiveTopics-483840min.Text" xml:space="preserve">
1949+
<value>Afgelopen 12 maanden</value>
1950+
</data>
1951+
<data name="ActiveTopics.2147483647min" xml:space="preserve">
1952+
<value>Voor altijd</value>
1953+
</data>
1954+
<data name="ActiveTopics-2147483647min.Text" xml:space="preserve">
1955+
<value>Voor altijd</value>
1956+
</data>
19391957
</root>

Dnn.CommunityForums/App_LocalResources/SharedResources.resx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,9 @@
297297
<data name="ActiveTopics.10080min" xml:space="preserve">
298298
<value>Last Week</value>
299299
</data>
300+
<data name="ActiveTopics.2147483647min" xml:space="preserve">
301+
<value>Forever</value>
302+
</data>
300303
<data name="ActiveTopics.120min" xml:space="preserve">
301304
<value>Last 2 Hours</value>
302305
</data>
@@ -331,8 +334,14 @@
331334
<value>Last 12 Hours</value>
332335
</data>
333336
<data name="ActiveTopics.80640min" xml:space="preserve">
334-
<value>Last 2 Months</value>
335-
</data>
337+
<value>Last 2 Months</value>
338+
</data>
339+
<data name="ActiveTopics.241920min" xml:space="preserve">
340+
<value>Last 6 Months</value>
341+
</data>
342+
<data name="ActiveTopics.483840min" xml:space="preserve">
343+
<value>Last 12 Months</value>
344+
</data>
336345
<data name="[RESX:About].Text" xml:space="preserve">
337346
<value>About</value>
338347
</data>
@@ -1536,6 +1545,9 @@ From,
15361545
<data name="[RESX:SplitHeader].Text" xml:space="preserve">
15371546
<value>Split mode:</value>
15381547
</data>
1548+
<data name="ActiveTopics-2147483647min.Text" xml:space="preserve">
1549+
<value>Forever</value>
1550+
</data>
15391551
<data name="ActiveTopics-15min.Text" xml:space="preserve">
15401552
<value>Last 15 minutes</value>
15411553
</data>
@@ -1575,6 +1587,12 @@ From,
15751587
<data name="ActiveTopics-80640min.Text" xml:space="preserve">
15761588
<value>Last 2 months</value>
15771589
</data>
1590+
<data name="ActiveTopics-241920min.Text" xml:space="preserve">
1591+
<value>Last 6 months</value>
1592+
</data>
1593+
<data name="ActiveTopics-483840min.Text" xml:space="preserve">
1594+
<value>Last 12 months</value>
1595+
</data>
15781596
<data name="[RESX:NewPost].Text" xml:space="preserve">
15791597
<value>new post</value>
15801598
</data>

Dnn.CommunityForums/Controllers/CategoryController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ internal void Delete(DotNetNuke.Modules.ActiveForums.Entities.CategoryInfo item)
6464
base.Delete(item);
6565
}
6666

67-
internal DotNetNuke.Modules.ActiveForums.Entities.CategoryInfo GetByName(int moduleId, string categoryName)
67+
internal virtual DotNetNuke.Modules.ActiveForums.Entities.CategoryInfo GetByName(int moduleId, string categoryName)
6868
{
6969
string cachekey = string.Format(CacheKeys.CategoryByName, moduleId, categoryName);
7070
DotNetNuke.Modules.ActiveForums.Entities.CategoryInfo categoryInfo = DataCache.ContentCacheRetrieve(moduleId, cachekey) as DotNetNuke.Modules.ActiveForums.Entities.CategoryInfo;

Dnn.CommunityForums/Controllers/ContentController.cs

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
namespace DotNetNuke.Modules.ActiveForums.Controllers
2222
{
2323
using System;
24+
using System.Collections.Generic;
25+
using System.Linq;
26+
27+
using DotNetNuke.Modules.ActiveForums.Extensions;
2428

2529
internal class ContentController : DotNetNuke.Modules.ActiveForums.Controllers.RepositoryControllerBase<DotNetNuke.Modules.ActiveForums.Entities.ContentInfo>
2630
{
@@ -51,5 +55,137 @@ public DotNetNuke.Modules.ActiveForums.Entities.ContentInfo GetById(int contentI
5155
{
5256
return this.GetById(contentId, -1);
5357
}
58+
59+
[System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.ReadabilityRules", "SA1118:Parameter should not span multiple lines", Justification = "Readability")]
60+
public static int GetMostLikesCount(int moduleId, HashSet<int> forumIds, int timeFrameMinutes)
61+
{
62+
if (forumIds == null || forumIds.Count == 0)
63+
{
64+
return 0;
65+
}
66+
67+
string cachekey = string.Format(CacheKeys.MostLikesCount, moduleId, forumIds.FromHashSetToDelimitedString<int>(";"), timeFrameMinutes);
68+
var postCount = DotNetNuke.Modules.ActiveForums.DataCache.ContentCacheRetrieve(moduleId, cachekey) as int?;
69+
if (postCount == null || !postCount.HasValue)
70+
{
71+
var forumsIdsList = forumIds.FromHashSetToDelimitedString<int>(",");
72+
if (timeFrameMinutes.Equals(int.MaxValue))
73+
{
74+
timeFrameMinutes = 0;
75+
}
76+
77+
postCount = DotNetNuke.Data.DataContext.Instance().ExecuteQuery<int?>(
78+
System.Data.CommandType.Text,
79+
$@"SELECT COUNT(DISTINCT ContentId)
80+
FROM (
81+
SELECT DISTINCT t.TopicId, 0 AS ReplyId, c.ContentId, ISNULL(l.LikeCount, 0) AS LikeCount, t.LastReplyDate
82+
FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Content] c
83+
INNER JOIN {{databaseOwner}}[{{objectQualifier}}activeforums_Topics] t1
84+
ON t1.ContentId = c.ContentId
85+
INNER JOIN {{databaseOwner}}[{{objectQualifier}}vw_activeforums_TopicsView] t
86+
ON t.TopicId = t1.TopicId
87+
INNER JOIN (SELECT PostId AS ContentId, COUNT(Id) AS LikeCount FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Likes] WHERE Checked = 1 GROUP BY PostId) l ON l.ContentId = c.ContentId
88+
WHERE t.ForumId IN (SELECT value FROM STRING_SPLIT(@0, ','))
89+
AND (@1=0 OR DATEDIFF(mi, t.LastReplyDate, GETUTCDATE()) <= @1)
90+
UNION
91+
SELECT DISTINCT r.TopicId, r.ReplyId, r.ContentId, ISNULL(l.LikeCount, 0) AS LikeCount, t.LastReplyDate
92+
FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Content] c
93+
INNER JOIN {{databaseOwner}}[{{objectQualifier}}activeforums_Replies] r
94+
ON r.ContentId = c.ContentId
95+
INNER JOIN {{databaseOwner}}[{{objectQualifier}}vw_activeforums_TopicsView] t
96+
ON t.TopicId = r.TopicId
97+
INNER JOIN (SELECT PostId AS ContentId, COUNT(Id) AS LikeCount FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Likes] WHERE Checked = 1 GROUP BY PostId) l ON l.ContentId = c.ContentId
98+
WHERE t.ForumId IN (SELECT value FROM STRING_SPLIT(@0, ','))
99+
AND (@1=0 OR DATEDIFF(mi, t.LastReplyDate, GETUTCDATE()) <= @1)
100+
) AS ContentIds",
101+
forumsIdsList,
102+
timeFrameMinutes).FirstOrDefault();
103+
DotNetNuke.Modules.ActiveForums.DataCache.ContentCacheStore(moduleId, cachekey, postCount);
104+
}
105+
106+
return postCount.Value;
107+
}
108+
109+
[System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.ReadabilityRules", "SA1118:Parameter should not span multiple lines", Justification = "Readability")]
110+
public static IEnumerable<DotNetNuke.Modules.ActiveForums.Entities.IPostInfo> GetMostLikes(int moduleId, HashSet<int> forumIds, int timeFrameMinutes, int pageId, int pageSize)
111+
{
112+
if (forumIds == null || forumIds.Count == 0)
113+
{
114+
return Enumerable.Empty<DotNetNuke.Modules.ActiveForums.Entities.IPostInfo>();
115+
}
116+
117+
var replyController = new DotNetNuke.Modules.ActiveForums.Controllers.ReplyController(moduleId);
118+
var topicController = new DotNetNuke.Modules.ActiveForums.Controllers.TopicController(moduleId);
119+
120+
string cachekey = string.Format(CacheKeys.MostLikes, moduleId, forumIds.FromHashSetToDelimitedString<int>(";"), pageId, pageSize, timeFrameMinutes);
121+
IEnumerable<DotNetNuke.Modules.ActiveForums.Entities.IPostInfo> posts = DotNetNuke.Modules.ActiveForums.DataCache.ContentCacheRetrieve(moduleId, cachekey) as IEnumerable<DotNetNuke.Modules.ActiveForums.Entities.IPostInfo>;
122+
if (posts == null)
123+
{
124+
var skip = (pageId - 1) * pageSize;
125+
var forumsIdsList = forumIds.FromHashSetToDelimitedString<int>(",");
126+
if (timeFrameMinutes.Equals(int.MaxValue))
127+
{
128+
timeFrameMinutes = 0;
129+
}
130+
131+
var postInfo = DotNetNuke.Data.DataContext.Instance().ExecuteQuery<PostIdResult>(
132+
System.Data.CommandType.Text,
133+
$@"SELECT ContentId, TopicId, ReplyId
134+
FROM (
135+
SELECT DISTINCT ContentIds.ContentId, ContentIds.TopicId, ContentIds.ReplyId, ContentIds.LikeCount
136+
FROM (
137+
SELECT DISTINCT t.TopicId, NULL AS ReplyId, c.ContentId, ISNULL(l.LikeCount, 0) AS LikeCount, t.LastReplyDate
138+
FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Content] c
139+
INNER JOIN {{databaseOwner}}[{{objectQualifier}}activeforums_Topics] t1
140+
ON t1.ContentId = c.ContentId
141+
INNER JOIN {{databaseOwner}}[{{objectQualifier}}vw_activeforums_TopicsView] t
142+
ON t.TopicId = t1.TopicId
143+
INNER JOIN (SELECT PostId AS ContentId, COUNT(Id) AS LikeCount FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Likes] WHERE Checked = 1 GROUP BY PostId) l ON l.ContentId = c.ContentId
144+
WHERE t.ForumId IN (SELECT value FROM STRING_SPLIT(@0, ','))
145+
AND (@1=0 OR DATEDIFF(mi, t.LastReplyDate, GETUTCDATE()) <= @1)
146+
UNION
147+
SELECT DISTINCT r.TopicId, r.ReplyId, r.ContentId, ISNULL(l.LikeCount, 0) AS LikeCount, t.LastReplyDate
148+
FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Content] c
149+
INNER JOIN {{databaseOwner}}[{{objectQualifier}}activeforums_Replies] r
150+
ON r.ContentId = c.ContentId
151+
INNER JOIN {{databaseOwner}}[{{objectQualifier}}vw_activeforums_TopicsView] t
152+
ON t.TopicId = r.TopicId
153+
INNER JOIN (SELECT PostId AS ContentId, COUNT(Id) AS LikeCount FROM {{databaseOwner}}[{{objectQualifier}}activeforums_Likes] WHERE Checked = 1 GROUP BY PostId) l ON l.ContentId = c.ContentId
154+
WHERE t.ForumId IN (SELECT value FROM STRING_SPLIT(@0, ','))
155+
AND (@1=0 OR DATEDIFF(mi, t.LastReplyDate, GETUTCDATE()) <= @1)
156+
) AS ContentIds
157+
INNER JOIN {{databaseOwner}}[{{objectQualifier}}vw_activeforums_TopicsView] t
158+
ON t.TopicId = ContentIds.TopicId
159+
ORDER BY ContentIds.LikeCount DESC
160+
OFFSET {skip} ROWS FETCH NEXT {pageSize} ROWS ONLY
161+
) AS ContentIds",
162+
forumsIdsList,
163+
timeFrameMinutes);
164+
165+
posts = postInfo.Where(postinfo => postinfo.ContentId.HasValue).Select(post =>
166+
{
167+
var topic = topicController.GetById(post.TopicId.Value);
168+
if (!post.ReplyId.HasValue)
169+
{
170+
return (DotNetNuke.Modules.ActiveForums.Entities.IPostInfo)topic;
171+
}
172+
173+
return (DotNetNuke.Modules.ActiveForums.Entities.IPostInfo)replyController.GetById(replyId: post.ReplyId.Value, topic: topic);
174+
});
175+
176+
DotNetNuke.Modules.ActiveForums.DataCache.ContentCacheStore(moduleId, cachekey, posts);
177+
}
178+
179+
return posts;
180+
}
181+
182+
private class PostIdResult
183+
{
184+
public int? ContentId { get; set; }
185+
186+
public int? TopicId { get; set; }
187+
188+
public int? ReplyId { get; set; }
189+
}
54190
}
55191
}

Dnn.CommunityForums/Controllers/ForumController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ public static int Forum_GetByTopicId(int moduleId, int topicId)
556556
{
557557
try
558558
{
559-
var forumTopic = new DotNetNuke.Modules.ActiveForums.Controllers.ForumTopicController(moduleId).GetForumForTopic(topicId);
559+
var forumTopic = new DotNetNuke.Modules.ActiveForums.Controllers.ForumTopicController(moduleId).GetByTopicId(topicId);
560560
if (forumTopic != null)
561561
{
562562
return forumTopic.ForumId;

Dnn.CommunityForums/Controllers/ForumTopicController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ internal ForumTopicController(int moduleId)
3737
this.moduleId = moduleId;
3838
}
3939

40-
internal DotNetNuke.Modules.ActiveForums.Entities.ForumTopicInfo GetForumForTopic(int topicId)
40+
internal DotNetNuke.Modules.ActiveForums.Entities.ForumTopicInfo GetByTopicId(int topicId)
4141
{
4242
var cachekey = this.GetCacheKey(moduleId: this.moduleId, id: topicId);
4343
var forumTopic = DataCache.ContentCacheRetrieve(this.moduleId, cachekey) as DotNetNuke.Modules.ActiveForums.Entities.ForumTopicInfo;

0 commit comments

Comments
 (0)