From 7fd6ef9ca58709c5f7b579812b421852f5f19843 Mon Sep 17 00:00:00 2001 From: Erik Bernhardson Date: Tue, 18 Jul 2017 21:19:48 -0700 Subject: [PATCH] Support custom offsets from SearchResultSet Work to support interleaved AB testing of search will display interleaved results of two search configurations on the first page of results, but standard results on all pages other than the first page. This means that while 20 results may be requested, the next 'new' result of the primary query may be at position 10. Allow the SearchResultSet to declare what the new offset is. Bug: T150032 Change-Id: I14c0c33249fcdb66f72f5966e2aa72781a34daee --- includes/search/SearchResultSet.php | 10 ++++++++++ includes/specials/SpecialSearch.php | 10 +++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/includes/search/SearchResultSet.php b/includes/search/SearchResultSet.php index 978db2707f..89d2299b1b 100644 --- a/includes/search/SearchResultSet.php +++ b/includes/search/SearchResultSet.php @@ -264,4 +264,14 @@ class SearchResultSet { $result->setExtensionData( $this->extraData[$id] ); return $this->extraData[$id]; } + + /** + * @return int|null The offset the current page starts at. Typically + * this should be null to allow the UI to decide on its own, but in + * special cases like interleaved AB tests specifying explicitly is + * necessary. + */ + public function getOffset() { + return null; + } } diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php index e89dbc96ed..b739c34ff3 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -436,9 +436,17 @@ class SpecialSearch extends SpecialPage { // prev/next links if ( $totalRes > $this->limit || $this->offset ) { + // Allow matches to define the correct offset, as interleaved + // AB testing may require a different next page offset. + if ( $textMatches && $textMatches->getOffset() !== null ) { + $offset = $textMatches->getOffset(); + } else { + $offset = $this->offset; + } + $prevnext = $this->getLanguage()->viewPrevNext( $this->getPageTitle(), - $this->offset, + $offset, $this->limit, $this->powerSearchOptions() + [ 'search' => $term ], $this->limit + $this->offset >= $totalRes -- 2.20.1