[pLog-svn] r2779 - in plog/trunk/class: dao view/admin
Mark Wu
markplace at gmail.com
Fri Jan 13 03:52:43 GMT 2006
Hi Oscar:
Then, does it mean the same situation will happened in comments & trackbacks
..?
If one post has 100 comments or 200 trackbacks, will this overkill lifetype?
Mark
> -----Original Message-----
> From: plog-svn-bounces at devel.lifetype.net
> [mailto:plog-svn-bounces at devel.lifetype.net] On Behalf Of
> oscar at devel.lifetype.net
> Sent: Friday, January 13, 2006 6:46 AM
> To: plog-svn at devel.lifetype.net
> Subject: [pLog-svn] r2779 - in plog/trunk/class: dao view/admin
>
> Author: oscar
> Date: 2006-01-12 22:45:38 +0000 (Thu, 12 Jan 2006) New Revision: 2779
>
> Modified:
> plog/trunk/class/dao/articles.class.php
> plog/trunk/class/dao/model.class.php
> plog/trunk/class/view/admin/admindashboardview.class.php
> Log:
> I had to reconsider some ideas regarding caching of long
> lists of articles... It is overkill to load all articles at
> once, cache them all and then return only what we need
> because the system will slow down considerably and we'll hit
> the 8mb limit. I reverted Articles::getBlogArticles and
> Articles::getNumBlogArticles to what they basically were in
> 1.0.x (plus just a bit of caching) and things seem to work
> much better now (both in performance and memory) Regarding
> memory, the db from lifetype.net fits perfectly now in
> between 3.5 and 5.0mb memory depending on the situation,
> which is quite an improvement!
>
> Modified: plog/trunk/class/dao/articles.class.php
> ===================================================================
> --- plog/trunk/class/dao/articles.class.php 2006-01-12
> 22:35:22 UTC (rev 2778)
> +++ plog/trunk/class/dao/articles.class.php 2006-01-12
> 22:45:38 UTC (rev 2779)
> @@ -51,7 +51,7 @@
> {
> $blogArticles = $this->getMany( "blog_id",
> $blogId,
> - CACHE_ARTICLES_BYBLOG,
> + null,
> Array(
> CACHE_ARTICLES => "getId" ),
> Array( "date"
> => "DESC" ),
>
> $searchTerms,
> @@ -274,18 +274,20 @@
> $status = POST_STATUS_PUBLISHED,
> $userId = 0,
> $maxDate = 0,
> - $searchTerms = Array())
> - {
> - $articles = $this->getBlogArticles( $blogId,
> - $date,
> -
> -1,
> -
> $categoryId,
> -
> $status,
> - $userId,
> -
> $maxDate,
> -
> $searchTerms );
> + $searchTerms = "")
> + {
> + $postStatus = $status;
> + $prefix = $this->getPrefix();
> + $where = $this->buildWhere( $blogId,
> $date, $amount, $categoryId, $status, $userId, $maxDate,
> $searchTerms );
> + $query = "SELECT COUNT(*) AS total FROM
> {$prefix}articles
> +a, {$prefix}articles_categories c,
> {$prefix}article_categories_link l
> +WHERE $where ";
>
> - return count($articles);
> + $result = $this->_db->Execute( $query );
> +
> + if( !$result )
> + return 0;
> +
> + $number = $result->RowCount();
> + return( $number );
> }
>
> /**
> @@ -372,7 +374,66 @@
>
> return( $searchCondition );
> }
> +
> + /**
> + * builds a WHERE clause for a query
> + *
> + * @private
> + */
> + function buildWhere( $blogId, $date = -1,
> $amount = -1, $categoryId = 0, $status = 0, $userId = 0,
> $maxDate = 0, $searchTerms = "" )
> + {
> + $postStatus = $status;
> + $prefix = $this->getPrefix();
> + if($blogId == -1){
> + $query = "a.blog_id = a.blog_id";
> + }
> + else{
> + $query = "a.blog_id = ".Db::qstr($blogId);
> + }
> + if( $date != -1 ) {
> + // consider the time difference
> + include_once(
> PLOG_CLASS_PATH."class/dao/blogs.class.php" );
> + $blogs = new Blogs();
> + $blogInfo = $blogs->getBlogInfo( $blogId );
> + $blogSettings =
> $blogInfo->getSettings();
> + $timeDifference = $blogSettings->getValue(
> "time_offset" );
> + $SecondsDiff = $timeDifference * 3600;
> + $query .= " AND
> FROM_UNIXTIME(UNIX_TIMESTAMP(a.date)+$SecondsDiff)+0 LIKE '$date%'";
> + }
>
> + // the common part "c.id = a.category_id" is
> needed so that
> + // we don't get one article row as many times as
> the amount of categories
> + // we have... due to the sql 'join' operation
> we're carrying out
> + if( $categoryId == -1 )
> + $query .= " AND c.id = l.category_id AND
> a.id = l.article_id ";
> + else {
> + if( $categoryId > 0 )
> + $query .= " AND a.id = l.article_id AND
> l.category_id = $categoryId AND c.id = l.category_id";
> + else {
> + $query .= " AND c.id = l.category_id AND
> a.id = l.article_id AND c.in_main_page = 1";
> + }
> + }
> +
> + if( $status > 0 )
> + $query .= " AND a.status = '$postStatus'";
> + if( $userId > 0 )
> + $query .= " AND a.user_id = ".Db::qstr($userId);
> + if( $maxDate > 0 )
> + $query .= " AND a.date <= '$maxDate'";
> +
> + // in case there were some search terms
> specified as parameters...
> + if( $searchTerms != "" ) {
> + $whereString =
> $this->getSearchConditions( $searchTerms );
> + // and add it to the current search
> + $query .=" AND {$whereString} ";
> + }
> +
> + if( $categoryId <= 0 )
> + $query .= " GROUP BY a.id ";
> +
> + return $query;
> + }
> +
> /**
> * Returns all the articles for a given blog,
> according to the conditions specified in
> * the call. If this function is too cumbersome to
> use (I reckon it might be, @@ -402,25 +463,65 @@
> $searchTerms = "",
> $page = -1 )
> {
> - $articles = $this->getArticles( $blogId, $searchTerms );
> -
> - if( !$articles )
> - $articles = Array();
> + // build the query
> + // the query gets quite complicated to build
> because we have to take care of plenty
> + // of conditions, such as the maximum date, the
> amount, the category,
> + // wether the category has to be shown in the
> main page or not, etc...
> + $postStatus = $status;
> + $prefix = $this->getPrefix();
> + $where = $this->buildWhere( $blogId, $date,
> $amount, $categoryId, $status, $userId, $maxDate, $searchTerms );
> + $query = "SELECT a.id as id, a.id, a.date,
> +
> a.user_id,a.blog_id,a.status,a.properties,
> + a.num_reads, a.slug, 1 AS
> relevance FROM {$prefix}articles a, {$prefix}articles_categories c,
> + {$prefix}article_categories_link l";
> + if( $searchTerms != "" )
> + $query .= ", {$prefix}articles_text t ";
> + $query .= " WHERE ";
> + if( $searchTerms != "" )
> + $query .= " t.article_id = a.id AND ";
> + $query .= " $where";
> +
> +
> + // if we're doing a search, we should
> sort by relevance
> + if( $searchTerms != "" ) {
> + $query .= " ORDER BY
> relevance";
> + }
> + else {
> + $query .= " ORDER BY a.date
> DESC";
> + }
>
> - $result = Array();
> - $total = 0;
> - foreach( $articles as $article ) {
> - if( $this->check( $article, $date,
> $categoryId, $status, $userId, $maxDate )) {
> - $result[] = $article;
> - $total++;
> - }
> - }
> -
> - // do the slicing only if necessary
> - if( $page > -1 && $amount > -1 )
> - $result = array_slice( $result,
> ($page-1) * $amount, $amount );
> -
> - return( $result );
> + // we don't need limits if we're getting the
> posts for a given day
> + if( ($amount > 0) && ($date == -1) && ($page == -1 ))
> + $query .= " LIMIT $amount;";
> +
> + // in case we're using a paged display
> + if( $page > 0 ) {
> + $start = (($page - 1) *
> $amount);
> + $query .= " LIMIT $start, $amount";
> + }
> +
> + // execute the query
> + $result = $this->Execute( $query );
> +
> + if( !$result )
> + return Array();
> +
> + if( $result->RowCount() == 0 )
> + return Array();
> +
> + $articles = Array();
> + while( $row = $result->FetchRow()) {
> + // map the row to an object
> + $article = $this->mapRow( $row );
> + $articles[] = $article;
> + // and cache it for later use,
> we might need it
> + $this->_cache->setData(
> $article->getId(), CACHE_ARTICLES, $article );
>
> + $this->_cache->setData(
> $article->getPostSlug(), CACHE_ARTICLES_BYNAME, $article );
> + }
> +
> + $result->Close();
> +
> + return $articles;
> }
>
> /**
> @@ -1066,9 +1167,9 @@
> $article->setCategories(
> $articleCategories );
> // get information about the categories of the article
> $article->setBlogInfo( $blogInfo );
> - if ( $this->users === null )
> + /*if ( $this->users === null )
> $this->users = new Users();
> - $article->setUserInfo(
> $this->users->getUserInfoFromId( $query_result['user_id'] ));
> + $article->setUserInfo(
> $this->users->getUserInfoFromId(
> +$query_result['user_id'] ));*/
>
> // counters
> $article->setTotalComments(
> $query_result['num_comments'] );
>
> Modified: plog/trunk/class/dao/model.class.php
> ===================================================================
> --- plog/trunk/class/dao/model.class.php 2006-01-12
> 22:35:22 UTC (rev 2778)
> +++ plog/trunk/class/dao/model.class.php 2006-01-12
> 22:45:38 UTC (rev 2779)
> @@ -310,11 +310,10 @@
> $orderBy .= "$field $dir";
> }
> }
> +
> // build the query including all parts
> $query = $query.$where.$orderBy;
>
> - $this->log->debug("query = $query");
> -
> $result = $this->Execute( $query );
>
> if( !$result )
>
> Modified: plog/trunk/class/view/admin/admindashboardview.class.php
> ===================================================================
> --- plog/trunk/class/view/admin/admindashboardview.class.php
> 2006-01-12 22:35:22 UTC (rev 2778)
> +++ plog/trunk/class/view/admin/admindashboardview.class.php
> 2006-01-12 22:45:38 UTC (rev 2779)
> @@ -72,13 +72,22 @@
> $numOwnedBlogs = 0;
> foreach( $this->_userBlogs as $userBlog ) {
>
> $recentPosts[$userBlog->getId()] =
> $articles->getBlogArticles( $userBlog->getId(),
> -
>
> -1,
> -
>
> DASHBOARD_MAX_RECENT_ITEMS,
> -
>
> 0,
> +
>
> -1, // no date,
>
>
> +
>
> DASHBOARD_MAX_RECENT_ITEMS,
> +
>
> 0,
>
>
>
>
> POST_STATUS_PUBLISHED );
> -
> $recentComments[$userBlog->getId()] =
> $comments->getBlogComments ( $userBlog->getId(),
> DASHBOARD_MAX_RECENT_ITEMS );
> -
> $recentTrackbacks[$userBlog->getId()] =
> $trackbacks->getBlogTrackbacks( $userBlog->getId(),
> DASHBOARD_MAX_RECENT_ITEMS );
> -
> +
> $recentComments[$userBlog->getId()] =
> $comments->getBlogComments ( $userBlog->getId(),
> +
> COMMENT_ORDER_NEWEST_FIRST,
> +
>
> COMMENT_STATUS_ALL,
> +
>
> "", // no search terms
> +
>
> 1, // first page
> +
>
> DASHBOARD_MAX_RECENT_ITEMS );
> +
> $recentTrackbacks[$userBlog->getId()] =
> $trackbacks->getBlogTrackbacks( $userBlog->getId(),
> +
> COMMENT_ORDER_NEWEST_FIRST,
> +
>
> COMMENT_STATUS_ALL,
> +
>
> "",
> +
>
> 1,
> +
>
>
> DASHBOARD_MAX_RECENT_ITEMS );
> if( $userBlog->getOwner() ==
> $this->_userInfo->getId())
> $numOwnedBlogs++;
> }
>
> _______________________________________________
> 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