Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
05/18/2022 05:32:26 AM (4 years ago)
Author:
imath
Message:

Improve group members count query performance

[13103] introduced a change in 10.0.0 that can be very time consuming when a group has a lot of members.

To keep the main improvements of the referenced commit (only refreshing group members count when a user joins or leaves a group) but optimize queries performance, we are introducing a new way to count group members in the BP_Group_Member_Query.

We are also introducing a way to defer group members count when adding a batch of members to a group. Using bp_groups_defer_group_members_count() avoids to refresh the count each time a member of this batch is added. For more information about how to use this function, you can have a look at how BuddyPress is using it into src/bp-groups/bp-groups-admin.php.

Props dd32, espellcaste

See #8688 (trunk)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/testcases/groups/functions.php

    r13103 r13280  
    88        static public $group_ids;
    99        static public $user_ids;
     10        protected $did_group_member_count = 0;
    1011
    1112        static public function wpSetUpBeforeClass( $factory ) {
     
    343344                $this->assertEquals( 2, groups_get_total_member_count( $g1 ) );
    344345                $this->assertEquals( 2, BP_Groups_Group::get_total_member_count( $g1 ) );
     346        }
     347
     348        /**
     349         * @group total_member_count
     350         * @ticket BP8688
     351         */
     352        public function test_total_member_count_groups_inactive_user() {
     353                $u1 = self::factory()->user->create();
     354                $u2 = wp_insert_user( array(
     355                        'user_pass'  => 'foobar',
     356                        'user_login' => 'foobar',
     357                        'user_email' => 'foobar@buddypress.org',
     358                ) );
     359
     360                $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     361
     362                groups_join_group( $g1, $u2 );
     363
     364                $this->assertEquals( 1, groups_get_total_member_count( $g1 ) );
     365        }
     366
     367        /**
     368         * @group total_member_count
     369         * @ticket BP8688
     370         */
     371        public function test_total_member_count_groups_spammed_user() {
     372                $u1 = self::factory()->user->create();
     373                $u2 = self::factory()->user->create();
     374
     375                $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     376
     377                groups_join_group( $g1, $u2 );
     378                bp_core_process_spammer_status( $u2, 'spam' );
     379
     380                $this->assertEquals( 1, groups_get_total_member_count( $g1 ) );
     381        }
     382
     383        /**
     384         * @group total_member_count
     385         * @ticket BP8688
     386         */
     387        public function test_total_member_count_groups_deferred() {
     388                $u1 = self::factory()->user->create();
     389                $g1 = self::factory()->group->create( array( 'creator_id' => $u1 ) );
     390                $members = array();
     391                $this->did_group_member_count = 0;
     392
     393                add_filter( 'bp_groups_total_member_count', array( $this, 'filter_bp_groups_total_member_count' ) );
     394
     395                bp_groups_defer_group_members_count( true );
     396                for ( $i = 1; $i < 6; $i++ ) {
     397                        $members[ $i ] = self::factory()->user->create();
     398                        groups_join_group( $g1, $members[ $i ] );
     399                }
     400                bp_groups_defer_group_members_count( false, $g1 );
     401
     402                remove_filter( 'bp_groups_total_member_count', array( $this, 'filter_bp_groups_total_member_count' ) );
     403
     404                $this->assertTrue( 1 === $this->did_group_member_count );
     405                $this->assertEquals( count( $members ) + 1, groups_get_total_member_count( $g1 ) );
     406        }
     407
     408        public function filter_bp_groups_total_member_count( $count ) {
     409                $this->did_group_member_count += 1;
     410                return $count;
    345411        }
    346412
Note: See TracChangeset for help on using the changeset viewer.