diff --git a/core/modules/migrate/src/Controller/MigrateMessageController.php b/core/modules/migrate/src/Controller/MigrateMessageController.php index 385b89f343b8cfa8ee8f94c15a8c8a68480b18e3..a7e4ac29f9f81d3618b4c51e027639fb10e4cc59 100644 --- a/core/modules/migrate/src/Controller/MigrateMessageController.php +++ b/core/modules/migrate/src/Controller/MigrateMessageController.php @@ -6,6 +6,7 @@ use Drupal\Core\Database\Connection; use Drupal\Core\Database\DatabaseConnectionRefusedException; use Drupal\Core\Database\DatabaseNotFoundException; +use Drupal\Core\Database\Query\SelectInterface; use Drupal\Core\Form\FormBuilderInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\Core\Url; @@ -189,10 +190,7 @@ public function details(string $migration_id, Request $request): array { $query->leftJoin($map_table, 'map', 'msg.source_ids_hash = map.source_ids_hash'); $query->fields('msg'); $query->fields('map'); - $filter = $this->buildFilterQuery($request); - if (!empty($filter['where'])) { - $query->where($filter['where'], $filter['args']); - } + $this->addFilterToQuery($request, $query); $result = $query ->limit(50) ->orderByHeader($header) @@ -238,54 +236,45 @@ public function details(string $migration_id, Request $request): array { } /** - * Builds a query for migrate message administration. + * Adds a filter to the query for migrate message administration. + * + * This method retrieves the session-based filters from the request and + * applies them to the provided query object. If no filters are present, the + * query is left unchanged. * * @param \Symfony\Component\HttpFoundation\Request $request * The request. - * - * @return array|null - * An associative array with keys 'where' and 'args' or NULL if there were - * no filters set. + * @param \Drupal\Core\Database\Query\SelectInterface $query + * The database query. */ - protected function buildFilterQuery(Request $request): ?array { + protected function addFilterToQuery(Request $request, SelectInterface $query): void { $session_filters = $request->getSession()->get('migration_messages_overview_filter', []); if (empty($session_filters)) { - return NULL; + return; } - // Build query. - $where = $args = []; + // Build the condition. foreach ($session_filters as $filter) { - $filter_where = []; - + if (empty($filter['value'])) { + continue; + } switch ($filter['type']) { case 'array': - foreach ($filter['value'] as $value) { - $filter_where[] = $filter['where']; - $args[] = $value; + $values = array_values($filter['value']); + if ($filter['field'] === 'msg.level') { + $values = array_map(fn($x) => (int) $x, $values); } + $query->condition($filter['field'], $values, 'IN'); break; case 'string': - $filter_where[] = $filter['where']; - $args[] = '%' . $filter['value'] . '%'; + $query->condition($filter['field'], "%{$filter['value']}%", 'LIKE'); break; default: - $filter_where[] = $filter['where']; - $args[] = $filter['value']; - } - - if (!empty($filter_where)) { - $where[] = '(' . implode(' OR ', $filter_where) . ')'; + $query->condition($filter['field'], $filter['value']); } } - $where = !empty($where) ? implode(' AND ', $where) : ''; - - return [ - 'where' => $where, - 'args' => $args, - ]; } /** diff --git a/core/modules/migrate/src/Form/MessageForm.php b/core/modules/migrate/src/Form/MessageForm.php index 75522351418d19d88dd99ee46811dabb9ade4c72..78e62b2ce4615f8d3cc0f2f6f679ac3586dbf339 100644 --- a/core/modules/migrate/src/Form/MessageForm.php +++ b/core/modules/migrate/src/Form/MessageForm.php @@ -82,19 +82,19 @@ public function buildForm(array $form, FormStateInterface $form_state) { public function submitForm(array &$form, FormStateInterface $form_state) { $filters['message'] = [ 'title' => $this->t('message'), - 'where' => 'msg.message LIKE ?', + 'field' => 'msg.message', 'type' => 'string', ]; $filters['severity'] = [ 'title' => $this->t('Severity'), - 'where' => 'msg.level = ?', + 'field' => 'msg.level', 'type' => 'array', ]; $session_filters = $this->getRequest()->getSession()->get('migration_messages_overview_filter', []); foreach ($filters as $name => $filter) { if ($form_state->hasValue($name)) { $session_filters[$name] = [ - 'where' => $filter['where'], + 'field' => $filter['field'], 'value' => $form_state->getValue($name), 'type' => $filter['type'], ];