Skip to:
Content

Ticket #7442: bp-search-optimize.patch

File bp-search-optimize.patch, 2.3 KB (added by brandonliles, 14 months ago)

Subquery Materialization Approach

  • src/bp-core/classes/class-bp-user-query.php

     
    412412                                $search_terms_nospace = '%' . $search_terms . '%';
    413413                                $search_terms_space   = '%' . $search_terms . '%';
    414414                        }
    415 
    416                         $sql['where']['search'] = $wpdb->prepare(
    417                                 "u.{$this->uid_name} IN ( SELECT ID FROM {$wpdb->users} WHERE ( user_login LIKE %s OR user_login LIKE %s OR user_nicename LIKE %s OR user_nicename LIKE %s ) )",
     415                       
     416                        $matched_user_ids = $wpdb->get_col($wpdb->prepare(
     417                                "SELECT ID FROM {$wpdb->users} WHERE ( user_login LIKE %s OR user_login LIKE %s OR user_nicename LIKE %s OR user_nicename LIKE %s )",
    418418                                $search_terms_nospace,
    419419                                $search_terms_space,
    420420                                $search_terms_nospace,
    421421                                $search_terms_space
    422                         );
     422                        ));
     423
     424                        $match_in_clause = empty($matched_user_ids) ? 'NULL' : implode(',', $matched_user_ids);
     425
     426                        $sql['where']['search'] = "u.{$this->uid_name} IN ({$match_in_clause})";
    423427                }
    424428
    425429                // Only use $member_type__in if $member_type is not set.
  • src/bp-xprofile/bp-xprofile-functions.php

     
    781781
    782782        // Combine the core search (against wp_users) into a single OR clause
    783783        // with the xprofile_data search.
    784         $search_xprofile = $wpdb->prepare(
    785                 "u.{$query->uid_name} IN ( SELECT user_id FROM {$bp->profile->table_name_data} WHERE value LIKE %s OR value LIKE %s )",
     784        $matched_user_ids = $wpdb->get_col($wpdb->prepare(
     785                "SELECT user_id FROM {$bp->profile->table_name_data} WHERE value LIKE %s OR value LIKE %s",
    786786                $search_terms_nospace,
    787787                $search_terms_space
    788         );
     788        ));
    789789
    790         $search_core     = $sql['where']['search'];
    791         $search_combined = "( {$search_xprofile} OR {$search_core} )";
    792         $sql['where']['search'] = $search_combined;
     790        if (!empty($matched_user_ids)) {
     791                $search_core     = $sql['where']['search'];
     792                $search_combined = " ( u.{$query->uid_name} IN (" . implode(',', $matched_user_ids) . ") OR {$search_core} )";
     793                $sql['where']['search'] = $search_combined;
     794        }
    793795
    794796        return $sql;
    795797}