to hold non-obvious behaviors and rarely specialized methods.
Change-Id: Idc600e22b35a01be8be8cb629bfb09701e842cd7
'SearchResult' => __DIR__ . '/includes/search/SearchResult.php',
'SearchResultSet' => __DIR__ . '/includes/search/SearchResultSet.php',
'SearchResultSetTrait' => __DIR__ . '/includes/search/SearchResultSetTrait.php',
+ 'SearchResultTrait' => __DIR__ . '/includes/search/SearchResultTrait.php',
'SearchSqlite' => __DIR__ . '/includes/search/SearchSqlite.php',
'SearchSuggestion' => __DIR__ . '/includes/search/SearchSuggestion.php',
'SearchSuggestionSet' => __DIR__ . '/includes/search/SearchSuggestionSet.php',
* @ingroup Search
*/
class SearchResult {
+ use SearchResultTrait;
/**
* @var Revision
*/
protected $mText;
- /**
- * A function returning a set of extension data.
- * @var Closure|null
- */
- protected $extensionData;
-
/**
* Return a new SearchResult and initializes it with a title.
*
return false;
}
- /**
- * Get the extension data as:
- * augmentor name => data
- * @return array[]
- */
- public function getExtensionData() {
- if ( $this->extensionData ) {
- return call_user_func( $this->extensionData );
- } else {
- return [];
- }
- }
-
- /**
- * Set extension data for this result.
- * The data is:
- * augmentor name => data
- * @param Closure|array $extensionData Takes no arguments, returns
- * either array of extension data or null.
- */
- public function setExtensionData( $extensionData ) {
- if ( $extensionData instanceof Closure ) {
- $this->extensionData = $extensionData;
- } elseif ( is_array( $extensionData ) ) {
- wfDeprecated( __METHOD__ . ' with array argument', '1.32' );
- $this->extensionData = function () use ( $extensionData ) {
- return $extensionData;
- };
- } else {
- $type = is_object( $extensionData )
- ? get_class( $extensionData )
- : gettype( $extensionData );
- throw new \InvalidArgumentException(
- __METHOD__ . " must be called with Closure|array, but received $type" );
- }
- }
}
--- /dev/null
+<?php
+
+/**
+ * Trait for SearchResult subclasses to share non-obvious behaviors or methods
+ * that rarely specialized
+ */
+trait SearchResultTrait {
+ /**
+ * A function returning a set of extension data.
+ * @var Closure|null
+ */
+ protected $extensionData;
+
+ /**
+ * Get the extension data as:
+ * augmentor name => data
+ * @return array[]
+ */
+ public function getExtensionData() {
+ if ( $this->extensionData ) {
+ return call_user_func( $this->extensionData );
+ } else {
+ return [];
+ }
+ }
+
+ /**
+ * Set extension data for this result.
+ * The data is:
+ * augmentor name => data
+ * @param Closure|array $extensionData Takes no arguments, returns
+ * either array of extension data or null.
+ */
+ public function setExtensionData( $extensionData ) {
+ if ( $extensionData instanceof Closure ) {
+ $this->extensionData = $extensionData;
+ } elseif ( is_array( $extensionData ) ) {
+ wfDeprecated( __METHOD__ . ' with array argument', '1.32' );
+ $this->extensionData = function () use ( $extensionData ) {
+ return $extensionData;
+ };
+ } else {
+ $type = is_object( $extensionData )
+ ? get_class( $extensionData )
+ : gettype( $extensionData );
+ throw new \InvalidArgumentException(
+ __METHOD__ . " must be called with Closure|array, but received $type" );
+ }
+ }
+}
+++ /dev/null
-<?php
-
-class SearchResultTest extends MediawikiTestCase {
- /**
- * @covers SearchResult::getExtensionData
- * @covers SearchResult::setExtensionData
- */
- public function testExtensionData() {
- $result = SearchResult::newFromTitle( Title::newMainPage() );
- $this->assertEquals( [], $result->getExtensionData(), 'starts empty' );
-
- $data = [ 'hello' => 'world' ];
- $result->setExtensionData( function () use ( &$data ) {
- return $data;
- } );
- $this->assertEquals( $data, $result->getExtensionData(), 'can set extension data' );
- $data['this'] = 'that';
- $this->assertEquals( $data, $result->getExtensionData(), 'refetches from callback' );
- }
-
- /**
- * @covers SearchResult::getExtensionData
- * @covers SearchResult::setExtensionData
- */
- public function testExtensionDataArrayBC() {
- $result = SearchResult::newFromTitle( Title::newMainPage() );
- $data = [ 'hello' => 'world' ];
- $this->hideDeprecated( 'SearchResult::setExtensionData with array argument' );
- $this->assertEquals( [], $result->getExtensionData(), 'starts empty' );
- $result->setExtensionData( $data );
- $this->assertEquals( $data, $result->getExtensionData(), 'can set extension data' );
- $data['this'] = 'that';
- $this->assertNotEquals( $data, $result->getExtensionData(), 'shouldnt hold any reference' );
-
- $result->setExtensionData( $data );
- $this->assertEquals( $data, $result->getExtensionData(), 'can replace extension data' );
- }
-}
--- /dev/null
+<?php
+
+class SearchResultTraitTest extends MediawikiTestCase {
+ /**
+ * @covers SearchResultTrait::getExtensionData
+ * @covers SearchResultTrait::setExtensionData
+ */
+ public function testExtensionData() {
+ $result = new class() {
+ use SearchResultTrait;
+ };
+ $this->assertEquals( [], $result->getExtensionData(), 'starts empty' );
+
+ $data = [ 'hello' => 'world' ];
+ $result->setExtensionData( function () use ( &$data ) {
+ return $data;
+ } );
+ $this->assertEquals( $data, $result->getExtensionData(), 'can set extension data' );
+ $data['this'] = 'that';
+ $this->assertEquals( $data, $result->getExtensionData(), 'refetches from callback' );
+ }
+
+ /**
+ * @covers SearchResultTrait::getExtensionData
+ * @covers SearchResultTrait::setExtensionData
+ */
+ public function testExtensionDataArrayBC() {
+ $result = new class() {
+ use SearchResultTrait;
+ };
+ $data = [ 'hello' => 'world' ];
+ $this->hideDeprecated( 'SearchResultTrait::setExtensionData with array argument' );
+ $this->assertEquals( [], $result->getExtensionData(), 'starts empty' );
+ $result->setExtensionData( $data );
+ $this->assertEquals( $data, $result->getExtensionData(), 'can set extension data' );
+ $data['this'] = 'that';
+ $this->assertNotEquals( $data, $result->getExtensionData(), 'shouldnt hold any reference' );
+
+ $result->setExtensionData( $data );
+ $this->assertEquals( $data, $result->getExtensionData(), 'can replace extension data' );
+ }
+}