Merge pull request #319 from creative-commoners/pulls/3/php81

ENH PHP 8.1 compatibility
This commit is contained in:
Guy Sartorelli 2022-04-26 17:58:14 +12:00 committed by GitHub
commit 6d90b3ca35
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 132 additions and 122 deletions

View File

@ -222,7 +222,7 @@ class SearchCriteria implements SearchCriteriaInterface
protected function getConjunction($key) protected function getConjunction($key)
{ {
$conjunctions = $this->getConjunctions(); $conjunctions = $this->getConjunctions();
if (!array_key_exists($key, $conjunctions)) { if (!array_key_exists($key, $conjunctions ?? [])) {
return null; return null;
} }

View File

@ -67,7 +67,7 @@ class FullTextSearch
} }
if ($hidden) { if ($hidden) {
$candidates = array_diff($candidates, $hidden); $candidates = array_diff($candidates ?? [], $hidden);
} }
// Create all indexes // Create all indexes
@ -86,7 +86,7 @@ class FullTextSearch
$valid = array(); $valid = array();
foreach ($all as $indexclass => $instance) { foreach ($all as $indexclass => $instance) {
if (is_subclass_of($indexclass, $class)) { if (is_subclass_of($indexclass, $class ?? '')) {
$valid[$indexclass] = $instance; $valid[$indexclass] = $instance;
} }
} }

View File

@ -70,7 +70,7 @@ abstract class SearchIndex extends ViewableData
*/ */
protected function getSourceName($source) protected function getSourceName($source)
{ {
$source = explode(self::config()->get('class_delimiter'), $source); $source = explode(self::config()->get('class_delimiter') ?? '', $source ?? '');
return $source[0]; return $source[0];
} }
@ -102,7 +102,7 @@ abstract class SearchIndex extends ViewableData
*/ */
public function fieldData($field, $forceType = null, $extraOptions = []) public function fieldData($field, $forceType = null, $extraOptions = [])
{ {
$fullfield = str_replace(".", "_", $field); $fullfield = str_replace(".", "_", $field ?? '');
$sources = $this->getClasses(); $sources = $this->getClasses();
foreach ($sources as $source => $options) { foreach ($sources as $source => $options) {
@ -112,8 +112,8 @@ abstract class SearchIndex extends ViewableData
$found = []; $found = [];
if (strpos($field, '.') !== false) { if (strpos($field ?? '', '.') !== false) {
$lookups = explode(".", $field); $lookups = explode(".", $field ?? '');
$field = array_pop($lookups); $field = array_pop($lookups);
foreach ($lookups as $lookup) { foreach ($lookups as $lookup) {
@ -133,7 +133,7 @@ abstract class SearchIndex extends ViewableData
// we only want to include base class for relation, omit classes that inherited the relation // we only want to include base class for relation, omit classes that inherited the relation
$relationList = Config::inst()->get($dataclass, 'has_one', Config::UNINHERITED); $relationList = Config::inst()->get($dataclass, 'has_one', Config::UNINHERITED);
$relationList = (!is_null($relationList)) ? $relationList : []; $relationList = (!is_null($relationList)) ? $relationList : [];
if (!array_key_exists($lookup, $relationList)) { if (!array_key_exists($lookup, $relationList ?? [])) {
continue; continue;
} }
@ -146,7 +146,7 @@ abstract class SearchIndex extends ViewableData
// we only want to include base class for relation, omit classes that inherited the relation // we only want to include base class for relation, omit classes that inherited the relation
$relationList = Config::inst()->get($dataclass, 'has_many', Config::UNINHERITED); $relationList = Config::inst()->get($dataclass, 'has_many', Config::UNINHERITED);
$relationList = (!is_null($relationList)) ? $relationList : []; $relationList = (!is_null($relationList)) ? $relationList : [];
if (!array_key_exists($lookup, $relationList)) { if (!array_key_exists($lookup, $relationList ?? [])) {
continue; continue;
} }
@ -160,7 +160,7 @@ abstract class SearchIndex extends ViewableData
// we only want to include base class for relation, omit classes that inherited the relation // we only want to include base class for relation, omit classes that inherited the relation
$relationList = Config::inst()->get($dataclass, 'many_many', Config::UNINHERITED); $relationList = Config::inst()->get($dataclass, 'many_many', Config::UNINHERITED);
$relationList = (!is_null($relationList)) ? $relationList : []; $relationList = (!is_null($relationList)) ? $relationList : [];
if (!array_key_exists($lookup, $relationList)) { if (!array_key_exists($lookup, $relationList ?? [])) {
continue; continue;
} }
@ -199,7 +199,7 @@ abstract class SearchIndex extends ViewableData
$class = $this->getSourceName($class); $class = $this->getSourceName($class);
$dataclasses = SearchIntrospection::hierarchy($class, $options['include_children']); $dataclasses = SearchIntrospection::hierarchy($class, $options['include_children']);
while (count($dataclasses)) { while (count($dataclasses ?? [])) {
$dataclass = array_shift($dataclasses); $dataclass = array_shift($dataclasses);
$type = null; $type = null;
$fieldoptions = $options; $fieldoptions = $options;
@ -228,9 +228,9 @@ abstract class SearchIndex extends ViewableData
if ($type) { if ($type) {
// Don't search through child classes of a class we matched on. TODO: Should we? // Don't search through child classes of a class we matched on. TODO: Should we?
$dataclasses = array_diff($dataclasses, array_values(ClassInfo::subclassesFor($dataclass))); $dataclasses = array_diff($dataclasses ?? [], array_values(ClassInfo::subclassesFor($dataclass) ?? []));
// Trim arguments off the type string // Trim arguments off the type string
if (preg_match('/^(\w+)\(/', $type, $match)) { if (preg_match('/^(\w+)\(/', $type ?? '', $match)) {
$type = $match[1]; $type = $match[1];
} }
// Get the origin // Get the origin
@ -412,7 +412,7 @@ abstract class SearchIndex extends ViewableData
public function buildDependancyList() public function buildDependancyList()
{ {
$this->dependancyList = array_keys($this->getClasses()); $this->dependancyList = array_keys($this->getClasses() ?? []);
foreach ($this->getFieldsIterator() as $name => $field) { foreach ($this->getFieldsIterator() as $name => $field) {
if (!isset($field['class'])) { if (!isset($field['class'])) {
@ -434,7 +434,7 @@ abstract class SearchIndex extends ViewableData
$this->derivedFields = array(); $this->derivedFields = array();
foreach ($this->getFieldsIterator() as $name => $field) { foreach ($this->getFieldsIterator() as $name => $field) {
if (count($field['lookup_chain']) < 2) { if (count($field['lookup_chain'] ?? []) < 2) {
continue; continue;
} }
@ -445,7 +445,7 @@ abstract class SearchIndex extends ViewableData
$this->derivedFields[$key]['fields'][$fieldname] = $fieldname; $this->derivedFields[$key]['fields'][$fieldname] = $fieldname;
SearchIntrospection::add_unique_by_ancestor($this->derivedFields['classes'], $field['class']); SearchIntrospection::add_unique_by_ancestor($this->derivedFields['classes'], $field['class']);
} else { } else {
$chain = array_reverse($field['lookup_chain']); $chain = array_reverse($field['lookup_chain'] ?? []);
array_shift($chain); array_shift($chain);
$this->derivedFields[$key] = array( $this->derivedFields[$key] = array(
@ -473,7 +473,7 @@ abstract class SearchIndex extends ViewableData
{ {
ksort($state); ksort($state);
$parts = array('id' => $id, 'base' => $base, 'state' => json_encode($state)); $parts = array('id' => $id, 'base' => $base, 'state' => json_encode($state));
return implode('-', array_values($parts)); return implode('-', array_values($parts ?? []));
} }
/** /**
@ -586,7 +586,7 @@ abstract class SearchIndex extends ViewableData
// First, if this object is directly contained in the index, add it // First, if this object is directly contained in the index, add it
foreach ($this->classes as $searchclass => $options) { foreach ($this->classes as $searchclass => $options) {
if ($searchclass == $class || ($options['include_children'] && is_subclass_of($class, $searchclass))) { if ($searchclass == $class || ($options['include_children'] && is_subclass_of($class, $searchclass ?? ''))) {
$base = DataObject::getSchema()->baseDataClass($searchclass); $base = DataObject::getSchema()->baseDataClass($searchclass);
$dirty[$base] = array(); $dirty[$base] = array();
foreach ($statefulids as $statefulid) { foreach ($statefulids as $statefulid) {
@ -605,7 +605,7 @@ abstract class SearchIndex extends ViewableData
if (!SearchIntrospection::is_subclass_of($class, $derivation['classes'])) { if (!SearchIntrospection::is_subclass_of($class, $derivation['classes'])) {
continue; continue;
} }
if (!array_intersect_key($fields, $derivation['fields'])) { if (!array_intersect_key($fields ?? [], $derivation['fields'])) {
continue; continue;
} }

View File

@ -89,7 +89,7 @@ abstract class SearchUpdateBatchedProcessor extends SearchUpdateProcessor
} }
// Don't re-process completed queue // Don't re-process completed queue
if ($this->currentBatch >= count($this->batches)) { if ($this->currentBatch >= count($this->batches ?? [])) {
return true; return true;
} }
@ -138,14 +138,14 @@ abstract class SearchUpdateBatchedProcessor extends SearchUpdateProcessor
while ($ids) { while ($ids) {
// Estimate maximum number of items to take for this iteration, allowing for the soft cap // Estimate maximum number of items to take for this iteration, allowing for the soft cap
$take = $batchSize - $currentSize; $take = $batchSize - $currentSize;
if (count($ids) <= $take + $softCap) { if (count($ids ?? []) <= $take + $softCap) {
$take += $softCap; $take += $softCap;
} }
$items = array_slice($ids, 0, $take, true); $items = array_slice($ids ?? [], 0, $take, true);
$ids = array_slice($ids, count($items), null, true); $ids = array_slice($ids ?? [], count($items ?? []), null, true);
// Update batch // Update batch
$currentSize += count($items); $currentSize += count($items ?? []);
$merge = array( $merge = array(
$base => array( $base => array(
$stateKey => array( $stateKey => array(

View File

@ -97,7 +97,7 @@ class SearchUpdateCommitJobProcessor implements QueuedJob
if ($dirty) { if ($dirty) {
$indexes = FullTextSearch::get_indexes(); $indexes = FullTextSearch::get_indexes();
static::$dirty_indexes = array_keys($indexes); static::$dirty_indexes = array_keys($indexes ?? []);
} }
return $id; return $id;
} }
@ -126,7 +126,7 @@ class SearchUpdateCommitJobProcessor implements QueuedJob
{ {
if (empty($this->indexes)) { if (empty($this->indexes)) {
$indexes = FullTextSearch::get_indexes(); $indexes = FullTextSearch::get_indexes();
$this->indexes = array_keys($indexes); $this->indexes = array_keys($indexes ?? []);
} }
return $this->indexes; return $this->indexes;
} }
@ -135,7 +135,7 @@ class SearchUpdateCommitJobProcessor implements QueuedJob
{ {
// If we've indexed exactly as many as we would like, we are done // If we've indexed exactly as many as we would like, we are done
return $this->skipped return $this->skipped
|| (count($this->getAllIndexes()) <= count($this->completed)); || (count($this->getAllIndexes() ?? []) <= count($this->completed ?? []));
} }
public function prepareForRestart() public function prepareForRestart()
@ -213,7 +213,7 @@ class SearchUpdateCommitJobProcessor implements QueuedJob
{ {
// Skip index if this is already complete // Skip index if this is already complete
$name = get_class($index); $name = get_class($index);
if (in_array($name, $this->completed)) { if (in_array($name, $this->completed ?? [])) {
$this->addMessage("Skipping already comitted index {$name}"); $this->addMessage("Skipping already comitted index {$name}");
return; return;
} }
@ -240,8 +240,8 @@ class SearchUpdateCommitJobProcessor implements QueuedJob
public function getJobData() public function getJobData()
{ {
$data = new stdClass(); $data = new stdClass();
$data->totalSteps = count($this->getAllIndexes()); $data->totalSteps = count($this->getAllIndexes() ?? []);
$data->currentStep = count($this->completed); $data->currentStep = count($this->completed ?? []);
$data->isComplete = $this->jobFinished(); $data->isComplete = $this->jobFinished();
$data->messages = $this->messages; $data->messages = $this->messages;
@ -265,7 +265,7 @@ class SearchUpdateCommitJobProcessor implements QueuedJob
public function addMessage($message, $severity = 'INFO') public function addMessage($message, $severity = 'INFO')
{ {
$severity = strtoupper($severity); $severity = strtoupper($severity ?? '');
$this->messages[] = '[' . date('Y-m-d H:i:s') . "][$severity] $message"; $this->messages[] = '[' . date('Y-m-d H:i:s') . "][$severity] $message";
} }

View File

@ -55,7 +55,7 @@ abstract class SearchUpdateProcessor
$forclass[$statekey] = array('state' => $state, 'ids' => array($id => array($index))); $forclass[$statekey] = array('state' => $state, 'ids' => array($id => array($index)));
} elseif (!isset($forclass[$statekey]['ids'][$id])) { } elseif (!isset($forclass[$statekey]['ids'][$id])) {
$forclass[$statekey]['ids'][$id] = array($index); $forclass[$statekey]['ids'][$id] = array($index);
} elseif (array_search($index, $forclass[$statekey]['ids'][$id]) === false) { } elseif (array_search($index, $forclass[$statekey]['ids'][$id] ?? []) === false) {
$forclass[$statekey]['ids'][$id][] = $index; $forclass[$statekey]['ids'][$id][] = $index;
// dirty count stays the same // dirty count stays the same
} }
@ -89,7 +89,7 @@ abstract class SearchUpdateProcessor
SearchVariant::activate_state($state); SearchVariant::activate_state($state);
// Ensure that indexes for all new / updated objects are included // Ensure that indexes for all new / updated objects are included
$objs = DataObject::get($base)->byIDs(array_keys($ids)); $objs = DataObject::get($base)->byIDs(array_keys($ids ?? []));
/** @var DataObject $obj */ /** @var DataObject $obj */
foreach ($objs as $obj) { foreach ($objs as $obj) {

View File

@ -45,7 +45,7 @@ class SearchUpdateQueuedJobProcessor extends SearchUpdateBatchedProcessor implem
public function jobFinished() public function jobFinished()
{ {
return $this->currentBatch >= count($this->batches); return $this->currentBatch >= count($this->batches ?? []);
} }
public function setup() public function setup()
@ -68,7 +68,7 @@ class SearchUpdateQueuedJobProcessor extends SearchUpdateBatchedProcessor implem
public function getJobData() public function getJobData()
{ {
$data = new stdClass(); $data = new stdClass();
$data->totalSteps = count($this->batches); $data->totalSteps = count($this->batches ?? []);
$data->currentStep = $this->currentBatch; $data->currentStep = $this->currentBatch;
$data->isComplete = $this->jobFinished(); $data->isComplete = $this->jobFinished();
$data->messages = $this->messages; $data->messages = $this->messages;
@ -91,7 +91,7 @@ class SearchUpdateQueuedJobProcessor extends SearchUpdateBatchedProcessor implem
public function addMessage($message, $severity = 'INFO') public function addMessage($message, $severity = 'INFO')
{ {
$severity = strtoupper($severity); $severity = strtoupper($severity ?? '');
$this->messages[] = '[' . date('Y-m-d H:i:s') . "][$severity] $message"; $this->messages[] = '[' . date('Y-m-d H:i:s') . "][$severity] $message";
} }

View File

@ -21,7 +21,7 @@ class SearchIntrospection
public static function is_subclass_of($class, $of) public static function is_subclass_of($class, $of)
{ {
$ancestry = isset(self::$ancestry[$class]) ? self::$ancestry[$class] : (self::$ancestry[$class] = ClassInfo::ancestry($class)); $ancestry = isset(self::$ancestry[$class]) ? self::$ancestry[$class] : (self::$ancestry[$class] = ClassInfo::ancestry($class));
return is_array($of) ? (bool)array_intersect($of, $ancestry) : array_key_exists($of, $ancestry); return is_array($of) ? (bool)array_intersect($of, $ancestry) : array_key_exists($of, $ancestry ?? []);
} }
protected static $hierarchy = array(); protected static $hierarchy = array();
@ -40,12 +40,12 @@ class SearchIntrospection
$key = "$class!" . ($includeSubclasses ? 'sc' : 'an') . '!' . ($dataOnly ? 'do' : 'al'); $key = "$class!" . ($includeSubclasses ? 'sc' : 'an') . '!' . ($dataOnly ? 'do' : 'al');
if (!isset(self::$hierarchy[$key])) { if (!isset(self::$hierarchy[$key])) {
$classes = array_values(ClassInfo::ancestry($class)); $classes = array_values(ClassInfo::ancestry($class) ?? []);
if ($includeSubclasses) { if ($includeSubclasses) {
$classes = array_unique(array_merge($classes, array_values(ClassInfo::subclassesFor($class)))); $classes = array_unique(array_merge($classes, array_values(ClassInfo::subclassesFor($class) ?? [])));
} }
$idx = array_search(DataObject::class, $classes); $idx = array_search(DataObject::class, $classes ?? []);
if ($idx !== false) { if ($idx !== false) {
array_splice($classes, 0, $idx+1); array_splice($classes, 0, $idx+1);
} }
@ -76,7 +76,7 @@ class SearchIntrospection
// Strip out any subclasses of $class already in the list // Strip out any subclasses of $class already in the list
$children = ClassInfo::subclassesFor($class); $children = ClassInfo::subclassesFor($class);
$list = array_diff($list, $children); $list = array_diff($list ?? [], $children);
// Then add the class in // Then add the class in
$list[] = $class; $list[] = $class;

View File

@ -199,11 +199,11 @@ class SearchableService
if (empty($skipClasses)) { if (empty($skipClasses)) {
return false; return false;
} }
if (in_array($class, $skipClasses)) { if (in_array($class, $skipClasses ?? [])) {
return true; return true;
} }
foreach ($skipClasses as $skipClass) { foreach ($skipClasses as $skipClass) {
if (in_array($skipClass, class_parents($class))) { if (in_array($skipClass, class_parents($class) ?? [])) {
return true; return true;
} }
} }

View File

@ -106,7 +106,7 @@ class SearchUpdater
'command' => $command, 'command' => $command,
'fields' => array() 'fields' => array()
); );
} elseif (is_subclass_of($class, $writes[$key]['class'])) { } elseif (is_subclass_of($class, $writes[$key]['class'] ?? '')) {
// Otherwise update the class label if it's more specific than the currently recorded one // Otherwise update the class label if it's more specific than the currently recorded one
$writes[$key]['class'] = $class; $writes[$key]['class'] = $class;
} }
@ -118,7 +118,7 @@ class SearchUpdater
} }
// Trim non-delete records without fields // Trim non-delete records without fields
foreach (array_keys($writes) as $key) { foreach (array_keys($writes ?? []) as $key) {
if ($writes[$key]['command'] !== 'delete' && empty($writes[$key]['fields'])) { if ($writes[$key]['command'] !== 'delete' && empty($writes[$key]['fields'])) {
unset($writes[$key]); unset($writes[$key]);
} }

View File

@ -202,7 +202,7 @@ abstract class SearchVariant
// Merge the variants applicable to the current class into the list of common variants, using // Merge the variants applicable to the current class into the list of common variants, using
// the variant instance to replace any previous versions for the same class name (should be singleton // the variant instance to replace any previous versions for the same class name (should be singleton
// anyway). // anyway).
$commonVariants = array_replace($commonVariants, $variantsForClass); $commonVariants = array_replace($commonVariants ?? [], $variantsForClass);
} }
// Cache for future calls // Cache for future calls
@ -322,7 +322,7 @@ abstract class SearchVariant
$merged = array_values(array_unique(array_merge($left, $right))); $merged = array_values(array_unique(array_merge($left, $right)));
// If there is only one item, return it as a single string // If there is only one item, return it as a single string
if (count($merged) === 1) { if (count($merged ?? []) === 1) {
return reset($merged); return reset($merged);
} }
return $merged; return $merged;

View File

@ -65,7 +65,7 @@ class SearchVariantVersioned extends SearchVariant
$class = $details['class']; $class = $details['class'];
$stage = Versioned::DRAFT; $stage = Versioned::DRAFT;
if (preg_match('/^(.*)_' . Versioned::LIVE . '$/', $table, $matches)) { if (preg_match('/^(.*)_' . Versioned::LIVE . '$/', $table ?? '', $matches)) {
$class = DataObject::getSchema()->tableClass($matches[1]); $class = DataObject::getSchema()->tableClass($matches[1]);
$stage = Versioned::LIVE; $stage = Versioned::LIVE;
} }

View File

@ -19,7 +19,7 @@ class SearchVariant_Caller
$values = array(); $values = array();
foreach ($this->variants as $variant) { foreach ($this->variants as $variant) {
if (method_exists($variant, $method)) { if (method_exists($variant, $method ?? '')) {
$value = $variant->$method(...$args); $value = $variant->$method(...$args);
if ($value !== null) { if ($value !== null) {
$values[] = $value; $values[] = $value;

View File

@ -81,9 +81,9 @@ abstract class SolrReindexBase implements SolrReindexHandler
// Apply filter // Apply filter
if (!is_array($filterClasses)) { if (!is_array($filterClasses)) {
$filterClasses = explode(',', $filterClasses); $filterClasses = explode(',', $filterClasses ?? '');
} }
return array_intersect_key($classes, array_combine($filterClasses, $filterClasses)); return array_intersect_key($classes ?? [], array_combine($filterClasses ?? [], $filterClasses ?? []));
} }
/** /**

View File

@ -109,7 +109,7 @@ class SolrReindexImmediateHandler extends SolrReindexBase
$res = $process->getOutput(); $res = $process->getOutput();
if ($logger) { if ($logger) {
$logger->info(preg_replace('/\r\n|\n/', '$0 ', $res)); $logger->info(preg_replace('/\r\n|\n/', '$0 ', $res ?? ''));
} }
// If we're in dev mode, commit more often for fun and profit // If we're in dev mode, commit more often for fun and profit

View File

@ -24,7 +24,7 @@ class SolrService extends SolrService_Core
*/ */
protected function coreCommand($command, $core, $params = array()) protected function coreCommand($command, $core, $params = array())
{ {
$command = strtoupper($command); $command = strtoupper($command ?? '');
$params = array_merge($params, array('action' => $command, 'wt' => 'json')); $params = array_merge($params, array('action' => $command, 'wt' => 'json'));
$params[$command === 'CREATE' ? 'name' : 'core'] = $core; $params[$command === 'CREATE' ? 'name' : 'core'] = $core;

View File

@ -94,7 +94,7 @@ class Solr
$module = ModuleLoader::getModule('silverstripe/fulltextsearch'); $module = ModuleLoader::getModule('silverstripe/fulltextsearch');
$modulePath = $module->getPath(); $modulePath = $module->getPath();
if (version_compare($version, '4', '>=')) { if (version_compare($version ?? '', '4', '>=')) {
$versionDefaults = [ $versionDefaults = [
'service' => Solr4Service::class, 'service' => Solr4Service::class,
'extraspath' => $modulePath . '/conf/solr/4/extras/', 'extraspath' => $modulePath . '/conf/solr/4/extras/',

View File

@ -89,7 +89,7 @@ abstract class SolrIndex extends SearchIndex
{ {
$globalOptions = Solr::solr_options(); $globalOptions = Solr::solr_options();
$path = $this->templatesPath ? $this->templatesPath : $globalOptions['templatespath']; $path = $this->templatesPath ? $this->templatesPath : $globalOptions['templatespath'];
return rtrim($path, '/'); return rtrim($path ?? '', '/');
} }
/** /**
@ -127,7 +127,7 @@ abstract class SolrIndex extends SearchIndex
$indexParts[] = $indexSuffix; $indexParts[] = $indexSuffix;
} }
return implode($indexParts); return implode($indexParts ?? '');
} }
public function getTypes() public function getTypes()
@ -256,11 +256,11 @@ abstract class SolrIndex extends SearchIndex
*/ */
protected function getNiceSuggestion($collation = '') protected function getNiceSuggestion($collation = '')
{ {
$collationParts = explode(' ', $collation); $collationParts = explode(' ', $collation ?? '');
// Remove advanced query params from the beginning of each collation part. // Remove advanced query params from the beginning of each collation part.
foreach ($collationParts as $key => &$part) { foreach ($collationParts as $key => &$part) {
$part = ltrim($part, '+'); $part = ltrim($part ?? '', '+');
} }
return implode(' ', $collationParts); return implode(' ', $collationParts);
@ -275,7 +275,7 @@ abstract class SolrIndex extends SearchIndex
*/ */
protected function getSuggestionQueryString($collation = '') protected function getSuggestionQueryString($collation = '')
{ {
return str_replace(' ', '+', $this->getNiceSuggestion($collation)); return str_replace(' ', '+', $this->getNiceSuggestion($collation) ?? '');
} }
/** /**
@ -312,7 +312,7 @@ abstract class SolrIndex extends SearchIndex
{ {
// Ensure that 'boost' is recorded here without being captured by solr // Ensure that 'boost' is recorded here without being captured by solr
$boost = null; $boost = null;
if (array_key_exists('boost', $extraOptions)) { if (array_key_exists('boost', $extraOptions ?? [])) {
$boost = $extraOptions['boost']; $boost = $extraOptions['boost'];
unset($extraOptions['boost']); unset($extraOptions['boost']);
} }
@ -515,7 +515,7 @@ abstract class SolrIndex extends SearchIndex
} }
// Check single origin // Check single origin
return $class === $base || is_subclass_of($class, $base); return $class === $base || is_subclass_of($class, $base ?? '');
} }
protected function _addField($doc, $object, $field) protected function _addField($doc, $object, $field)
@ -536,7 +536,7 @@ abstract class SolrIndex extends SearchIndex
if (!$sub) { if (!$sub) {
continue; continue;
} }
$sub = gmdate('Y-m-d\TH:i:s\Z', strtotime($sub)); $sub = gmdate('Y-m-d\TH:i:s\Z', strtotime($sub ?? ''));
} }
/* Solr requires numbers to be valid if presented, not just empty */ /* Solr requires numbers to be valid if presented, not just empty */
@ -552,7 +552,7 @@ abstract class SolrIndex extends SearchIndex
if (!$value) { if (!$value) {
return; return;
} }
$value = gmdate('Y-m-d\TH:i:s\Z', strtotime($value)); $value = gmdate('Y-m-d\TH:i:s\Z', strtotime($value ?? ''));
} }
/* Solr requires numbers to be valid if presented, not just empty */ /* Solr requires numbers to be valid if presented, not just empty */
@ -586,7 +586,7 @@ abstract class SolrIndex extends SearchIndex
// Add the user-specified fields // Add the user-specified fields
foreach ($this->getFieldsIterator() as $name => $field) { foreach ($this->getFieldsIterator() as $name => $field) {
if ($field['base'] === $base || (is_array($field['base']) && in_array($base, $field['base']))) { if ($field['base'] === $base || (is_array($field['base']) && in_array($base, $field['base'] ?? []))) {
$this->_addField($doc, $object, $field); $this->_addField($doc, $object, $field);
} }
} }
@ -607,7 +607,7 @@ abstract class SolrIndex extends SearchIndex
$docs = array(); $docs = array();
foreach ($this->getClasses() as $searchclass => $options) { foreach ($this->getClasses() as $searchclass => $options) {
if ($searchclass == $class || ($options['include_children'] && is_subclass_of($class, $searchclass))) { if ($searchclass == $class || ($options['include_children'] && is_subclass_of($class, $searchclass ?? ''))) {
$base = DataObject::getSchema()->baseDataClass($searchclass); $base = DataObject::getSchema()->baseDataClass($searchclass);
$docs[] = $this->_addAs($object, $base, $options); $docs[] = $this->_addAs($object, $base, $options);
} }
@ -619,7 +619,7 @@ abstract class SolrIndex extends SearchIndex
public function canAdd($class) public function canAdd($class)
{ {
foreach ($this->classes as $searchclass => $options) { foreach ($this->classes as $searchclass => $options) {
if ($searchclass == $class || ($options['include_children'] && is_subclass_of($class, $searchclass))) { if ($searchclass == $class || ($options['include_children'] && is_subclass_of($class, $searchclass ?? ''))) {
return true; return true;
} }
} }
@ -713,7 +713,7 @@ abstract class SolrIndex extends SearchIndex
// If using boosting, set the clean term separately for highlighting. // If using boosting, set the clean term separately for highlighting.
// See https://issues.apache.org/jira/browse/SOLR-2632 // See https://issues.apache.org/jira/browse/SOLR-2632
if (array_key_exists('hl', $params) && !array_key_exists('hl.q', $params)) { if (array_key_exists('hl', $params ?? []) && !array_key_exists('hl.q', $params ?? [])) {
$params['hl.q'] = implode(' ', $hlq); $params['hl.q'] = implode(' ', $hlq);
} }
@ -870,7 +870,7 @@ abstract class SolrIndex extends SearchIndex
*/ */
protected function applySearchVariants(SearchQuery $query) protected function applySearchVariants(SearchQuery $query)
{ {
$classes = count($query->classes) ? $query->classes : $this->getClasses(); $classes = count($query->classes ?? []) ? $query->classes : $this->getClasses();
/** @var SearchVariant_Caller $variantCaller */ /** @var SearchVariant_Caller $variantCaller */
$variantCaller = SearchVariant::withCommon($classes); $variantCaller = SearchVariant::withCommon($classes);
@ -886,7 +886,7 @@ abstract class SolrIndex extends SearchIndex
*/ */
public function sanitiseClassName($className, $replaceWith = '\\\\') public function sanitiseClassName($className, $replaceWith = '\\\\')
{ {
return str_replace('\\', $replaceWith, $className); return str_replace('\\', $replaceWith ?? '', $className ?? '');
} }
/** /**
@ -901,14 +901,14 @@ abstract class SolrIndex extends SearchIndex
$q = array(); $q = array();
foreach ($searchQuery->search as $search) { foreach ($searchQuery->search as $search) {
$text = $search['text']; $text = $search['text'];
preg_match_all('/"[^"]*"|\S+/', $text, $parts); preg_match_all('/"[^"]*"|\S+/', $text ?? '', $parts);
$fuzzy = $search['fuzzy'] ? '~' : ''; $fuzzy = $search['fuzzy'] ? '~' : '';
foreach ($parts[0] as $part) { foreach ($parts[0] as $part) {
$fields = (isset($search['fields'])) ? $search['fields'] : array(); $fields = (isset($search['fields'])) ? $search['fields'] : array();
if (isset($search['boost'])) { if (isset($search['boost'])) {
$fields = array_merge($fields, array_keys($search['boost'])); $fields = array_merge($fields, array_keys($search['boost'] ?? []));
} }
if ($fields) { if ($fields) {
$searchq = array(); $searchq = array();
@ -1014,7 +1014,7 @@ abstract class SolrIndex extends SearchIndex
*/ */
protected function getCriteriaComponent(SearchQuery $searchQuery) protected function getCriteriaComponent(SearchQuery $searchQuery)
{ {
if (count($searchQuery->getCriteria()) === 0) { if (count($searchQuery->getCriteria() ?? []) === 0) {
return null; return null;
} }
@ -1095,7 +1095,7 @@ abstract class SolrIndex extends SearchIndex
// Upload additional files // Upload additional files
foreach (glob($this->getExtrasPath() . '/*') as $file) { foreach (glob($this->getExtrasPath() . '/*') as $file) {
if (is_file($file)) { if (is_file($file ?? '')) {
$store->uploadFile($this->getIndexName(), $file); $store->uploadFile($this->getIndexName(), $file);
} }
} }

View File

@ -20,8 +20,8 @@ class SolrConfigStore_File implements SolrConfigStore
{ {
$targetDir = "{$this->local}/{$index}/conf"; $targetDir = "{$this->local}/{$index}/conf";
if (!is_dir($targetDir)) { if (!is_dir($targetDir ?? '')) {
$worked = @mkdir($targetDir, 0770, true); $worked = @mkdir($targetDir ?? '', 0770, true);
if (!$worked) { if (!$worked) {
throw new \RuntimeException( throw new \RuntimeException(
@ -36,7 +36,7 @@ class SolrConfigStore_File implements SolrConfigStore
public function uploadFile($index, $file) public function uploadFile($index, $file)
{ {
$targetDir = $this->getTargetDir($index); $targetDir = $this->getTargetDir($index);
copy($file, $targetDir . '/' . basename($file)); copy($file ?? '', $targetDir . '/' . basename($file ?? ''));
} }
public function uploadString($index, $filename, $string) public function uploadString($index, $filename, $string)

View File

@ -43,7 +43,7 @@ class SolrConfigStore_Post implements SolrConfigStore
*/ */
public function uploadFile($index, $file) public function uploadFile($index, $file)
{ {
$this->uploadString($index, basename($file), file_get_contents($file)); $this->uploadString($index, basename($file ?? ''), file_get_contents($file ?? ''));
} }
/** /**

View File

@ -46,7 +46,7 @@ class SolrConfigStore_WebDAV implements SolrConfigStore
public function uploadFile($index, $file) public function uploadFile($index, $file)
{ {
$targetDir = $this->getTargetDir($index); $targetDir = $this->getTargetDir($index);
WebDAV::upload_from_file($file, $targetDir . '/' . basename($file)); WebDAV::upload_from_file($file, $targetDir . '/' . basename($file ?? ''));
} }
public function uploadString($index, $filename, $string) public function uploadString($index, $filename, $string)

View File

@ -86,7 +86,7 @@ class Solr_Reindex extends Solr_BuildTask
continue; continue;
} }
//check the indexname matches the index passed to the request //check the indexname matches the index passed to the request
if (!strcasecmp(singleton($solrIndexClass)->getIndexName(), $index)) { if (!strcasecmp(singleton($solrIndexClass)->getIndexName() ?? '', $index ?? '')) {
//if we match, set the correct index name and move on //if we match, set the correct index name and move on
$index = $solrIndexClass; $index = $solrIndexClass;
break; break;
@ -104,7 +104,7 @@ class Solr_Reindex extends Solr_BuildTask
// Run grouped batches (id % groups = group) // Run grouped batches (id % groups = group)
$group = $request->getVar('group'); $group = $request->getVar('group');
$indexInstance = singleton($index); $indexInstance = singleton($index);
$state = json_decode($request->getVar('variantstate'), true); $state = json_decode($request->getVar('variantstate') ?? '', true);
$handler->runGroup($this->getLogger(), $indexInstance, $state, $class, $groups, $group); $handler->runGroup($this->getLogger(), $indexInstance, $state, $class, $groups, $group);
return; return;

View File

@ -20,7 +20,7 @@ class SolrSearchQueryWriterBasic extends AbstractSearchQueryWriter
return sprintf( return sprintf(
'%s(%s%s%s)', '%s(%s%s%s)',
$this->getComparisonPolarity($searchCriterion->getComparison()), $this->getComparisonPolarity($searchCriterion->getComparison()),
addslashes($searchCriterion->getTarget()), addslashes($searchCriterion->getTarget() ?? ''),
$this->getComparisonConjunction(), $this->getComparisonConjunction(),
$searchCriterion->getQuoteValue($searchCriterion->getValue()) $searchCriterion->getQuoteValue($searchCriterion->getValue())
); );

View File

@ -62,7 +62,7 @@ class SolrSearchQueryWriterIn extends AbstractSearchQueryWriter
$conditions[] = sprintf( $conditions[] = sprintf(
'%s%s%s', '%s%s%s',
addslashes($searchCriterion->getTarget()), addslashes($searchCriterion->getTarget() ?? ''),
$this->getComparisonConjunction(), $this->getComparisonConjunction(),
$value $value
); );

View File

@ -21,7 +21,7 @@ class SolrSearchQueryWriterRange extends AbstractSearchQueryWriter
return sprintf( return sprintf(
'%s(%s:%s%s%s%s%s)', '%s(%s:%s%s%s%s%s)',
$this->getComparisonPolarity($searchCriterion->getComparison()), $this->getComparisonPolarity($searchCriterion->getComparison()),
addslashes($searchCriterion->getTarget()), addslashes($searchCriterion->getTarget() ?? ''),
$this->getOpenComparisonContainer($searchCriterion->getComparison()), $this->getOpenComparisonContainer($searchCriterion->getComparison()),
$this->getLeftComparison($searchCriterion), $this->getLeftComparison($searchCriterion),
$this->getComparisonConjunction(), $this->getComparisonConjunction(),

View File

@ -18,20 +18,21 @@ class CombinationsArrayIterator implements Iterator
$this->arrays = array(); $this->arrays = array();
$this->keys = array(); $this->keys = array();
$keys = array_keys($args); $keys = array_keys($args ?? []);
$values = array_values($args); $values = array_values($args ?? []);
foreach ($values as $i => $arg) { foreach ($values as $i => $arg) {
if (is_array($arg) && count($arg)) { if (is_array($arg) && count($arg ?? [])) {
$this->arrays[] = $arg; $this->arrays[] = $arg;
$this->keys[] = $keys[$i]; $this->keys[] = $keys[$i];
} }
} }
$this->numArrays = count($this->arrays); $this->numArrays = count($this->arrays ?? []);
$this->rewind(); $this->rewind();
} }
#[\ReturnTypeWillChange]
public function rewind() public function rewind()
{ {
if (!$this->numArrays) { if (!$this->numArrays) {
@ -46,11 +47,13 @@ class CombinationsArrayIterator implements Iterator
} }
} }
#[\ReturnTypeWillChange]
public function valid() public function valid()
{ {
return $this->isValid; return $this->isValid;
} }
#[\ReturnTypeWillChange]
public function next() public function next()
{ {
$this->k++; $this->k++;
@ -68,15 +71,17 @@ class CombinationsArrayIterator implements Iterator
} }
} }
#[\ReturnTypeWillChange]
public function current() public function current()
{ {
$res = array(); $res = array();
for ($i = 0; $i < $this->numArrays; $i++) { for ($i = 0; $i < $this->numArrays; $i++) {
$res[$this->keys[$i]] = current($this->arrays[$i]); $res[$this->keys[$i]] = current($this->arrays[$i] ?? []);
} }
return $res; return $res;
} }
#[\ReturnTypeWillChange]
public function key() public function key()
{ {
return $this->k; return $this->k;

View File

@ -90,7 +90,7 @@ class MonologFactory implements SearchLogFactory
{ {
return Injector::inst()->createWithArgs( return Injector::inst()->createWithArgs(
Logger::class, Logger::class,
array(strtolower($name)) array(strtolower($name ?? ''))
); );
} }

View File

@ -14,7 +14,7 @@ class MultipleArrayIterator implements Iterator
$this->arrays = array(); $this->arrays = array();
foreach ($args as $arg) { foreach ($args as $arg) {
if (is_array($arg) && count($arg)) { if (is_array($arg) && count($arg ?? [])) {
$this->arrays[] = $arg; $this->arrays[] = $arg;
} }
} }
@ -22,6 +22,7 @@ class MultipleArrayIterator implements Iterator
$this->rewind(); $this->rewind();
} }
#[\ReturnTypeWillChange]
public function rewind() public function rewind()
{ {
$this->active = $this->arrays; $this->active = $this->arrays;
@ -30,16 +31,19 @@ class MultipleArrayIterator implements Iterator
} }
} }
#[\ReturnTypeWillChange]
public function current() public function current()
{ {
return $this->active ? current($this->active[0]) : false; return $this->active ? current($this->active[0]) : false;
} }
#[\ReturnTypeWillChange]
public function key() public function key()
{ {
return $this->active ? key($this->active[0]) : false; return $this->active ? key($this->active[0]) : false;
} }
#[\ReturnTypeWillChange]
public function next() public function next()
{ {
if (!$this->active) { if (!$this->active) {
@ -54,8 +58,9 @@ class MultipleArrayIterator implements Iterator
} }
} }
#[\ReturnTypeWillChange]
public function valid() public function valid()
{ {
return $this->active && (current($this->active[0]) !== false); return $this->active && (current($this->active[0] ?? []) !== false);
} }
} }

View File

@ -17,7 +17,7 @@ class WebDAV
public static function exists($url) public static function exists($url)
{ {
// WebDAV expects that checking a directory exists has a trailing slash // WebDAV expects that checking a directory exists has a trailing slash
if (substr($url, -1) != '/') { if (substr($url ?? '', -1) != '/') {
$url .= '/'; $url .= '/';
} }
@ -42,7 +42,7 @@ class WebDAV
public static function mkdir($url) public static function mkdir($url)
{ {
$ch = self::curl_init(rtrim($url, '/') . '/', 'MKCOL'); $ch = self::curl_init(rtrim($url ?? '', '/') . '/', 'MKCOL');
curl_exec($ch); curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
@ -72,13 +72,13 @@ class WebDAV
public static function upload_from_string($string, $url) public static function upload_from_string($string, $url)
{ {
$fh = tmpfile(); $fh = tmpfile();
fwrite($fh, $string); fwrite($fh, $string ?? '');
fseek($fh, 0); fseek($fh, 0);
return self::put($fh, $url); return self::put($fh, $url);
} }
public static function upload_from_file($string, $url) public static function upload_from_file($string, $url)
{ {
return self::put(fopen($string, 'rb'), $url); return self::put(fopen($string ?? '', 'rb'), $url);
} }
} }

View File

@ -133,28 +133,28 @@ class BatchedProcessorTest extends SapphireTest
$this->assertEquals(9, $data->totalSteps); $this->assertEquals(9, $data->totalSteps);
$this->assertEquals(0, $data->currentStep); $this->assertEquals(0, $data->currentStep);
$this->assertEmpty($data->isComplete); $this->assertEmpty($data->isComplete);
$this->assertEquals(0, count($index->getAdded())); $this->assertEquals(0, count($index->getAdded() ?? []));
// Advance state // Advance state
for ($pass = 1; $pass <= 8; $pass++) { for ($pass = 1; $pass <= 8; $pass++) {
$processor->process(); $processor->process();
$data = $processor->getJobData(); $data = $processor->getJobData();
$this->assertEquals($pass, $data->currentStep); $this->assertEquals($pass, $data->currentStep);
$this->assertEquals($pass * 5, count($index->getAdded())); $this->assertEquals($pass * 5, count($index->getAdded() ?? []));
} }
// Last run should have two hanging items // Last run should have two hanging items
$processor->process(); $processor->process();
$data = $processor->getJobData(); $data = $processor->getJobData();
$this->assertEquals(9, $data->currentStep); $this->assertEquals(9, $data->currentStep);
$this->assertEquals(42, count($index->getAdded())); $this->assertEquals(42, count($index->getAdded() ?? []));
$this->assertTrue($data->isComplete); $this->assertTrue($data->isComplete);
// Check any additional queued jobs // Check any additional queued jobs
$processor->afterComplete(); $processor->afterComplete();
$service = singleton(QueuedJobService::class); $service = singleton(QueuedJobService::class);
$jobs = $service->getJobs(); $jobs = $service->getJobs();
$this->assertEquals(1, count($jobs)); $this->assertEquals(1, count($jobs ?? []));
$this->assertInstanceOf(SearchUpdateCommitJobProcessor::class, $jobs[0]['job']); $this->assertInstanceOf(SearchUpdateCommitJobProcessor::class, $jobs[0]['job']);
} }
@ -242,7 +242,7 @@ class BatchedProcessorTest extends SapphireTest
} }
$data = $processor->getJobData(); $data = $processor->getJobData();
$this->assertEquals(8, $data->currentStep); $this->assertEquals(8, $data->currentStep);
$this->assertEquals(42, count($index->getAdded())); $this->assertEquals(42, count($index->getAdded() ?? []));
$this->assertTrue($data->isComplete); $this->assertTrue($data->isComplete);
} }
} }

View File

@ -223,7 +223,7 @@ class SolrIndexSubsitesTest extends SapphireTest
$subsiteIDs = ['0'] + $this->allFixtureIDs(Subsite::class); $subsiteIDs = ['0'] + $this->allFixtureIDs(Subsite::class);
$subsiteIDs = array_map(function ($v) { $subsiteIDs = array_map(function ($v) {
return (string) $v; return (string) $v;
}, $subsiteIDs); }, $subsiteIDs ?? []);
$mockWrites = [ $mockWrites = [
'35910:File:a:0:{}' => [ '35910:File:a:0:{}' => [
'base' => File::class, 'base' => File::class,
@ -253,7 +253,7 @@ class SolrIndexSubsitesTest extends SapphireTest
$tmpMockWrites = $mockWrites; $tmpMockWrites = $mockWrites;
$variant->extractManipulationWriteState($tmpMockWrites); $variant->extractManipulationWriteState($tmpMockWrites);
foreach ($tmpMockWrites as $mockWrite) { foreach ($tmpMockWrites as $mockWrite) {
$this->assertCount(count($subsiteIDs), $mockWrite['statefulids']); $this->assertCount(count($subsiteIDs ?? []), $mockWrite['statefulids']);
foreach ($mockWrite['statefulids'] as $statefulIDs) { foreach ($mockWrite['statefulids'] as $statefulIDs) {
$this->assertContains( $this->assertContains(
(string) $statefulIDs['state'][SearchVariantSubsites::class], (string) $statefulIDs['state'][SearchVariantSubsites::class],

View File

@ -478,7 +478,7 @@ class SolrIndexTest extends SapphireTest
SolrIndexTest_MyDataObjectOne::class . $objOneA->ID, SolrIndexTest_MyDataObjectOne::class . $objOneA->ID,
SolrIndexTest_MyDataObjectTwo::class . $objTwoA->ID SolrIndexTest_MyDataObjectTwo::class . $objTwoA->ID
]; ];
return in_array($this->createSolrDocKey($doc), $validKeys); return in_array($this->createSolrDocKey($doc), $validKeys ?? []);
}; };
$serviceMock $serviceMock
@ -504,7 +504,7 @@ class SolrIndexTest extends SapphireTest
->method('deleteById') ->method('deleteById')
->withConsecutive( ->withConsecutive(
[$this->callback(function (string $docID) use ($pageA): bool { [$this->callback(function (string $docID) use ($pageA): bool {
return strpos($docID, $pageA->ID . '-' . SiteTree::class) !== false; return strpos($docID ?? '', $pageA->ID . '-' . SiteTree::class) !== false;
})] })]
); );
@ -578,7 +578,7 @@ class SolrIndexTest extends SapphireTest
File::class . $fileA->ID, File::class . $fileA->ID,
SolrIndexTest_MyDataObjectOne::class . $objOneA->ID SolrIndexTest_MyDataObjectOne::class . $objOneA->ID
]; ];
return in_array($this->createSolrDocKey($doc), $validKeys); return in_array($this->createSolrDocKey($doc), $validKeys ?? []);
}; };
$serviceMock $serviceMock
@ -602,7 +602,7 @@ class SolrIndexTest extends SapphireTest
->method('deleteById') ->method('deleteById')
->withConsecutive( ->withConsecutive(
[$this->callback(function (string $docID) use ($pageA): bool { [$this->callback(function (string $docID) use ($pageA): bool {
return strpos($docID, $pageA->ID . '-' . SiteTree::class) !== false; return strpos($docID ?? '', $pageA->ID . '-' . SiteTree::class) !== false;
})] })]
); );

View File

@ -233,9 +233,9 @@ class SolrReindexQueuedTest extends SapphireTest
// Check IDs // Check IDs
$idMessage = $logger->filterMessages('Updated '); $idMessage = $logger->filterMessages('Updated ');
$this->assertNotEmpty(preg_match('/^Updated (?<ids>[,\d]+)/i', $idMessage[0], $matches)); $this->assertNotEmpty(preg_match('/^Updated (?<ids>[,\d]+)/i', $idMessage[0] ?? '', $matches));
$ids = array_unique(explode(',', $matches['ids'])); $ids = array_unique(explode(',', $matches['ids'] ?? ''));
$this->assertEquals(6, count($ids)); $this->assertEquals(6, count($ids ?? []));
foreach ($ids as $id) { foreach ($ids as $id) {
// Each id should be % 3 == 0 // Each id should be % 3 == 0
$this->assertEquals(0, $id % 3, "ID $id Should match pattern ID % 3 = 0"); $this->assertEquals(0, $id % 3, "ID $id Should match pattern ID % 3 = 0");

View File

@ -250,8 +250,8 @@ class SolrReindexTest extends SapphireTest
$state = array(SolrReindexTest_Variant::class => '1'); $state = array(SolrReindexTest_Variant::class => '1');
$this->getHandler()->runGroup($logger, $this->index, $state, SolrReindexTest_Item::class, 6, 2); $this->getHandler()->runGroup($logger, $this->index, $state, SolrReindexTest_Item::class, 6, 2);
$idMessage = $logger->filterMessages('Updated '); $idMessage = $logger->filterMessages('Updated ');
$this->assertNotEmpty(preg_match('/^Updated (?<ids>[,\d]+)/i', $idMessage[0], $matches)); $this->assertNotEmpty(preg_match('/^Updated (?<ids>[,\d]+)/i', $idMessage[0] ?? '', $matches));
$ids = array_unique(explode(',', $matches['ids'])); $ids = array_unique(explode(',', $matches['ids'] ?? ''));
// Test successful // Test successful
$this->assertNotEmpty($logger->getMessages('Adding ' . SolrReindexTest_Item::class)); $this->assertNotEmpty($logger->getMessages('Adding ' . SolrReindexTest_Item::class));
@ -259,7 +259,7 @@ class SolrReindexTest extends SapphireTest
// Test that items in this variant / group are re-indexed // Test that items in this variant / group are re-indexed
// 120 divided into 6 groups should be 20 at least (max 21) // 120 divided into 6 groups should be 20 at least (max 21)
$c = count($ids); $c = count($ids ?? []);
$this->assertTrue($c === 20 || $c === 21, 'Group size is about 20'); $this->assertTrue($c === 20 || $c === 21, 'Group size is about 20');
foreach ($ids as $id) { foreach ($ids as $id) {
// Each id should be % 6 == 2 // Each id should be % 6 == 2
@ -301,12 +301,12 @@ class SolrReindexTest extends SapphireTest
// Count all ids updated // Count all ids updated
$ids = array(); $ids = array();
foreach ($logger->filterMessages('Updated ') as $message) { foreach ($logger->filterMessages('Updated ') as $message) {
$this->assertNotEmpty(preg_match('/^Updated (?<ids>[,\d]+)/', $message, $matches)); $this->assertNotEmpty(preg_match('/^Updated (?<ids>[,\d]+)/', $message ?? '', $matches));
$ids = array_unique(array_merge($ids, explode(',', $matches['ids']))); $ids = array_unique(array_merge($ids, explode(',', $matches['ids'] ?? '')));
} }
// Check ids // Check ids
$this->assertEquals(120, count($ids)); $this->assertEquals(120, count($ids ?? []));
} }
/** /**
@ -385,7 +385,7 @@ class SolrReindexTest extends SapphireTest
SolrIndexTest_MyDataObjectOne::class . $objOneA->ID, SolrIndexTest_MyDataObjectOne::class . $objOneA->ID,
SolrIndexTest_MyDataObjectTwo::class . $objTwoA->ID SolrIndexTest_MyDataObjectTwo::class . $objTwoA->ID
]; ];
return in_array($this->createSolrDocKey($doc), $validKeys); return in_array($this->createSolrDocKey($doc), $validKeys ?? []);
}; };
$serviceMock $serviceMock
@ -470,7 +470,7 @@ class SolrReindexTest extends SapphireTest
SolrIndexTest_MyDataObjectOne::class . $objOneA->ID, SolrIndexTest_MyDataObjectOne::class . $objOneA->ID,
]; ];
$solrDocKey = $this->createSolrDocKey($doc); $solrDocKey = $this->createSolrDocKey($doc);
return in_array($this->createSolrDocKey($doc), $validKeys); return in_array($this->createSolrDocKey($doc), $validKeys ?? []);
}; };
$serviceMock $serviceMock

View File

@ -49,9 +49,9 @@ class SolrReindexTest_RecordingLogger extends Logger implements TestOnly
public function filterMessages($containing) public function filterMessages($containing)
{ {
return array_values(array_filter( return array_values(array_filter(
$this->getMessages(), $this->getMessages() ?? [],
function ($content) use ($containing) { function ($content) use ($containing) {
return stripos($content, $containing) !== false; return stripos($content ?? '', $containing ?? '') !== false;
} }
)); ));
} }
@ -69,6 +69,6 @@ class SolrReindexTest_RecordingLogger extends Logger implements TestOnly
} else { } else {
$messages = $this->getMessages(); $messages = $this->getMessages();
} }
return count($messages); return count($messages ?? []);
} }
} }

View File

@ -185,7 +185,7 @@ class SolrWritersTest extends SapphireTest
$index = new SolrIndexTest_FakeIndex(); $index = new SolrIndexTest_FakeIndex();
$this->assertTrue(in_array($expected, $index->getFiltersComponent($query))); $this->assertTrue(in_array($expected, $index->getFiltersComponent($query) ?? []));
} }
/** /**
@ -235,6 +235,6 @@ class SolrWritersTest extends SapphireTest
$index = new SolrIndexTest_FakeIndex(); $index = new SolrIndexTest_FakeIndex();
$this->assertTrue(in_array($expected, $index->getFiltersComponent($query))); $this->assertTrue(in_array($expected, $index->getFiltersComponent($query) ?? []));
} }
} }