6060 // Delete the records with UserID=0 (Guests) from UserRole table
6161 // FIX: https://github.com/topcoder-platform/forums/issues/108
6262 Gdn::sql ()->delete ('UserRole ' ,['UserID ' => 0 ]);
63+
64+ // FIX: https://github.com/topcoder-platform/forums/issues/227
65+ // Sorting discussions by last date.
66+ // The last date can be any of InsertedDate(discussion), UpdatedDate(discussion), InsertedDate(comment) or UpdatedDate(comment).
67+ // The new columns will be added to keep the last date and who made changes.
68+ // By default Vanilla uses only DateInserted in calculated columns.
69+ // Moreover, the calculated columns (LastCommentID, LastDiscussionID and others) are used in calculations/aggregations.
70+ // Don't modified default Vanilla calculated columns.
71+ if (!Gdn::structure ()->table ('Discussion ' )->columnExists ('LastDiscussionCommentsDate ' )) {
72+ Gdn::structure ()->table ('Discussion ' )
73+ ->column ('LastDiscussionCommentsDate ' , 'datetime ' , true , ['index ' , 'index.CategoryPages ' ])
74+ ->column ('LastDiscussionCommentsUserID ' , 'int ' , true )
75+ ->set (false , false );
76+ // Step 1. Calculate the last date for discussions.
77+ $ query = "UPDATE GDN_Discussion p
78+ SET p.LastDiscussionCommentsDate = (SELECT greatest(COALESCE(MAX(c.DateInserted), 0), COALESCE(MAX(c.DateUpdated), 0), COALESCE(p.DateUpdated, 0), COALESCE(p.DateInserted,0))
79+ FROM GDN_Comment c WHERE p.DiscussionID = c.DiscussionID) " ;
80+ Gdn::sql ()->query ($ query );
81+
82+ // Step 2. Update discussions with comments.
83+ $ query = "UPDATE GDN_Discussion p
84+ SET p.LastDiscussionCommentsUserID = (
85+ SELECT CASE
86+ WHEN COALESCE(p.DateUpdated,p.DateInserted) > COALESCE(c.DateUpdated,c.DateInserted) THEN
87+ COALESCE(p.UpdateUserID, p.InsertUserID)
88+ ELSE COALESCE(c.UpdateUserID,c.InsertUserID) END AS LastUserID FROM GDN_Comment c
89+ WHERE c.DiscussionID = p.DiscussionID ORDER BY c.DateUpdated DESC,c.DateInserted DESC LIMIT 1) " ;
90+ Gdn::sql ()->query ($ query );
91+
92+ // Step 3. Update discussions without comments.
93+ $ query ="UPDATE GDN_Discussion p
94+ SET p.LastDiscussionCommentsUserID = COALESCE(p.UpdateUserID,p.InsertUserID)
95+ WHERE p.LastDiscussionCommentsUserID IS NULL " ;
96+ Gdn::sql ()->query ($ query );
97+ }
98+
99+ // Sorting categories by the last date
100+ // https://github.com/topcoder-platform/forums/issues/227
101+ if (!Gdn::structure ()->table ('Category ' )->columnExists ('LastDiscussionCommentsUserID ' )) {
102+ Gdn::structure ()->table ('Category ' )
103+ ->column ('LastDiscussionCommentsUserID ' , 'int ' , true )
104+ ->column ('LastDiscussionCommentsDiscussionID ' , 'int ' , true )
105+ ->column ('LastDiscussionCommentsDate ' , 'datetime ' , true )
106+ ->set (false , false );
107+
108+ // Step1. Update categories with type 'discussions':
109+ $ query = "UPDATE GDN_Category c
110+ SET c.LastDiscussionCommentsDate = (SELECT MAX(d.LastDiscussionCommentsDate)FROM GDN_Discussion d WHERE d.CategoryID = c.CategoryID),
111+ c.LastDiscussionCommentsUserID = (SELECT d.LastDiscussionCommentsUserID FROM GDN_Discussion d
112+ WHERE d.CategoryID = c.CategoryID ORDER BY d.LastDiscussionCommentsDate DESC limit 1),
113+ c.LastDiscussionCommentsDiscussionID = (SELECT d.DiscussionID FROM GDN_Discussion d
114+ WHERE d.CategoryID = c.CategoryID ORDER BY d.LastDiscussionCommentsDate DESC limit 1) " ;
115+ Gdn::sql ()->query ($ query );
116+
117+
118+ // Step2. Update all ancestor categories.
119+ // The MAX category depth is 4 for challenges
120+ $ ancestorQuery = "UPDATE GDN_Category pc, (
121+ SELECT c1.ParentCategoryID AS ParentCategoryID, c1.LastDiscussionCommentsDate, c1.LastDiscussionCommentsUserID, c1.LastDiscussionCommentsDiscussionID
122+ FROM GDN_Category c1 inner join (SELECT c.ParentCategoryID, MAX(c.LastDiscussionCommentsDate) AS LastDiscussionCommentsDate FROM GDN_Category c
123+ GROUP BY c.ParentCategoryID) c2 on c1.ParentCategoryID = c2.ParentCategoryID AND c1.LastDiscussionCommentsDate = c2.LastDiscussionCommentsDate) c3
124+ SET pc.LastDiscussionCommentsDiscussionID = c3.LastDiscussionCommentsDiscussionID, pc.LastDiscussionCommentsUserID = c3.LastDiscussionCommentsUserID,
125+ pc.LastDiscussionCommentsDate = c3.LastDiscussionCommentsDate
126+ WHERE pc.CategoryID = c3.ParentCategoryID AND pc.Depth = %d " ;
127+
128+ for ($ i = 3 ; $ i > -1 ; $ i --) {
129+ Gdn::sql ()->query (sprintf ($ ancestorQuery , $ i ));
130+ }
131+
132+ //Step 3. Update categories without discussions.
133+ $ emptyAncestorQuery = "UPDATE GDN_Category p
134+ SET p.LastDiscussionCommentsDate = COALESCE(p.DateUpdated, p.DateInserted)
135+ WHERE p.LastDiscussionCommentsDate IS NULL && p.LastDiscussionCommentsUserID IS NULL &&
136+ p.LastDiscussionCommentsDiscussionID IS NULL " ;
137+ Gdn::sql ()->query ($ emptyAncestorQuery );
138+ }
139+
63140}
0 commit comments