21 private $suggestions = [];
26 private $pageMap = [];
31 private $hasMoreResults;
45 public function __construct( array $suggestions, $hasMoreResults =
false ) {
47 foreach ( $suggestions as $suggestion ) {
48 $pageID = $suggestion->getSuggestedTitleID();
49 if ( $pageID && empty( $this->pageMap[$pageID] ) ) {
50 $this->pageMap[$pageID] =
true;
52 $this->suggestions[] = $suggestion;
60 return $this->hasMoreResults;
68 return $this->suggestions;
76 public function map( $callback ) {
77 return array_map( $callback, $this->suggestions );
86 public function filter( $callback ) {
87 $before = count( $this->suggestions );
88 $this->suggestions = array_values( array_filter( $this->suggestions, $callback ) );
89 return $before - count( $this->suggestions );
99 if ( $pageID && isset( $this->pageMap[$pageID] ) ) {
102 if ( $this->
getSize() > 0 && $suggestion->
getScore() >= $this->getWorstScore() ) {
105 $this->suggestions[] = $suggestion;
107 $this->pageMap[$pageID] =
true;
125 $removed = array_splice( $this->suggestions, $key, 1 );
126 unset( $this->pageMap[$removed[0]->getSuggestedTitleID()] );
136 if ( $pageID && isset( $this->pageMap[$pageID] ) ) {
139 if ( $this->
getSize() > 0 && $suggestion->
getScore() <= $this->getBestScore() ) {
142 array_unshift( $this->suggestions, $suggestion );
144 $this->pageMap[$pageID] =
true;
155 foreach ( $this->suggestions as $k => $s ) {
156 $titleId = $s->getSuggestedTitleID();
157 if ( ( $titleId !=
null && $titleId === $suggestion->getSuggestedTitleID() )
158 || $s->getText() === $suggestion->getText()
160 array_splice( $this->suggestions, $k, 1 );
161 unset( $this->pageMap[$s->getSuggestedTitleID()] );
172 if ( !$this->suggestions ) {
175 return $this->suggestions[0]->getScore();
182 if ( !$this->suggestions ) {
185 return end( $this->suggestions )->getScore();
192 return count( $this->suggestions );
200 if ( count( $this->suggestions ) > $limit ) {
201 $this->suggestions = array_slice( $this->suggestions, 0, $limit );
202 $this->pageMap = self::buildPageMap( $this->suggestions );
203 $this->hasMoreResults =
true;
213 private static function buildPageMap( array $suggestions ): array {
215 foreach ( $suggestions as $suggestion ) {
216 $pageID = $suggestion->getSuggestedTitleID();
218 $pageMap[$pageID] =
true;
234 public static function fromTitles( array $titles, $hasMoreResults =
false ) {
235 $score = count( $titles );
236 $suggestions = array_map(
static function ( $title ) use ( &$score ) {
237 return SearchSuggestion::fromTitle( $score--, $title );
251 public static function fromStrings( array $titles, $hasMoreResults =
false ) {
252 $score = count( $titles );
253 $suggestions = array_map(
static function ( $title ) use ( &$score ) {
254 return SearchSuggestion::fromText( $score--, $title );
268class_alias( SearchSuggestionSet::class,
'SearchSuggestionSet' );