Skip to:
Content

BuddyPress.org

Changeset 9482


Ignore:
Timestamp:
02/13/2015 05:24:33 PM (12 years ago)
Author:
boonebgorges
Message:

Cache the results of BP_Messages_Thread::get_recipients().

This can save a large number of queries on certain inbox views.

Props wpdennis.
See #6221. Fixes #6220.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-messages/bp-messages-cache.php

    r9351 r9482  
    8585add_action( 'messages_notice_after_save',    'bp_notices_clear_cache' );
    8686add_action( 'messages_notice_before_delete', 'bp_notices_clear_cache' );
     87
     88/**
     89 * Invalidate thread recipient cache on message update.
     90 *
     91 * @since BuddyPress (2.3.0)
     92 *
     93 * @param BP_Messages_Message $message Message object.
     94 */
     95function bp_messages_clear_message_thread_recipient_cache_on_message_sent( BP_Messages_Message $message ) {
     96        wp_cache_delete( 'thread_recipients_' . $message->thread_id, 'bp_messages' );
     97}
     98add_action( 'messages_message_sent', 'bp_messages_clear_message_thread_recipient_cache_on_message_sent' );
     99
     100/**
     101 * Invalidate thread recipient cache on thread deletion.
     102 *
     103 * @since BuddyPress (2.3.0)
     104 *
     105 * @param int|array $thread_ids IDs of deleted threads.
     106 */
     107function bp_messages_clear_message_thread_recipient_cache_on_thread_delete( $thread_ids ) {
     108        foreach ( (array) $thread_ids as $thread_id ) {
     109                wp_cache_delete( 'thread_recipients_' . $thread_id, 'bp_messages' );
     110        }
     111}
     112add_action( 'messages_delete_thread', 'bp_messages_clear_message_thread_recipient_cache_on_thread_delete' );
  • trunk/src/bp-messages/bp-messages-classes.php

    r9471 r9482  
    214214                global $wpdb;
    215215
    216                 $bp = buddypress();
    217 
    218                 $recipients = array();
    219                 $results    = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d", $this->thread_id ) );
    220 
    221                 foreach ( (array) $results as $recipient ) {
    222                         $recipients[$recipient->user_id] = $recipient;
     216                $recipients = wp_cache_get( 'thread_recipients_' . $this->thread_id, 'bp_messages' );
     217                if ( false === $recipients ) {
     218                        $bp = buddypress();
     219
     220                        $recipients = array();
     221                        $results    = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d", $this->thread_id ) );
     222
     223                        foreach ( (array) $results as $recipient ) {
     224                                $recipients[ $recipient->user_id ] = $recipient;
     225                        }
     226
     227                        wp_cache_set( 'thread_recipients_' . $this->thread_id, $recipients, 'bp_messages' );
    223228                }
    224229
  • trunk/tests/phpunit/testcases/messages/class.bp-messages-thread.php

    r9302 r9482  
    9393                $this->assertSame( $expected, $found );
    9494        }
     95
     96        /**
     97         * @group get_recipients
     98         * @group cache
     99         */
     100        public function test_get_recipients_should_cache_its_values() {
     101                global $wpdb;
     102
     103                $u1 = $this->factory->user->create();
     104                $u2 = $this->factory->user->create();
     105
     106                $t1 = $this->factory->message->create( array(
     107                        'sender_id' => $u1,
     108                        'recipients' => array( $u2 ),
     109                        'subject' => 'Foo',
     110                ) );
     111
     112                $thread = new BP_Messages_Thread( $t1 );
     113                $recipients = $thread->get_recipients();
     114
     115                $num_queries = $wpdb->num_queries;
     116                $recipients_cached = $thread->get_recipients();
     117
     118                $this->assertEquals( $recipients, $recipients_cached );
     119                $this->assertEquals( $num_queries, $wpdb->num_queries );
     120        }
     121
     122        /**
     123         * @group get_recipients
     124         * @group cache
     125         */
     126        public function test_get_recipients_cache_should_be_busted_when_thread_message_is_sent() {
     127                global $wpdb;
     128
     129                $u1 = $this->factory->user->create();
     130                $u2 = $this->factory->user->create();
     131
     132                $t1 = $this->factory->message->create( array(
     133                        'sender_id' => $u1,
     134                        'recipients' => array( $u2 ),
     135                        'subject' => 'Foo',
     136                ) );
     137
     138                $thread = new BP_Messages_Thread( $t1 );
     139                $recipients = $thread->get_recipients();
     140
     141                // Verify that the cache is populated.
     142                $num_queries = $wpdb->num_queries;
     143                $recipients_cached = $thread->get_recipients();
     144                $this->assertEquals( $num_queries, $wpdb->num_queries );
     145
     146                messages_new_message( array(
     147                        'sender_id' => $u2,
     148                        'thread_id' => $t1,
     149                        'recipients' => array( $u1 ),
     150                        'subject' => 'Bar',
     151                        'content' => 'Baz',
     152                ) );
     153
     154                // Cache should be empty.
     155                $num_queries = $wpdb->num_queries;
     156                $recipients_uncached = $thread->get_recipients();
     157                $this->assertEquals( $num_queries + 1, $wpdb->num_queries );
     158        }
     159
     160        /**
     161         * @group get_recipients
     162         * @group cache
     163         */
     164        public function test_get_recipients_cache_should_be_busted_when_single_thread_is_deleted() {
     165                global $wpdb;
     166
     167                $u1 = $this->factory->user->create();
     168                $u2 = $this->factory->user->create();
     169
     170                $t1 = $this->factory->message->create( array(
     171                        'sender_id' => $u1,
     172                        'recipients' => array( $u2 ),
     173                        'subject' => 'Foo',
     174                ) );
     175
     176                $thread = new BP_Messages_Thread( $t1 );
     177                $recipients = $thread->get_recipients();
     178
     179                // Verify that the cache is populated.
     180                $num_queries = $wpdb->num_queries;
     181                $recipients_cached = $thread->get_recipients();
     182                $this->assertEquals( $num_queries, $wpdb->num_queries );
     183
     184                messages_delete_thread( $t1 );
     185
     186                // Cache should be empty.
     187                $this->assertFalse( wp_cache_get( 'thread_recipients_' . $t1, 'bp_messages' ) );
     188        }
     189
     190        /**
     191         * @group get_recipients
     192         * @group cache
     193         */
     194        public function test_get_recipients_cache_should_be_busted_when_array_of_threads_is_deleted() {
     195                global $wpdb;
     196
     197                $u1 = $this->factory->user->create();
     198                $u2 = $this->factory->user->create();
     199
     200                $t1 = $this->factory->message->create( array(
     201                        'sender_id' => $u1,
     202                        'recipients' => array( $u2 ),
     203                        'subject' => 'Foo',
     204                ) );
     205
     206                $thread = new BP_Messages_Thread( $t1 );
     207                $recipients = $thread->get_recipients();
     208
     209                // Verify that the cache is populated.
     210                $num_queries = $wpdb->num_queries;
     211                $recipients_cached = $thread->get_recipients();
     212                $this->assertEquals( $num_queries, $wpdb->num_queries );
     213
     214                messages_delete_thread( array( $t1 ) );
     215
     216                // Cache should be empty.
     217                $this->assertFalse( wp_cache_get( 'thread_recipients_' . $t1, 'bp_messages' ) );
     218        }
    95219}
Note: See TracChangeset for help on using the changeset viewer.