From f5d4ebe686269f9c825d3881a08d966d79ad6059 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 1 Dec 2003 16:04:35 +0000 Subject: [PATCH] I was adding a special page (dead-end pages), and I realized that almost all the special query pages were pretty much identical. I copy-and-pasted one to make the one I was working on, and I realized that that was Wrong. So, I took the common elements and made them into a class, QueryPage.php. Then, I derived each of the existing special pages from QueryPage, and overrode places where they differed. This is a Recipe pattern, btw, for those of you following along at home. Anyways, the upshot is that the query pages are a lot shorter, with just the essentials that make them different from other query pages, and there's one place to make big UI changes for all queries. --- includes/QueryPage.php | 104 +++++++++++++++++++++++++++++++ includes/SpecialAncientpages.php | 65 +++++++++---------- includes/SpecialDeadendpages.php | 71 +++++++-------------- includes/SpecialLonelypages.php | 66 +++++++------------- includes/SpecialLongpages.php | 68 ++++++++------------ includes/SpecialNewpages.php | 82 ++++++++++++++---------- includes/SpecialPopularpages.php | 63 +++++++++---------- includes/SpecialShortpages.php | 72 +++++++++------------ includes/SpecialWantedpages.php | 91 +++++++++++---------------- 9 files changed, 351 insertions(+), 331 deletions(-) create mode 100644 includes/QueryPage.php diff --git a/includes/QueryPage.php b/includes/QueryPage.php new file mode 100644 index 0000000000..50f34c3405 --- /dev/null +++ b/includes/QueryPage.php @@ -0,0 +1,104 @@ +getName(); + $fname = get_class($this) . "::doQuery"; + + if ( $this->isExpensive( ) ) { + + $vsp = $wgLang->getValidSpecialPages(); + $logpage = new LogPage( $vsp[$sname] ); + $logpage->mUpdateRecentChanges = false; + + if ( $wgMiserMode ) { + $logpage->showAsDisabledPage(); + return; + } + } + + $sql = $this->getSQL( $offset, $limit ); + + $res = wfQuery( $sql, DB_READ, $fname ); + + $sk = $wgUser->getSkin( ); + + $top = wfShowingResults( $offset, $limit ); + $wgOut->addHTML( "

{$top}\n" ); + + $sl = wfViewPrevNext( $offset, $limit, $wgLang->specialPage( $sname ) ); + $wgOut->addHTML( "
{$sl}\n" ); + + $s = "

    "; + while ( $obj = wfFetchObject( $res ) ) { + $format = $this->formatResult( $sk, $obj ); + $s .= "
  1. {$format}
  2. \n"; + } + wfFreeResult( $res ); + $s .= "
"; + $wgOut->addHTML( $s ); + $wgOut->addHTML( "

{$sl}\n" ); + + # Saving cache + + if ( $this->isExpensive() && $offset == 0 && $limit >= 50 ) { + $logpage->replaceContent( $s ); + } + } +} + +# This is a subclass for very simple queries that are just looking for page +# titles that match some criteria. It formats each result item as a link to +# that page. + +class PageQueryPage extends QueryPage { + + function formatResult( $skin, $result ) { + return $skin->makeKnownLink( $result->cur_title, "" ); + } +} + +?> diff --git a/includes/SpecialAncientpages.php b/includes/SpecialAncientpages.php index 60c736a54d..a93a4eb961 100644 --- a/includes/SpecialAncientpages.php +++ b/includes/SpecialAncientpages.php @@ -1,45 +1,40 @@ addHTML( "

{$top}\n" ); - - $sl = wfViewPrevNext( $offset, $limit, - $wgLang->specialPage( "Ancientpages" ) ); - $wgOut->addHTML( "
{$sl}\n" ); - - $sk = $wgUser->getSkin(); - $s = "

    "; - while ( $obj = wfFetchObject( $res ) ) { - $u = $obj->cur_user; - $ut = $obj->cur_user_text; - $c = wfEscapeHTML( $obj->cur_comment ); - if ( 0 == $u ) { $ul = $ut; } - else { $ul = $sk->makeLink( $wgLang->getNsText(2).":{$ut}", $ut ); } - - $d = $wgLang->timeanddate( $obj->cur_timestamp, true ); - $link = $sk->makeKnownLink( $obj->cur_title, "" ); - $s .= "
  1. {$d} {$link} . . {$ul}"; + } + + function formatResult( $skin, $result ) { + global $wgLang; + + $d = $wgLang->timeanddate( $result->cur_timestamp, true ); + $link = $skin->makeKnownLink( $result->cur_title, "" ); + return "{$link} ({$d})"; + } +} - if ( "" != $c && "*" != $c ) { $s .= " ({$c})"; } - $s .= "
  2. \n"; - } - wfFreeResult( $res ); - $s .= "
"; - $wgOut->addHTML( $s ); - $wgOut->addHTML( "

{$sl}\n" ); +function wfSpecialAncientpages() +{ + list( $limit, $offset ) = wfCheckLimits(); + + $app = new AncientPagesPage(); + + $app->doQuery( $offset, $limit ); } ?> diff --git a/includes/SpecialDeadendpages.php b/includes/SpecialDeadendpages.php index aaec95ab83..b74f20c6e0 100644 --- a/includes/SpecialDeadendpages.php +++ b/includes/SpecialDeadendpages.php @@ -1,59 +1,36 @@ getValidSpecialPages(); - $log = new LogPage( $vsp["Deadendpages"] ); - $log->mUpdateRecentChanges = false; + function isExpensive( ) { + return 1; + } - global $wgMiserMode; - if ( $wgMiserMode ) { - $log->showAsDisabledPage(); - return; + function getSQL( $offset, $limit ) { + return "SELECT cur_title " . + "FROM cur LEFT JOIN links ON cur_title = l_from " . + "WHERE l_from IS NULL " . + "AND cur_namespace = 0 " . + "ORDER BY cur_title " . + "LIMIT {$offset}, {$limit}"; } +} + +function wfSpecialDeadendpages() { list( $limit, $offset ) = wfCheckLimits(); - # Note: title is only the same as l_from for main namespace, - # but that's what we want, anyways - - # XXX: Left joins are losey - - $sql = "SELECT cur_title " . - "FROM cur LEFT JOIN links ON cur_title = l_from " . - "WHERE l_from IS NULL " . - "AND cur_namespace = 0 " . - "ORDER BY cur_title " . - "LIMIT {$offset}, {$limit}"; - - $res = wfQuery( $sql, DB_READ, $fname ); - - $sk = $wgUser->getSkin(); - - $top = wfShowingResults( $offset, $limit ); - $wgOut->addHTML( "

{$top}\n" ); - - $sl = wfViewPrevNext( $offset, $limit, - $wgLang->specialPage( "Deadendpages" ) ); - $wgOut->addHTML( "
{$sl}\n" ); - - $s = "

    "; - while ( $obj = wfFetchObject( $res ) ) { - $link = $sk->makeKnownLink( $obj->cur_title, "" ); - $s .= "
  1. {$link}
  2. \n"; - } - wfFreeResult( $res ); - $s .= "
"; - $wgOut->addHTML( $s ); - $wgOut->addHTML( "

{$sl}\n" ); + $depp = new DeadendPagesPage(); - # Saving cache - if ( $offset > 0 OR $limit < 50 ) return ; #Not suitable - $log->replaceContent( $s ); + return $depp->doQuery( $offset, $limit ); } ?> diff --git a/includes/SpecialLonelypages.php b/includes/SpecialLonelypages.php index 2983b32847..40bd400fd4 100644 --- a/includes/SpecialLonelypages.php +++ b/includes/SpecialLonelypages.php @@ -1,50 +1,32 @@ getValidSpecialPages(); - $log = new LogPage( $vsp["Lonelypages"] ); - $log->mUpdateRecentChanges = false; - - global $wgMiserMode; - if ( $wgMiserMode ) { - $log->showAsDisabledPage(); - return; - } - - list( $limit, $offset ) = wfCheckLimits(); - - $sql = "SELECT cur_title FROM cur LEFT JOIN links ON " . +include_once( "QueryPage.php" ); + +class LonelyPagesPage extends PageQueryPage { + + function getName() { + return "Lonelypages"; + } + + function isExpensive() { + return 1; + } + + function getSQL( $offset, $limit ) { + + return "SELECT cur_title FROM cur LEFT JOIN links ON " . "cur_id=l_to WHERE l_to IS NULL AND cur_namespace=0 AND " . "cur_is_redirect=0 ORDER BY cur_title LIMIT {$offset}, {$limit}"; - $res = wfQuery( $sql, DB_READ, $fname ); - - $sk = $wgUser->getSkin(); - - $top = wfShowingResults( $offset, $limit ); - $wgOut->addHTML( "

{$top}\n" ); - - $sl = wfViewPrevNext( $offset, $limit, - $wgLang->specialPage( "Lonelypages" ) ); - $wgOut->addHTML( "
{$sl}\n" ); - - $s = "

    "; - while ( $obj = wfFetchObject( $res ) ) { - $link = $sk->makeKnownLink( $obj->cur_title, "" ); - $s .= "
  1. {$link}
  2. \n"; - } - wfFreeResult( $res ); - $s .= "
"; - $wgOut->addHTML( $s ); - $wgOut->addHTML( "

{$sl}\n" ); + } +} - # Saving cache - if ( $offset > 0 OR $limit < 50 ) return ; #Not suitable - $log->replaceContent( $s ); +function wfSpecialLonelypages() +{ + list( $limit, $offset ) = wfCheckLimits(); + + $lpp = new LonelyPagesPage(); + + return $lpp->doQuery( $offset, $limit ); } ?> diff --git a/includes/SpecialLongpages.php b/includes/SpecialLongpages.php index 0ebcb7e3c9..44fa88afd9 100644 --- a/includes/SpecialLongpages.php +++ b/includes/SpecialLongpages.php @@ -1,51 +1,37 @@ getValidSpecialPages(); - $log = new LogPage( $vsp["Longpages"] ); - $log->mUpdateRecentChanges = false; - - global $wgMiserMode; - if ( $wgMiserMode ) { - $log->showAsDisabledPage(); - return; - } - - list( $limit, $offset ) = wfCheckLimits(); - - $sql = "SELECT cur_title, LENGTH(cur_text) AS len FROM cur " . +include_once( "QueryPage.php" ); + +class LongPagesPage extends QueryPage { + + function getName() { + return "Longpages"; + } + + function isExpensive() { + return 1; + } + + function getSQL( $offset, $limit ) { + return "SELECT cur_title, LENGTH(cur_text) AS len FROM cur " . "WHERE cur_namespace=0 AND cur_is_redirect=0 ORDER BY " . "LENGTH(cur_text) DESC LIMIT {$offset}, {$limit}"; - $res = wfQuery( $sql, DB_READ, $fname ); + } - $sk = $wgUser->getSkin(); - - $top = wfShowingResults( $offset, $limit ); - $wgOut->addHTML( "

{$top}\n" ); - - $sl = wfViewPrevNext( $offset, $limit, - $wgLang->specialPage( "Longpages" ) ); - $wgOut->addHTML( "
{$sl}\n" ); + function formatResult( $skin, $result ) { + $nb = wfMsg( "nbytes", $result->len ); + $link = $skin->makeKnownLink( $result->cur_title, "" ); + return "{$link} ({$nb})"; + } +} - $s = "

    "; - while ( $obj = wfFetchObject( $res ) ) { - $nb = wfMsg( "nbytes", $obj->len ); - $link = $sk->makeKnownLink( $obj->cur_title, "" ); - $s .= "
  1. {$link} ({$nb})
  2. \n"; - } - wfFreeResult( $res ); - $s .= "
"; - $wgOut->addHTML( $s ); - $wgOut->addHTML( "

{$sl}\n" ); +function wfSpecialLongpages() +{ + list( $limit, $offset ) = wfCheckLimits(); - # Saving cache - if ( $offset > 0 OR $limit < 50 ) return ; #Not suitable - $log->replaceContent( $s ); + $lpp = new LongPagesPage( ); + + $lpp->doQuery( $offset, $limit ); } ?> diff --git a/includes/SpecialNewpages.php b/includes/SpecialNewpages.php index 3d0dc43cd5..ddeafa23e7 100644 --- a/includes/SpecialNewpages.php +++ b/includes/SpecialNewpages.php @@ -1,46 +1,60 @@ addHTML( "

{$top}\n" ); - - $sl = wfViewPrevNext( $offset, $limit, - $wgLang->specialPage( "Newpages" ) ); - $wgOut->addHTML( "
{$sl}\n" ); - - $sk = $wgUser->getSkin(); - $s = "

    "; - while ( $obj = wfFetchObject( $res ) ) { - $u = $obj->cur_user; - $ut = $obj->cur_user_text; - $length= wfmsg("nbytes",$obj->cur_length); - $c = wfEscapeHTML( $obj->cur_comment ); - if ( 0 == $u ) { $ul = $ut; } - else { $ul = $sk->makeLink( $wgLang->getNsText(2).":{$ut}", $ut ); } + } + + function formatResult( $skin, $result ) { + + global $wgLang; + + $u = $result->cur_user; + $ut = $result->cur_user_text; + + $length = wfmsg( "nbytes", $result->cur_length ); + $c = wfEscapeHTML( $result->cur_comment ); + + if ( 0 == $u ) { # not by a logged-in user + $ul = $ut; + } + else { + $ul = $skin->makeLink( $wgLang->getNsText(2) . ":{$ut}", $ut ); + } + + $d = $wgLang->timeanddate( $result->cur_timestamp, true ); + $link = $skin->makeKnownLink( $result->cur_title, "" ); + $s = "{$d} {$link} ({$length}) . . {$ul}"; + + if ( "" != $c && "*" != $c ) { + $s .= " ({$c})"; + } - $d = $wgLang->timeanddate( $obj->cur_timestamp, true ); - $link = $sk->makeKnownLink( $obj->cur_title, "" ); - $s .= "
  1. {$d} {$link} ({$length}) . . {$ul}"; + return $s; + } +} - if ( "" != $c && "*" != $c ) { $s .= " ({$c})"; } - $s .= "
  2. \n"; - } - wfFreeResult( $res ); - $s .= "
"; - $wgOut->addHTML( $s ); - $wgOut->addHTML( "

{$sl}\n" ); +function wfSpecialNewpages() +{ + list( $limit, $offset ) = wfCheckLimits(); + + $npp = new NewPagesPage(); + + $npp->doQuery( $offset, $limit ); } ?> diff --git a/includes/SpecialPopularpages.php b/includes/SpecialPopularpages.php index 303a909f57..1e0db4e7a2 100644 --- a/includes/SpecialPopularpages.php +++ b/includes/SpecialPopularpages.php @@ -1,42 +1,37 @@ addWikiText( wfMsg( "perfdisabled" ) ); - return; - } - - list( $limit, $offset ) = wfCheckLimits(); - - $sql = "SELECT DISTINCT cur_title, cur_counter FROM cur " . +include_once( "QueryPage.php" ); + +class PopularPagesPage extends QueryPage { + + function getName() { + return "Popularpages"; + } + + function isExpensive() { + return 1; + } + + function getSQL( $offset, $limit ) { + return "SELECT DISTINCT cur_title, cur_counter FROM cur " . "WHERE cur_namespace=0 AND cur_is_redirect=0 ORDER BY " . "cur_counter DESC LIMIT {$offset}, {$limit}"; - $res = wfQuery( $sql, DB_READ, $fname ); - - $sk = $wgUser->getSkin(); - - $top = wfShowingResults( $offset, $limit ); - $wgOut->addHTML( "

{$top}\n" ); - - $sl = wfViewPrevNext( $offset, $limit, - $wgLang->specialPage( "Popularpages" ) ); - $wgOut->addHTML( "
{$sl}\n" ); + } + + function formatResult( $skin, $result ) { + $link = $skin->makeKnownLink( $result->cur_title, "" ); + $nv = wfMsg( "nviews", $result->cur_counter ); + return "{$link} ({$nv})"; + } +} - $s = "

    "; - while ( $obj = wfFetchObject( $res ) ) { - $nv = wfMsg( "nviews", $obj->cur_counter ); - $link = $sk->makeKnownLink( $obj->cur_title, "" ); - $s .= "
  1. {$link} ({$nv})
  2. \n"; - } - wfFreeResult( $res ); - $s .= "
"; - $wgOut->addHTML( $s ); - $wgOut->addHTML( "

{$sl}\n" ); +function wfSpecialPopularpages() +{ + list( $limit, $offset ) = wfCheckLimits(); + + $ppp = new PopularPagesPage(); + + return $ppp->doQuery( $offset, $limit ); } ?> diff --git a/includes/SpecialShortpages.php b/includes/SpecialShortpages.php index bca5e8edc3..c74158f262 100644 --- a/includes/SpecialShortpages.php +++ b/includes/SpecialShortpages.php @@ -1,51 +1,37 @@ getValidSpecialPages(); - $log = new LogPage( $vsp["Shortpages"] ); - $log->mUpdateRecentChanges = false; - - global $wgMiserMode; - if ( $wgMiserMode ) { - $log->showAsDisabledPage(); - return; - } - - list( $limit, $offset ) = wfCheckLimits(); - - $sql = "SELECT cur_title, LENGTH(cur_text) AS len FROM cur " . +include_once("QueryPage.php"); + +class ShortPagesPage extends QueryPage { + + function getName() { + return "Shortpages"; + } + + function isExpensive() { + return 1; + } + + function getSQL( $offset, $limit ) { + return "SELECT cur_title, LENGTH(cur_text) AS len FROM cur " . "WHERE cur_namespace=0 AND cur_is_redirect=0 ORDER BY " . "LENGTH(cur_text) LIMIT {$offset}, {$limit}"; - $res = wfQuery( $sql, DB_READ, $fname ); - - $top = wfShowingResults( $offset, $limit ); - $wgOut->addHTML( "

{$top}\n" ); - - $sl = wfViewPrevNext( $offset, $limit, - $wgLang->specialPage( "Shortpages" ) ); - $wgOut->addHTML( "
{$sl}\n" ); - - $sk = $wgUser->getSkin(); - $s = "

    "; - while ( $obj = wfFetchObject( $res ) ) { - $nb = wfMsg( "nbytes", $obj->len ); - $link = $sk->makeKnownLink( $obj->cur_title, "" ); - $s .= "
  1. {$link} ({$nb})
  2. \n"; - } - wfFreeResult( $res ); - $s .= "
"; - $wgOut->addHTML( $s ); - $wgOut->addHTML( "

{$sl}\n" ); - + } + + function formatResult( $skin, $result ) { + $nb = wfMsg( "nbytes", $result->len ); + $link = $skin->makeKnownLink( $result->cur_title, "" ); + return "{$link} ({$nb})"; + } +} - # Saving cache - if ( $offset > 0 OR $limit < 50 ) return ; #Not suitable - $log->replaceContent( $s ); +function wfSpecialShortpages() +{ + list( $limit, $offset ) = wfCheckLimits(); + + $spp = new ShortPagesPage(); + + return $spp->doQuery( $offset, $limit ); } ?> diff --git a/includes/SpecialWantedpages.php b/includes/SpecialWantedpages.php index 834d68cd70..acb11c655f 100644 --- a/includes/SpecialWantedpages.php +++ b/includes/SpecialWantedpages.php @@ -1,63 +1,44 @@ getValidSpecialPages() ; - $log = new LogPage( $vsp["Wantedpages"] ); - $log->mUpdateRecentChanges = false; - - $wgOut->setRobotpolicy( "noindex,nofollow" ); - global $wgMiserMode; - if ( $wgMiserMode ) { - $log->showAsDisabledPage(); - return; - } - - list( $limit, $offset ) = wfCheckLimits(); - - $cache = "" ; # To be saved, eventually - - $sql = "SELECT bl_to, COUNT( DISTINCT bl_from ) as nlinks " . +include_once ( "QueryPage.php" ) ; + +class WantedPagesPage extends QueryPage { + + function getName() { + return "Wantedpages"; + } + + function isExpensive() { + return 1; + } + + function getSQL( $offset, $limit ) { + return "SELECT bl_to, COUNT( DISTINCT bl_from ) as nlinks " . "FROM brokenlinks GROUP BY bl_to HAVING nlinks > 1 " . "ORDER BY nlinks DESC LIMIT {$offset}, {$limit}"; - $res = wfQuery( $sql, DB_READ, $fname ); - - $sk = $wgUser->getSkin(); - - $top = wfShowingResults( $offset, $limit ); - $wgOut->addHTML( "

{$top}\n" ); - - $sl = wfViewPrevNext( $offset, $limit, - $wgLang->specialpage( "Wantedpages" ) ); - $wgOut->addHTML( "
{$sl}\n" ); - - $s = "

    "; - while ( $obj = wfFetchObject( $res ) ) { - $nt = Title::newFromDBkey( $obj->bl_to ); - - $plink = $sk->makeBrokenLink( $nt->getPrefixedText(), "" ); - $nl = wfMsg( "nlinks", $obj->nlinks ); - $nlink = $sk->makeKnownLink( $wgLang->specialPage( - "Whatlinkshere" ), $nl, "target=" . $nt->getPrefixedURL() ); - - $cache .= "* [[".$nt->getPrefixedText()."]] ({$nl})\n" ; - - $s .= "
  1. {$plink} ({$nlink})
  2. \n"; - } - wfFreeResult( $res ); - $s .= "
"; - $wgOut->addHTML( $s ); - $wgOut->addHTML( "

{$sl}\n" ); + } + + function formatResult( $skin, $result ) { + global $wgLang; + + $nt = Title::newFromDBkey( $result->bl_to ); + + $plink = $skin->makeBrokenLink( $nt->getPrefixedText(), "" ); + $nl = wfMsg( "nlinks", $result->nlinks ); + $nlink = $skin->makeKnownLink( $wgLang->specialPage( "Whatlinkshere" ), $nl, + "target=" . $nt->getPrefixedURL() ); + + return "{$plink} ({$nlink})"; + } +} - # Saving cache - if ( $offset > 0 OR $limit < 50 ) return ; #Not suitable - $log->replaceContent( $s ); +function wfSpecialWantedpages() +{ + list( $limit, $offset ) = wfCheckLimits(); + + $wpp = new WantedPagesPage(); + + $wpp->doQuery( $offset, $limit ); } ?> -- 2.20.1