Add BaseSearchResultSet
authorDavid Causse <dcausse@wikimedia.org>
Thu, 25 Jul 2019 12:11:06 +0000 (14:11 +0200)
committerDavid Causse <dcausse@wikimedia.org>
Thu, 25 Jul 2019 13:47:01 +0000 (15:47 +0200)
Meant to hold the B/C behaviors and be the base class implemented
by extensions.

Bug: T228626
Change-Id: I072a9bd0f94bd785d1ff51f0e6ee13790e37b417

autoload.php
includes/search/BaseSearchResultSet.php [new file with mode: 0644]
includes/search/ISearchResultSet.php
includes/search/SearchEngine.php
includes/search/SearchResultSet.php
tests/phpunit/includes/search/SearchResultSetTest.php

index e6e6504..88d7777 100644 (file)
@@ -181,6 +181,7 @@ $wgAutoloadLocalClasses = [
        'BadTitleError' => __DIR__ . '/includes/exception/BadTitleError.php',
        'BagOStuff' => __DIR__ . '/includes/libs/objectcache/BagOStuff.php',
        'BaseDump' => __DIR__ . '/includes/export/BaseDump.php',
+       'BaseSearchResultSet' => __DIR__ . '/includes/search/BaseSearchResultSet.php',
        'BaseTemplate' => __DIR__ . '/includes/skins/BaseTemplate.php',
        'BashkirUppercaseCollation' => __DIR__ . '/includes/collation/BashkirUppercaseCollation.php',
        'BatchRowIterator' => __DIR__ . '/includes/utils/BatchRowIterator.php',
diff --git a/includes/search/BaseSearchResultSet.php b/includes/search/BaseSearchResultSet.php
new file mode 100644 (file)
index 0000000..d8aed0e
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * BaseSearchResultSet is the base class that must be extended by SearchEngine
+ * search result set implementations.
+ *
+ * This base class is meant to hold B/C behaviors and to be useful it must never:
+ * - be used as type hints (ISearchResultSet must be used for this)
+ * - implement a constructor
+ * - declare utility methods
+ *
+ * @ingroup Search
+ */
+abstract class BaseSearchResultSet implements ISearchResultSet {
+
+       /**
+        * @var ArrayIterator|null Iterator supporting BC iteration methods
+        */
+       private $bcIterator;
+
+       /**
+        * Fetches next search result, or false.
+        * @deprecated since 1.32; Use self::extractResults() or foreach
+        * @return SearchResult|false
+        */
+       public function next() {
+               wfDeprecated( __METHOD__, '1.32' );
+               $it = $this->bcIterator();
+               $searchResult = $it->current();
+               $it->next();
+               return $searchResult ?? false;
+       }
+
+       /**
+        * Rewind result set back to beginning
+        * @deprecated since 1.32; Use self::extractResults() or foreach
+        */
+       public function rewind() {
+               wfDeprecated( __METHOD__, '1.32' );
+               $this->bcIterator()->rewind();
+       }
+
+       private function bcIterator() {
+               if ( $this->bcIterator === null ) {
+                       $this->bcIterator = 'RECURSION';
+                       $this->bcIterator = $this->getIterator();
+               } elseif ( $this->bcIterator === 'RECURSION' ) {
+                       // Either next/rewind or extractResults must be implemented.  This
+                       // class was potentially instantiated directly. It should be
+                       // abstract with abstract methods to enforce this but that's a
+                       // breaking change...
+                       wfDeprecated( static::class . ' without implementing extractResults', '1.32' );
+                       $this->bcIterator = new ArrayIterator( [] );
+               }
+               return $this->bcIterator;
+       }
+
+       /**
+        * Fetch an array of regular expression fragments for matching
+        * the search terms as parsed by this engine in a text extract.
+        * STUB
+        *
+        * @return string[]
+        * @deprecated since 1.34 (use SqlSearchResult)
+        */
+       public function termMatches() {
+               return [];
+       }
+
+       /**
+        * Frees the result set, if applicable.
+        * @deprecated noop since 1.34
+        */
+       public function free() {
+       }
+}
index 0dd902b..5faa445 100644 (file)
@@ -1,6 +1,11 @@
 <?php
 
 /**
+ * A set of SearchEngine results.
+ * Must not be directly implemented by extension, please extend BaseSearchResultSet instead.
+ * This interface must only be used for type hinting.
+ *
+ * @see BaseSearchResultSet
  * @ingroup Search
  */
 interface ISearchResultSet extends \Countable, \IteratorAggregate {
index 32b0f06..31af13d 100644 (file)
@@ -803,6 +803,10 @@ abstract class SearchEngine {
                        $setAugmentors[$name] = new PerRowAugmentor( $row );
                }
 
+               /**
+                * @var string $name
+                * @var ResultSetAugmentor $augmentor
+                */
                foreach ( $setAugmentors as $name => $augmentor ) {
                        $data = $augmentor->augmentAll( $resultSet );
                        if ( $data ) {
index c9686bc..b8e40d5 100644 (file)
@@ -24,7 +24,7 @@
 /**
  * @ingroup Search
  */
-class SearchResultSet implements ISearchResultSet {
+class SearchResultSet extends BaseSearchResultSet {
 
        protected $containedSyntax = false;
 
@@ -42,25 +42,11 @@ class SearchResultSet implements ISearchResultSet {
         */
        protected $results;
 
-       /**
-        * Set of result's extra data, indexed per result id
-        * and then per data item name.
-        * The structure is:
-        * PAGE_ID => [ augmentor name => data, ... ]
-        * @var array[]
-        */
-       protected $extraData = [];
-
        /**
         * @var boolean True when there are more pages of search results available.
         */
        private $hasMoreResults;
 
-       /**
-        * @var ArrayIterator|null Iterator supporting BC iteration methods
-        */
-       private $bcIterator;
-
        /**
         * @param bool $containedSyntax True when query is not requesting a simple
         *  term match
@@ -78,18 +64,6 @@ class SearchResultSet implements ISearchResultSet {
                $this->hasMoreResults = $hasMoreResults;
        }
 
-       /**
-        * Fetch an array of regular expression fragments for matching
-        * the search terms as parsed by this engine in a text extract.
-        * STUB
-        *
-        * @return string[]
-        * @deprecated since 1.34 (use SqlSearchResult)
-        */
-       public function termMatches() {
-               return [];
-       }
-
        public function numRows() {
                return $this->count();
        }
@@ -183,50 +157,6 @@ class SearchResultSet implements ISearchResultSet {
                return false;
        }
 
-       /**
-        * Fetches next search result, or false.
-        * @deprecated since 1.32; Use self::extractResults() or foreach
-        * @return SearchResult|false
-        */
-       public function next() {
-               wfDeprecated( __METHOD__, '1.32' );
-               $it = $this->bcIterator();
-               $searchResult = $it->current();
-               $it->next();
-               return $searchResult ?? false;
-       }
-
-       /**
-        * Rewind result set back to beginning
-        * @deprecated since 1.32; Use self::extractResults() or foreach
-        */
-       public function rewind() {
-               wfDeprecated( __METHOD__, '1.32' );
-               $this->bcIterator()->rewind();
-       }
-
-       private function bcIterator() {
-               if ( $this->bcIterator === null ) {
-                       $this->bcIterator = 'RECURSION';
-                       $this->bcIterator = $this->getIterator();
-               } elseif ( $this->bcIterator === 'RECURSION' ) {
-                       // Either next/rewind or extractResults must be implemented.  This
-                       // class was potentially instantiated directly. It should be
-                       // abstract with abstract methods to enforce this but that's a
-                       // breaking change...
-                       wfDeprecated( static::class . ' without implementing extractResults', '1.32' );
-                       $this->bcIterator = new ArrayIterator( [] );
-               }
-               return $this->bcIterator;
-       }
-
-       /**
-        * Frees the result set, if applicable.
-        * @deprecated noop since 1.34
-        */
-       public function free() {
-       }
-
        /**
         * Did the search contain search syntax?  If so, Special:Search won't offer
         * the user a link to a create a page named by the search string because the
index 774e023..2d00a0d 100644 (file)
@@ -3,8 +3,8 @@
 class SearchResultSetTest extends MediaWikiTestCase {
        /**
         * @covers SearchResultSet::getIterator
-        * @covers SearchResultSet::next
-        * @covers SearchResultSet::rewind
+        * @covers BaseSearchResultSet::next
+        * @covers BaseSearchResultSet::rewind
         */
        public function testIterate() {
                $result = SearchResult::newFromTitle( Title::newMainPage() );
@@ -17,8 +17,8 @@ class SearchResultSetTest extends MediaWikiTestCase {
                }
                $this->assertEquals( 1, $count );
 
-               $this->hideDeprecated( 'SearchResultSet::rewind' );
-               $this->hideDeprecated( 'SearchResultSet::next' );
+               $this->hideDeprecated( 'BaseSearchResultSet::rewind' );
+               $this->hideDeprecated( 'BaseSearchResultSet::next' );
                $resultSet->rewind();
                $count = 0;
                while ( ( $iterResult = $resultSet->next() ) !== false ) {