2017-10-05 16:04:44 +01:00
|
|
|
<?php
|
|
|
|
// This file is part of Moodle - http://moodle.org/
|
|
|
|
//
|
|
|
|
// Moodle is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Iterator for skipping search recordset documents that are in the future.
|
|
|
|
*
|
|
|
|
* @package core_search
|
|
|
|
* @copyright 2017 The Open University
|
|
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace core_search;
|
|
|
|
|
|
|
|
defined('MOODLE_INTERNAL') || die();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Iterator for skipping search recordset documents that are in the future.
|
|
|
|
*
|
|
|
|
* This iterator stops iterating if it receives a document that was modified later than the
|
|
|
|
* specified cut-off time (usually current time).
|
|
|
|
*
|
|
|
|
* This iterator assumes that its parent iterator returns documents in modified order (which is
|
|
|
|
* required to be the case for search indexing). This means we will stop retrieving data from the
|
|
|
|
* recordset
|
|
|
|
*
|
|
|
|
* @copyright 2017 The Open University
|
|
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
|
|
*/
|
|
|
|
class skip_future_documents_iterator implements \Iterator {
|
|
|
|
/** @var \Iterator Parent iterator */
|
|
|
|
protected $parent;
|
|
|
|
|
|
|
|
/** @var int Cutoff time; anything later than this will cause the iterator to stop */
|
|
|
|
protected $cutoff;
|
|
|
|
|
2017-11-07 12:14:06 +00:00
|
|
|
/** @var mixed Current value of iterator */
|
|
|
|
protected $currentdoc;
|
|
|
|
|
|
|
|
/** @var bool True if current value is available */
|
|
|
|
protected $gotcurrent;
|
|
|
|
|
2017-10-05 16:04:44 +01:00
|
|
|
/**
|
|
|
|
* Constructor.
|
|
|
|
*
|
|
|
|
* @param \Iterator $parent Parent iterator, must return search documents in modified order
|
|
|
|
* @param int $cutoff Cut-off time, default is current time
|
|
|
|
*/
|
|
|
|
public function __construct(\Iterator $parent, $cutoff = 0) {
|
|
|
|
$this->parent = $parent;
|
|
|
|
if ($cutoff) {
|
|
|
|
$this->cutoff = $cutoff;
|
|
|
|
} else {
|
|
|
|
$this->cutoff = time();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function current() {
|
2017-11-07 12:14:06 +00:00
|
|
|
if (!$this->gotcurrent) {
|
|
|
|
$this->currentdoc = $this->parent->current();
|
|
|
|
$this->gotcurrent = true;
|
|
|
|
}
|
|
|
|
return $this->currentdoc;
|
2017-10-05 16:04:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public function next() {
|
|
|
|
$this->parent->next();
|
2017-11-07 12:14:06 +00:00
|
|
|
$this->gotcurrent = false;
|
2017-10-05 16:04:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public function key() {
|
|
|
|
return $this->parent->key();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function valid() {
|
MDL-60357 search: Ensure that the document is valid
We were previously testing tha the parent is valid, which it was, and
then fetching the current record, before fetching data from it.
However, the way in which the recordset walk works, the valid function
checks whether the _record_ itself is valid, whilst the current allows
for a callback to be applied.
In this instance, the data-entry was failing because the count of
indexfields was < 2. The recordset data itself was valid, but the view
was not, and as a result, the current() function returned false.
This false was not previously handled.
I've changed the logic so that we handle this case, and have removed a
double-negative in the process.
2017-10-13 09:41:57 +08:00
|
|
|
// Check that the parent is valid.
|
2017-10-05 16:04:44 +01:00
|
|
|
if (!$this->parent->valid()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-11-07 12:14:06 +00:00
|
|
|
if ($doc = $this->current()) {
|
MDL-60357 search: Ensure that the document is valid
We were previously testing tha the parent is valid, which it was, and
then fetching the current record, before fetching data from it.
However, the way in which the recordset walk works, the valid function
checks whether the _record_ itself is valid, whilst the current allows
for a callback to be applied.
In this instance, the data-entry was failing because the count of
indexfields was < 2. The recordset data itself was valid, but the view
was not, and as a result, the current() function returned false.
This false was not previously handled.
I've changed the logic so that we handle this case, and have removed a
double-negative in the process.
2017-10-13 09:41:57 +08:00
|
|
|
// This document is valid if the modification date is before the cutoff.
|
|
|
|
return $doc->get('modified') <= $this->cutoff;
|
2017-11-07 12:14:06 +00:00
|
|
|
} else {
|
|
|
|
// If the document is false/null, allow iterator to continue.
|
|
|
|
return true;
|
2017-10-05 16:04:44 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function rewind() {
|
|
|
|
$this->parent->rewind();
|
2017-11-07 12:14:06 +00:00
|
|
|
$this->gotcurrent = false;
|
2017-10-05 16:04:44 +01:00
|
|
|
}
|
|
|
|
}
|