From: Reedy Date: Thu, 25 Sep 2014 21:19:55 +0000 (+0000) Subject: Revert "API: Fix list=allusers with multiple values for augroup" X-Git-Tag: 1.31.0-rc.0~13816 X-Git-Url: http://git.cyclocoop.org/%28?a=commitdiff_plain;h=a5994e27764dc215183c532e9960b6510fb4a0c6;p=lhc%2Fweb%2Fwiklou.git Revert "API: Fix list=allusers with multiple values for augroup" Causing a large load spike on enwiki api db slaves This reverts commit aa5800519f301cbafa835ef3ee95c7b3f24050b4. Change-Id: Ied559c4e701bb644b354af4e158b84537dde94e9 --- diff --git a/includes/api/ApiQueryAllUsers.php b/includes/api/ApiQueryAllUsers.php index d2413112ab..affddda769 100644 --- a/includes/api/ApiQueryAllUsers.php +++ b/includes/api/ApiQueryAllUsers.php @@ -111,18 +111,35 @@ class ApiQueryAllUsers extends ApiQueryBase { } } + if ( !is_null( $params['group'] ) && !is_null( $params['excludegroup'] ) ) { + $this->dieUsage( 'group and excludegroup cannot be used together', 'group-excludegroup' ); + } + if ( !is_null( $params['group'] ) && count( $params['group'] ) ) { + $useIndex = false; // Filter only users that belong to a given group - $this->addWhere( 'EXISTS (' . $db->selectSQLText( - 'user_groups', '1', array( 'ug_user=user_id', 'ug_group' => $params['group'] ) - ) . ')' ); + $this->addTables( 'user_groups', 'ug1' ); + $this->addJoinConds( array( 'ug1' => array( 'INNER JOIN', array( 'ug1.ug_user=user_id', + 'ug1.ug_group' => $params['group'] ) ) ) ); } if ( !is_null( $params['excludegroup'] ) && count( $params['excludegroup'] ) ) { + $useIndex = false; // Filter only users don't belong to a given group - $this->addWhere( 'NOT EXISTS (' . $db->selectSQLText( - 'user_groups', '1', array( 'ug_user=user_id', 'ug_group' => $params['excludegroup'] ) - ) . ')' ); + $this->addTables( 'user_groups', 'ug1' ); + + if ( count( $params['excludegroup'] ) == 1 ) { + $exclude = array( 'ug1.ug_group' => $params['excludegroup'][0] ); + } else { + $exclude = array( $db->makeList( + array( 'ug1.ug_group' => $params['excludegroup'] ), + LIST_OR + ) ); + } + $this->addJoinConds( array( 'ug1' => array( 'LEFT OUTER JOIN', + array_merge( array( 'ug1.ug_user=user_id' ), $exclude ) + ) ) ); + $this->addWhere( 'ug1.ug_user IS NULL' ); } if ( $params['witheditsonly'] ) {