From 30926a2c3cf0b461c37fb9b8e469ff823da6f683 Mon Sep 17 00:00:00 2001 From: Chad Horohoe Date: Tue, 13 Sep 2011 00:19:04 +0000 Subject: [PATCH] Revert r87992 and followups r87998, r89028 (Support abstraction for 'NOT IN' SQL structure). Per discussion on CR and elsewhere...we're not 100% sold on the new format yet. Changing the database api like this should be carefully thought out before we get stuck with it for 6 more years and end up hating it. --- includes/db/Database.php | 23 ++---------------- includes/specials/SpecialRecentchanges.php | 27 +++++++++++---------- tests/phpunit/includes/db/DatabaseTest.php | 28 ---------------------- 3 files changed, 16 insertions(+), 62 deletions(-) diff --git a/includes/db/Database.php b/includes/db/Database.php index 0c9bb8cc37..1a78a21ceb 100644 --- a/includes/db/Database.php +++ b/includes/db/Database.php @@ -1712,15 +1712,6 @@ abstract class DatabaseBase implements DatabaseType { * - LIST_SET: comma separated with field names, like a SET clause * - LIST_NAMES: comma separated field names * - * In LIST_AND or LIST_OR modes, you can suffix a field with an exclamation - * mark to generate a 'NOT IN' structure. - * - * Example: - * $db->makeList( array( 'field!' => array( 1,2,3 ) ); - * - * outputs: - * 'field' NOT IN ('1', '2', '3' ); - * @return string */ function makeList( $a, $mode = LIST_COMMA ) { @@ -1744,13 +1735,6 @@ abstract class DatabaseBase implements DatabaseType { $first = false; } - // Support 'NOT IN' by suffixing fieldname with an exclamation mark - $not = false; - if( substr($field,-1) == '!' ) { - $not = true; - $field = substr($field, 0, -1 ); - } - if ( ( $mode == LIST_AND || $mode == LIST_OR ) && is_numeric( $field ) ) { $list .= "($value)"; } elseif ( ( $mode == LIST_SET ) && is_numeric( $field ) ) { @@ -1763,12 +1747,9 @@ abstract class DatabaseBase implements DatabaseType { // Don't necessarily assume the single key is 0; we don't // enforce linear numeric ordering on other arrays here. $value = array_values( $value ); - - $operator = $not ? ' != ' : ' = '; - $list .= $field . $operator . $this->addQuotes( $value[0] ); + $list .= $field . " = " . $this->addQuotes( $value[0] ); } else { - $operator = $not ? ' NOT IN ' : ' IN '; - $list .= $field . $operator . "(" . $this->makeList( $value ) . ")"; + $list .= $field . " IN (" . $this->makeList( $value ) . ") "; } } elseif ( $value === null ) { if ( $mode == LIST_AND || $mode == LIST_OR ) { diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php index 8b9e72ac26..e53f04839b 100644 --- a/includes/specials/SpecialRecentchanges.php +++ b/includes/specials/SpecialRecentchanges.php @@ -325,24 +325,25 @@ class SpecialRecentChanges extends IncludableSpecialPage { # Namespace filtering if( $opts['namespace'] !== '' ) { - $namespaces[] = $opts['namespace']; + $selectedNS = $dbr->addQuotes( $opts['namespace'] ); + $operator = $opts['invert'] ? '!=' : '='; + $boolean = $opts['invert'] ? 'AND' : 'OR'; - $inversionSuffix = $opts['invert'] ? '!' : ''; - - if( $opts['associated'] ) { - # namespace association (bug 2429) - $namespaces[] = MWNamespace::getAssociated( $opts['namespace'] ); + # namespace association (bug 2429) + if( !$opts['associated'] ) { + $condition = "rc_namespace $operator $selectedNS"; + } else { + # Also add the associated namespace + $associatedNS = $dbr->addQuotes( + MWNamespace::getAssociated( $opts['namespace'] ) + ); + $condition = "(rc_namespace $operator $selectedNS " + . $boolean + . " rc_namespace $operator $associatedNS)"; } - $condition = $dbr->makeList( - array( 'rc_namespace' . $inversionSuffix - => $namespaces ), - LIST_AND - ); - $conds[] = $condition; } - return $conds; } diff --git a/tests/phpunit/includes/db/DatabaseTest.php b/tests/phpunit/includes/db/DatabaseTest.php index 6de510ad96..d480ac6e00 100644 --- a/tests/phpunit/includes/db/DatabaseTest.php +++ b/tests/phpunit/includes/db/DatabaseTest.php @@ -90,34 +90,6 @@ class DatabaseTest extends MediaWikiTestCase { $sql ); } - function testMakeNotInList() { - $this->assertEquals( - "field IN ('0','1')", - $this->db->makeList( array( - 'field' => array( 0, 1 ) - ), LIST_AND ) - ); - $this->assertEquals( - "field NOT IN ('0','1')", - $this->db->makeList( array( - 'field!' => array( 0, 1 ) - ), LIST_AND ) - ); - - // make sure an array with only one value use = or != - $this->assertEquals( - "field = '777'", - $this->db->makeList( array( - 'field' => array( 777 ) - ), LIST_AND ) - ); - $this->assertEquals( - "field != '888'", - $this->db->makeList( array( - 'field!' => array( 888 ) - ), LIST_AND ) - ); - } } -- 2.20.1