66using System . Data ;
77using System . Linq ;
88using Geta . NotFoundHandler . Core . Suggestions ;
9+ using X . PagedList ;
910
1011namespace Geta . NotFoundHandler . Data
1112{
@@ -20,39 +21,46 @@ public SqlSuggestionRepository(IDataExecutor dataExecutor)
2021 _dataExecutor = dataExecutor ;
2122 }
2223
23- public IEnumerable < SuggestionSummary > GetAllSummaries ( )
24+ public IPagedList < SuggestionSummary > GetSummaries ( int page , int pageSize )
2425 {
25- var summaries = new List < SuggestionSummary > ( ) ;
26- var table = GetAllSuggestions ( ) ;
26+ var table = GetSuggestionsPaged ( page , pageSize ) ;
27+ var summaries = CreateSuggestionSummaries ( table ) ;
28+ var count = CountSummaries ( ) ;
29+
30+ return new StaticPagedList < SuggestionSummary > ( summaries , page , pageSize , count ) ;
31+ }
2732
28- var suggestionsCountTable = table . DefaultView . ToTable ( true , "OldUrlCount" , "OldUrl" ) ;
33+ private IEnumerable < SuggestionSummary > CreateSuggestionSummaries ( DataTable table )
34+ {
35+ var summaries = new List < SuggestionSummary > ( ) ;
2936
30- foreach ( DataRow row in suggestionsCountTable . Rows )
37+ foreach ( DataRow row in table . Rows )
3138 {
32- var oldUrl = row [ "OldUrl" ] . ToString ( ) ;
33-
39+ var oldUrl = row [ 0 ] . ToString ( ) ;
3440 var summary = new SuggestionSummary
3541 {
36- OldUrl = oldUrl , Count = Convert . ToInt32 ( row [ "OldUrlCount" ] ) , Referers = GetReferers ( oldUrl , table ) . ToList ( )
42+ OldUrl = oldUrl ,
43+ Count = Convert . ToInt32 ( row [ 1 ] ) ,
44+ Referers = GetReferers ( oldUrl ) . ToList ( )
3745 } ;
3846 summaries . Add ( summary ) ;
3947 }
4048
4149 return summaries ;
4250 }
4351
44- private static IEnumerable < RefererSummary > GetReferers ( string url , DataTable table )
52+ private IEnumerable < RefererSummary > GetReferers ( string url )
4553 {
4654 var referers = new List < RefererSummary > ( ) ;
4755
48- var referrersTable = table . Select ( $ "OldUrl = ' { url . Replace ( "'" , "''" ) } '" , "RefererCount DESC" ) ;
49- if ( referrersTable . Length == 0 ) return referers ;
56+ var table = GetSuggestionReferers ( url ) ;
57+ if ( table == null ) return referers ;
5058
5159 var unknownReferers = 0 ;
52- foreach ( var row in referrersTable )
60+ foreach ( DataRow row in table . Rows )
5361 {
54- var referer = row [ "Referer" ] . ToString ( ) ?? string . Empty ;
55- var count = Convert . ToInt32 ( row [ "RefererCount" ] . ToString ( ) ) ;
62+ var referer = row [ 0 ] . ToString ( ) ?? string . Empty ;
63+ var count = Convert . ToInt32 ( row [ 1 ] . ToString ( ) ) ;
5664 if ( referer . Trim ( ) != string . Empty
5765 && ! referer . Contains ( "(null)" ) )
5866 {
@@ -123,20 +131,38 @@ public void Save(string oldUrl, string referer, DateTime requestedOn)
123131 _dataExecutor . ExecuteNonQuery ( sqlCommand , requestedParam , refererParam , oldUrlParam ) ;
124132 }
125133
126- private DataTable GetAllSuggestions ( )
134+ private DataTable GetSuggestionsPaged ( int ? page , int ? pageSize )
127135 {
128- var sqlCommand = $@ "
129- SELECT c.OldUrlCount, c. OldUrl, r.Referer, COUNT(r.Referer ) as RefererCount
130- FROM
131- (SELECT
132- COUNT([OldUrl]) as OldUrlCount
133- ,[OldUrl]
134- FROM { SuggestionsTable }
135- GROUP BY [OldUrl]) c
136- INNER JOIN { SuggestionsTable } r ON c.OldUrl = r.OldUrl
137- GROUP by c.OldUrlCount, c.OldUrl, r.Referer
138- ORDER BY OldUrlCount desc" ;
136+ var sqlCommand =
137+ $ "SELECT [ OldUrl], COUNT(* ) as Requests FROM { SuggestionsTable } GROUP BY [OldUrl] order by Requests desc" ;
138+
139+ if ( page . HasValue && pageSize . HasValue )
140+ {
141+ page = Math . Max ( 1 , page . Value ) ;
142+ var skip = ( page . Value - 1 ) * pageSize . Value ;
143+
144+ sqlCommand += $ " OFFSET { skip } ROWS FETCH NEXT { pageSize . Value } ROWS ONLY" ;
145+ }
146+
139147 return _dataExecutor . ExecuteQuery ( sqlCommand ) ;
140148 }
149+
150+ private int CountSummaries ( )
151+ {
152+ var sqlCommand = $ "SELECT COUNT([ID]) FROM { SuggestionsTable } ";
153+
154+ return _dataExecutor . ExecuteScalar ( sqlCommand ) ;
155+ }
156+
157+ public DataTable GetSuggestionReferers ( string url )
158+ {
159+ var sqlCommand =
160+ $ "SELECT [Referer], COUNT(*) as Requests FROM { SuggestionsTable } where [OldUrl] = @oldUrl GROUP BY [Referer] order by Requests desc";
161+
162+ var oldUrlParam = _dataExecutor . CreateParameter ( "oldUrl" , DbType . String , 2000 ) ;
163+ oldUrlParam . Value = url ;
164+
165+ return _dataExecutor . ExecuteQuery ( sqlCommand , oldUrlParam ) ;
166+ }
141167 }
142168}
0 commit comments