Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
02/02/2010 12:40:49 PM (17 years ago)
Author:
apeatling
Message:

Removing database hits inside BP loops to improve overall performance.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/bp-groups/bp-groups-classes.php

    r2431 r2533  
    4848                                $this->user_dataset = $this->get_user_dataset();
    4949
    50                                 //if ( !$this->total_member_count ) {
    5150                                $this->total_member_count = count( $this->user_dataset );
    5251                                groups_update_groupmeta( $this->id, 'total_member_count', $this->total_member_count );
    53                                 //}
    5452                        }
     53
     54                        /* Get group extras */
     55                        $this->is_member = BP_Groups_Member::check_is_member( $bp->loggedin_user->id, $this->id );
    5556                }
    5657        }
     
    336337                }
    337338
     339                $group_ids = $wpdb->escape( join( ',', (array)$group_ids ) );
     340                $paged_groups = BP_Groups_Group::get_group_extras( &$paged_groups, $group_ids, 'newest' );
     341
    338342                return array( 'groups' => $paged_groups, 'total' => $total_groups );
    339343        }
     
    361365                }
    362366
     367                foreach ( $paged_groups as $group ) $group_ids[] = $group->id;
     368                $group_ids = $wpdb->escape( join( ',', (array)$group_ids ) );
     369                $paged_groups = BP_Groups_Group::get_group_extras( &$paged_groups, $group_ids, 'active' );
     370
    363371                return array( 'groups' => $paged_groups, 'total' => $total_groups );
    364372        }
     
    387395                }
    388396
     397                $group_ids = $wpdb->escape( join( ',', (array)$group_ids ) );
     398                $paged_groups = BP_Groups_Group::get_group_extras( &$paged_groups, $group_ids, 'popular' );
     399
    389400                return array( 'groups' => $paged_groups, 'total' => $total_groups );
    390401        }
     
    412423                }
    413424
     425                $group_ids = $wpdb->escape( join( ',', (array)$group_ids ) );
     426                $paged_groups = BP_Groups_Group::get_group_extras( &$paged_groups, $group_ids, 'alphabetical' );
     427
    414428                return array( 'groups' => $paged_groups, 'total' => $total_groups );
    415429        }
     
    441455                }
    442456
     457                $group_ids = $wpdb->escape( join( ',', (array)$group_ids ) );
     458                $paged_groups = BP_Groups_Group::get_group_extras( &$paged_groups, $group_ids, 'most_forum_topics' );
     459
    443460                return array( 'groups' => $paged_groups, 'total' => $total_groups );
    444461        }
     
    469486                        $total_groups = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT g.id) FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name_groupmeta} gm3, {$bbdb->forums} f, {$bp->groups->table_name} g WHERE g.id = gm1.group_id AND g.id = gm2.group_id AND g.id = gm3.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count' AND (gm3.meta_key = 'forum_id' AND gm3.meta_value = f.forum_id) {$hidden_sql} {$search_sql}" ) );
    470487                }
     488
     489                $group_ids = $wpdb->escape( join( ',', (array)$group_ids ) );
     490                $paged_groups = BP_Groups_Group::get_group_extras( &$paged_groups, $group_ids, 'most_forum_posts' );
    471491
    472492                return array( 'groups' => $paged_groups, 'total' => $total_groups );
     
    535555                $paged_groups = $wpdb->get_results( $wpdb->prepare( "SELECT g.*, gm1.meta_value as total_member_count, gm2.meta_value as last_activity FROM {$bp->groups->table_name_groupmeta} gm1, {$bp->groups->table_name_groupmeta} gm2, {$bp->groups->table_name} g WHERE g.id = gm1.group_id AND g.id = gm2.group_id AND gm2.meta_key = 'last_activity' AND gm1.meta_key = 'total_member_count' AND g.name LIKE '$letter%%' {$hidden_sql} {$search_sql} ORDER BY g.name ASC {$pag_sql}"  ) );
    536556
     557                $group_ids = $wpdb->escape( join( ',', (array)$group_ids ) );
     558                $paged_groups = BP_Groups_Group::get_group_extras( &$paged_groups, $group_ids, 'letter' );
     559
    537560                return array( 'groups' => $paged_groups, 'total' => $total_groups );
    538561        }
     
    560583                }
    561584
    562                 return array( 'groups' => $paged_groups, 'total' => $total_groups );
     585                $group_ids = $wpdb->escape( join( ',', (array)$group_ids ) );
     586                $paged_groups = BP_Groups_Group::get_group_extras( &$paged_groups, $group_ids, 'random' );
     587
     588                return array( 'groups' => $paged_groups, 'total' => $total_groups );
     589        }
     590
     591        function get_group_extras( $paged_groups, $group_ids, $type = false ) {
     592                global $bp, $wpdb;
     593
     594                if ( empty( $group_ids ) )
     595                        return $paged_groups;
     596
     597                /* Fetch the logged in users status within each group */
     598                $user_status = $wpdb->get_col( $wpdb->prepare( "SELECT group_id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id IN ( {$group_ids} ) AND is_confirmed = 1 AND is_banned = 0", $bp->loggedin_user->id ) );
     599                for ( $i = 0; $i < count( $paged_groups ); $i++ ) {
     600                        foreach ( $user_status as $group_id ) {
     601                                if ( $group_id == $paged_groups[$i]->id )
     602                                        $paged_groups[$i]->is_member = true;
     603                        }
     604                }
     605
     606                $user_banned = $wpdb->get_col( $wpdb->prepare( "SELECT group_id FROM {$bp->groups->table_name_members} WHERE is_banned = 1 AND user_id = %d AND group_id IN ( {$group_ids} )", $bp->loggedin_user->id ) );
     607                for ( $i = 0; $i < count( $paged_groups ); $i++ ) {
     608                        foreach ( $user_banned as $group_id ) {
     609                                if ( $group_id == $paged_groups[$i]->id )
     610                                        $paged_groups[$i]->is_banned = true;
     611                        }
     612                }
     613
     614                return $paged_groups;
    563615        }
    564616
Note: See TracChangeset for help on using the changeset viewer.