[pLog-svn] r3227 - in plog/trunk: class/summary/actionclass/summary/dao class/summary/view templates/summary

Oscar Renalias oscar at renalias.net
Tue Apr 11 10:26:32 GMT 2006


As far as I can tell, using GROUP BY is not a good thing because the
database still has to generate the full list and then remove
repetitions from it. I know we're using GROUP BY modifiers in other
places but that doesn't mean that it's good :-) Besides, being the
summary.php what we're talking about, we should be careful with
performance.

If somebody has an idea about how to optimize these queries, please go ahead.

Or if the summary queries are too slow we can always pregenerate the
data and store it in another table. For example every time an article
is added, updated or modified, we could precalculate the values for
all the lists in the summary. Additions would be a bit slower but
generating the front page of the site should be much faster because
queries would be simpler.

Oscar

On 4/11/06, Mark Wu <markplace at gmail.com> wrote:
> Hi Oscar:
>
> I thnik most of the summary changes already done. And still has one todo
> .... Add rss feed for post list and blog list.
>
> And, can you take a look at summarystats, there are two functions:
>
> getRecentArticles() and getRecentPostsByGlobalCategory(). Actaully they are
> 90% the same..
>
> The only different is I use "group by (a.blog_id)"  to get the articles list
> with distinct blog_id ...
>
> I have no idea about the performance is better or worse if we use "group by
> (a.blog_id)", but it get the same results as getRecentArticles()
>
> So, if the performance is the same, I will considering to combine these two
> functions and make the code more clean.
>
> Mark
>
> > -----Original Message-----
> > From: plog-svn-bounces at devel.lifetype.net
> > [mailto:plog-svn-bounces at devel.lifetype.net] On Behalf Of
> > mark at devel.lifetype.net
> > Sent: Tuesday, April 11, 2006 4:54 PM
> > To: plog-svn at devel.lifetype.net
> > Subject: [pLog-svn] r3227 - in plog/trunk:
> > class/summary/actionclass/summary/dao class/summary/view
> > templates/summary
> >
> > Author: mark
> > Date: 2006-04-11 08:53:41 +0000 (Tue, 11 Apr 2006) New Revision: 3227
> >
> > Modified:
> >    plog/trunk/class/summary/action/summarydefaultaction.class.php
> >    plog/trunk/class/summary/action/summaryrssaction.class.php
> >    plog/trunk/class/summary/dao/summarystats.class.php
> >    plog/trunk/class/summary/view/summarypostlistview.class.php
> >    plog/trunk/templates/summary/index.template
> >    plog/trunk/templates/summary/recent.template
> > Log:
> > Now, when we click on the globalarticlecategory, we will stay
> > in summary front page, instead of jumping to postlist page.
> >
> > Modified:
> > plog/trunk/class/summary/action/summarydefaultaction.class.php
> > ===================================================================
> > ---
> > plog/trunk/class/summary/action/summarydefaultaction.cl
> > ass.php       2006-04-11 07:42:56 UTC (rev 3226)
> > +++
> > plog/trunk/class/summary/action/summarydefaultaction.cl
> > ass.php       2006-04-11 08:53:41 UTC (rev 3227)
> > @@ -2,7 +2,8 @@
> >
> >       include_once(
> > PLOG_CLASS_PATH."class/summary/action/summaryaction.class.php" );
> >      include_once(
> > PLOG_CLASS_PATH."class/summary/dao/summarystats.class.php" );
> > -    include_once(
> > PLOG_CLASS_PATH."class/dao/globalarticlecategories.class.php" );
> > +    include_once(
> > PLOG_CLASS_PATH."class/dao/globalarticlecategories.class.php" );
> > +    include_once(
> > + PLOG_CLASS_PATH."class/data/validator/integervalidator.class.php" );
> >
> >       /**
> >        * This is the one and only default action. It simply
> > fetches all the most recent @@ -24,27 +25,52 @@
> >          {
> >              include_once(
> > PLOG_CLASS_PATH."class/dao/blogs.class.php" );
> >
> > -                     $this->_view = new SummaryCachedView(
> > "index", Array( "summary" => "default" ));
> > +            // get the blogCategoryId from request
> > +                     $globalArticleCategoryId =
> > $this->_request->getValue( "globalArticleCategoryId" );
> > +                     $val = new IntegerValidator();
> > +                     if( !$val->validate( $globalArticleCategoryId ))
> > +                             $globalArticleCategoryId =
> > ALL_GLOBAL_ARTICLE_CATEGORIES;
> > +
> > +                     $this->_view = new SummaryCachedView( "index",
> > +
> >                                 Array( "summary" => "default",
> > +
> >                                 "globalArticleCategoryId" =>
> > $globalArticleCategoryId ));
> >                       if( $this->_view->isCached()) {
> >                               // if the view is already
> > cached... move along! nothing to see here
> >                               return true;
> >                       }
> > -
> > +
> >              $blogs       = new Blogs();
> >              $stats       = new SummaryStats();
> >
> >              // get all blog category
> >              $categories = new GlobalArticleCategories();
> >              $globalArticleCategories =
> > $categories->getGlobalArticleCategories();
> > -            $min = $categories->getMinNumActiveArticles();
> > -            $max = $categories->getMaxNumActiveArticles();
> > +
> > +            $min = 0;
> > +            $max = 0;
> > +
> > +            foreach( $globalArticleCategories as
> > $globalArticleCategory ){
> > +             $numActiveArticles =
> > $globalArticleCategory->getNumActiveArticles();
> > +             if( $numActiveArticles < $min ) {
> > +                     $min = $numActiveArticles;
> > +                     continue;
> > +             }
> > +             if( $numActiveArticles > $max ) {
> > +                     $max = $numActiveArticles;
> > +                     continue;
> > +             }
> > +            }
> > +
> >              $step = ( $max - $min )/6;
> >              if($step == 0)
> > -             $step = $min + 1;
> > +             $step = $min + 1;
> >
> > +                     $currentGlobalArticleCategory =
> > +$categories->getGlobalArticleCategory( $globalArticleCategoryId );
> > +
> >                       // export the value for global article
> > categories
> >                       $this->_view->setValue( "summaryStats",
> > $stats );
> >                       $this->_view->setValue(
> > "globalArticleCategories", $globalArticleCategories );
> > +                     $this->_view->setValue(
> > "currentGlobalArticleCategory",
> > +$currentGlobalArticleCategory);
> >                       $this->_view->setValue( "min", $min );
> >                       $this->_view->setValue( "step", $step );
> >
> >
> > Modified: plog/trunk/class/summary/action/summaryrssaction.class.php
> > ===================================================================
> > ---
> > plog/trunk/class/summary/action/summaryrssaction.class.php
> > 2006-04-11 07:42:56 UTC (rev 3226)
> > +++
> > plog/trunk/class/summary/action/summaryrssaction.class.php
> > 2006-04-11 08:53:41 UTC (rev 3227)
> > @@ -6,6 +6,8 @@
> >      include_once( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
> >       include_once(
> > PLOG_CLASS_PATH."class/summary/view/summaryrssview.class.php" );
> >       include_once(
> > PLOG_CLASS_PATH."class/net/rawrequestgenerator.class.php" );
> > +    include_once(
> > PLOG_CLASS_PATH."class/dao/globalarticlecategories.class.php" );
> > +    include_once(
> > + PLOG_CLASS_PATH."class/data/validator/integervalidator.class.php" );
> >
> >       define( "SUMMARY_RSS_TYPE_DEFAULT", "default" );
> >       define( "SUMMARY_RSS_TYPE_MOST_COMMENTED",
> > "mostcommented" ); @@ -41,7 +43,7 @@
> >                               $this->_mode = SUMMARY_RSS_TYPE_DEFAULT;
> >                       }
> >
> > -                     $this->_profile =
> > $this->_request->getValue( "profile" );
> > +                     $this->_profile =
> > $this->_request->getValue( "profile" );
> >
> >                       return true;
> >               }
> > @@ -55,8 +57,15 @@
> >                  $this->_mode == SUMMARY_RSS_TYPE_MOST_READ ||
> >                  $this->_mode == SUMMARY_RSS_TYPE_DEFAULT ) {
> >
> >
> > +             // get the blogCategoryId from request
> > +                             $globalArticleCategoryId =
> > $this->_request->getValue( "globalArticleCategoryId" );
> > +                             $val = new IntegerValidator();
> > +                             if( !$val->validate(
> > $globalArticleCategoryId ))
> > +
> > $globalArticleCategoryId = ALL_GLOBAL_ARTICLE_CATEGORIES;
> > +
> >                   // RSS feeds for posts stuff
> >                   $this->_view = new SummaryRssView(
> > $this->_profile, Array( "summary" => "rss",
> > +
> > "globalArticleCategoryId" =>
> > +$globalArticleCategoryId,
> >
> > "mode" => $this->_mode,
> >
> >                                  "profile" => $this->_profile ));
> >                               if( $this->_view->isCached()) {
> > @@ -73,7 +82,13 @@
> >                                       $posts =
> > $stats->getMostReadArticles();
> >                               }
> >                               else {
> > -                                     $posts =
> > $stats->getRecentArticles();
> > +                                     $categories = new
> > GlobalArticleCategories();
> > +                                     $currentGlobalArticleCategory =
> > +$categories->getGlobalArticleCategory( $globalArticleCategoryId );
> > +
> > +                                     if(
> > empty($currentGlobalArticleCategory) )
> > +
> > $globalArticleCategoryId = ALL_GLOBAL_ARTICLE_CATEGORIES;
> > +
> > +                                     $posts =
> > $stats->getRecentArticles( $globalArticleCategoryId );
> >                               }
> >
> >                   if( !$posts ) {
> >
> > Modified: plog/trunk/class/summary/dao/summarystats.class.php
> > ===================================================================
> > --- plog/trunk/class/summary/dao/summarystats.class.php
> > 2006-04-11 07:42:56 UTC (rev 3226)
> > +++ plog/trunk/class/summary/dao/summarystats.class.php
> > 2006-04-11 08:53:41 UTC (rev 3227)
> > @@ -229,7 +229,7 @@
> >           * @param maxPosts The maximum number of posts to return
> >           * @return An array of Article objects with the most
> > recent articles.
> >           */
> > -        function getRecentArticles( $maxPosts = 0 )
> > +        function getRecentArticles( $globaArticleCategoryId =
> > + ALL_GLOBAL_ARTICLE_CATEGORIES, $maxPosts = 0 )
> >          {
> >              include_once( PLOG_CLASS_PATH .
> > "class/data/timestamp.class.php" );
> >              include_once(
> > PLOG_CLASS_PATH."class/dao/articles.class.php" ); @@ -247,6 +247,9 @@
> >                                               AND a.status =
> > ".POST_STATUS_PUBLISHED."
> >                                                       AND
> > a.in_summary_page = '1'";
> >
> > +                     if($globaArticleCategoryId !=
> > ALL_GLOBAL_ARTICLE_CATEGORIES)
> > +                             $query .= " AND a.global_category_id =
> > +'".Db::qstr($globaArticleCategoryId)."'";
> > +
> >                       $query .= " GROUP BY a.id ORDER BY a.date DESC";
> >
> >              if( $maxPosts <= 0 )
> >
> > Modified: plog/trunk/class/summary/view/summarypostlistview.class.php
> > ===================================================================
> > ---
> > plog/trunk/class/summary/view/summarypostlistview.class.php
> > 2006-04-11 07:42:56 UTC (rev 3226)
> > +++
> > plog/trunk/class/summary/view/summarypostlistview.class.php
> > 2006-04-11 08:53:41 UTC (rev 3227)
> > @@ -61,7 +61,7 @@
> >                       $currentGlobalArticleCategory =
> > $categories->getGlobalArticleCategory( $globalArticleCategoryId );
> >
> >                       if( empty($currentGlobalArticleCategory) )
> > -                             $globalArticleCategoryId =
> > ALL_GLOBAL_ARTICLE_CATEGORIES;
> > +                             $globalArticleCategoryId =
> > ALL_GLOBAL_ARTICLE_CATEGORIES;
> >
> >                       // get the data itself
> >                       $stats = new SummaryStats();
> >
> > Modified: plog/trunk/templates/summary/index.template
> > ===================================================================
> > --- plog/trunk/templates/summary/index.template
> > 2006-04-11 07:42:56 UTC (rev 3226)
> > +++ plog/trunk/templates/summary/index.template
> > 2006-04-11 08:53:41 UTC (rev 3227)
> > @@ -48,7 +48,7 @@
> >       <h4>{$locale->tr("global_article_categories")}</h4>
> >       {foreach from=$globalArticleCategories
> > item=globalArticleCategory}
> >               {math assign=fontSize
> > equation="(int)((x-y)/step)+12"
> > x=$globalArticleCategory->getNumActiveArticles() y=$min step=$step}
> > -             <span class="tag"><a style="font-size:
> > {$fontSize}px"
> > href="?op=PostList&amp;globalArticleCategoryId={$globalArticle
> > Category->getId()}">{$globalArticleCategory->getName()}</a></span>
> > +             <span class="tag"><a style="font-size: {$fontSize}px"
> > +href="?op=Summary&amp;globalArticleCategoryId={$globalArticle
> > Category->
> > +getId()}">{$globalArticleCategory->getName()}</a></span>
> >       {/foreach}
> >      </div>
> >      {include file="summary/recent.template"}
> >
> > Modified: plog/trunk/templates/summary/recent.template
> > ===================================================================
> > --- plog/trunk/templates/summary/recent.template
> > 2006-04-11 07:42:56 UTC (rev 3226)
> > +++ plog/trunk/templates/summary/recent.template
> > 2006-04-11 08:53:41 UTC (rev 3227)
> > @@ -1,9 +1,25 @@
> > -<h4>{$locale->tr("summary_latest_posts")}
> > -  {assign var=posts value=$summaryStats->getRecentArticles()}
> > +<h4>{$locale->tr("summary_latest_posts")} (
> > +  {if empty($currentGlobalArticleCategory)}
> > +     {$locale->tr("all")}
> > +  {else}
> > +     {$currentGlobalArticleCategory->getName()}
> > +  {/if})
> > +  {if $currentGlobalArticleCategory}
> > +    {assign var=globalArticleCategoryId
> > value=$currentGlobalArticleCategory->getId()}
> > +    {assign var=posts
> > +value=$summaryStats->getRecentArticles($globalArticleCategoryId)}
> > +  {else}
> > +    {assign var=posts value=$summaryStats->getRecentArticles()}
> > +  {/if}
> >    {if $posts}
> > -    <a href="{$url->getRssUrl()}?summary=1">
> > -      <img src="{$url->getUrl("/imgs/rss_logo_small.gif")}"
> > -        alt="RSS" /></a>
> > +    {if $currentGlobalArticleCategory}
> > +      <a
> > href="{$url->getRssUrl()}?summary=1&amp;globalArticleCategoryI
> > d={$globalArticleCategoryId}">
> > +        <img
> > src="{$url->getUrl("/imgs/rss_logo_small.gif")}" alt="RSS" />
> > +      </a>
> > +    {else}
> > +      <a href="{$url->getRssUrl()}?summary=1">
> > +        <img
> > src="{$url->getUrl("/imgs/rss_logo_small.gif")}" alt="RSS" />
> > +      </a>
> > +    {/if}
> >    {/if}
> >  </h4>
> >  {foreach from=$posts item=post}
> >
> > _______________________________________________
> > pLog-svn mailing list
> > pLog-svn at devel.lifetype.net
> > http://devel.lifetype.net/mailman/listinfo/plog-svn
>
> _______________________________________________
> pLog-svn mailing list
> pLog-svn at devel.lifetype.net
> http://devel.lifetype.net/mailman/listinfo/plog-svn
>


More information about the pLog-svn mailing list