From 2ecb2404d812405c06cf3adf5c62a791bb1f6f51 Mon Sep 17 00:00:00 2001 From: David Bekker <david.bekker@finalist.nl> Date: Tue, 4 Mar 2025 16:30:44 +0100 Subject: [PATCH 1/6] Converted the migrate message controller to using a condition object --- .../Controller/MigrateMessageController.php | 69 +++++++++++-------- core/modules/migrate/src/Form/MessageForm.php | 6 +- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/core/modules/migrate/src/Controller/MigrateMessageController.php b/core/modules/migrate/src/Controller/MigrateMessageController.php index 385b89f343b8..8a6fecf20366 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) @@ -240,52 +238,65 @@ public function details(string $migration_id, Request $request): array { /** * Builds a 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. + $condition_and = $query->getConnection()->condition('AND'); + $condition_and_used = FALSE; foreach ($session_filters as $filter) { - $filter_where = []; - + $condition_or = $query->getConnection()->condition('OR'); + $condition_or_used = FALSE; switch ($filter['type']) { case 'array': + $values = []; foreach ($filter['value'] as $value) { - $filter_where[] = $filter['where']; - $args[] = $value; + if ($filter['field'] == 'msg.level') { + $values[] = (int) $value; + } + else { + $values[] = $value; + } + } + if (!empty($values)) { + $condition_or->condition($filter['field'], $values, 'IN'); + $condition_or_used = TRUE; } break; case 'string': - $filter_where[] = $filter['where']; - $args[] = '%' . $filter['value'] . '%'; + if (!empty($filter['value'])) { + $condition_or->condition($filter['field'], '%' . $filter['value'] . '%'); + $condition_or_used = TRUE; + } break; default: - $filter_where[] = $filter['where']; - $args[] = $filter['value']; + if (!empty($filter['value'])) { + $condition_or->condition($filter['field'], $filter['value']); + $condition_or_used = TRUE; + } } - - if (!empty($filter_where)) { - $where[] = '(' . implode(' OR ', $filter_where) . ')'; + if ($condition_or_used) { + $condition_and->condition($condition_or); + $condition_and_used = TRUE; } } - $where = !empty($where) ? implode(' AND ', $where) : ''; - - return [ - 'where' => $where, - 'args' => $args, - ]; + if ($condition_and_used) { + $query->condition($condition_and); + } } /** diff --git a/core/modules/migrate/src/Form/MessageForm.php b/core/modules/migrate/src/Form/MessageForm.php index 75522351418d..78e62b2ce461 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'], ]; -- GitLab From 5c6de90ee2267596695bbfcd152d8b9584c008c5 Mon Sep 17 00:00:00 2001 From: David Bekker <david.bekker@finalist.nl> Date: Tue, 4 Mar 2025 17:23:09 +0100 Subject: [PATCH 2/6] Updated StandardPerformanceTest --- .../src/FunctionalJavascript/StandardPerformanceTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php b/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php index d212ed46ae92..c43fa6f9f7e2 100644 --- a/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php +++ b/core/profiles/standard/tests/src/FunctionalJavascript/StandardPerformanceTest.php @@ -142,8 +142,8 @@ protected function testAnonymous(): void { ], 'CacheSetCount' => 45, 'CacheDeleteCount' => 0, - 'CacheTagChecksumCount' => 37, - 'CacheTagIsValidCount' => 42, + 'CacheTagChecksumCount' => 38, + 'CacheTagIsValidCount' => 43, 'CacheTagInvalidationCount' => 0, 'CacheTagLookupQueryCount' => 21, 'CacheTagGroupedLookups' => [ -- GitLab From 30bda86e2715ffc539e59a3e1c6b4a10760cd4fd Mon Sep 17 00:00:00 2001 From: David Bekker <david.bekker@finalist.nl> Date: Thu, 6 Mar 2025 15:33:56 +0100 Subject: [PATCH 3/6] Addressed the remarks from @benjifisher --- .../Controller/MigrateMessageController.php | 42 +++++++------------ 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/core/modules/migrate/src/Controller/MigrateMessageController.php b/core/modules/migrate/src/Controller/MigrateMessageController.php index 8a6fecf20366..c01a986037f0 100644 --- a/core/modules/migrate/src/Controller/MigrateMessageController.php +++ b/core/modules/migrate/src/Controller/MigrateMessageController.php @@ -236,7 +236,7 @@ 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 @@ -254,47 +254,35 @@ protected function addFilterToQuery(Request $request, SelectInterface &$query): } // Build the condition. - $condition_and = $query->getConnection()->condition('AND'); - $condition_and_used = FALSE; + $condition_and = $query->andConditionGroup(); foreach ($session_filters as $filter) { - $condition_or = $query->getConnection()->condition('OR'); - $condition_or_used = FALSE; + if (!empty($filter['value'])) { + continue; + } + $condition_or = $query->orConditionGroup(); switch ($filter['type']) { case 'array': - $values = []; - foreach ($filter['value'] as $value) { - if ($filter['field'] == 'msg.level') { - $values[] = (int) $value; - } - else { - $values[] = $value; - } + if ($filter['field'] == 'msg.level') { + $values = array_map(fn($x) => (int) $x, array_values($filter['value'])); } - if (!empty($values)) { - $condition_or->condition($filter['field'], $values, 'IN'); - $condition_or_used = TRUE; + else { + $values = array_values($filter['value']); } + $condition_or->condition($filter['field'], $values, 'IN'); break; case 'string': - if (!empty($filter['value'])) { - $condition_or->condition($filter['field'], '%' . $filter['value'] . '%'); - $condition_or_used = TRUE; - } + $condition_or->condition($filter['field'], '%' . $filter['value'] . '%', 'LIKE'); break; default: - if (!empty($filter['value'])) { - $condition_or->condition($filter['field'], $filter['value']); - $condition_or_used = TRUE; - } + $condition_or->condition($filter['field'], $filter['value']); } - if ($condition_or_used) { + if ($condition_or->count() > 0) { $condition_and->condition($condition_or); - $condition_and_used = TRUE; } } - if ($condition_and_used) { + if ($condition_and->count() > 0) { $query->condition($condition_and); } } -- GitLab From 7b7569fd26a34e0a3847cc8370e8c823b96c6789 Mon Sep 17 00:00:00 2001 From: David Bekker <david.bekker@finalist.nl> Date: Fri, 7 Mar 2025 09:48:10 +0100 Subject: [PATCH 4/6] Solved a number of remarks --- .../src/Controller/MigrateMessageController.php | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/core/modules/migrate/src/Controller/MigrateMessageController.php b/core/modules/migrate/src/Controller/MigrateMessageController.php index c01a986037f0..c41931f3cdc6 100644 --- a/core/modules/migrate/src/Controller/MigrateMessageController.php +++ b/core/modules/migrate/src/Controller/MigrateMessageController.php @@ -254,15 +254,14 @@ protected function addFilterToQuery(Request $request, SelectInterface &$query): } // Build the condition. - $condition_and = $query->andConditionGroup(); + $condition_or = $query->orConditionGroup(); foreach ($session_filters as $filter) { - if (!empty($filter['value'])) { + if (empty($filter['value'])) { continue; } - $condition_or = $query->orConditionGroup(); switch ($filter['type']) { case 'array': - if ($filter['field'] == 'msg.level') { + if ($filter['field'] === 'msg.level') { $values = array_map(fn($x) => (int) $x, array_values($filter['value'])); } else { @@ -278,12 +277,9 @@ protected function addFilterToQuery(Request $request, SelectInterface &$query): default: $condition_or->condition($filter['field'], $filter['value']); } - if ($condition_or->count() > 0) { - $condition_and->condition($condition_or); - } } - if ($condition_and->count() > 0) { - $query->condition($condition_and); + if ($condition_or->count() > 0) { + $query->condition($condition_or); } } -- GitLab From b19169836e3ef000691f8b81a9407a48cd32c264 Mon Sep 17 00:00:00 2001 From: David Bekker <david.bekker@finalist.nl> Date: Mon, 10 Mar 2025 09:23:58 +0100 Subject: [PATCH 5/6] Changed the query parameter to be on by reference --- .../modules/migrate/src/Controller/MigrateMessageController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/modules/migrate/src/Controller/MigrateMessageController.php b/core/modules/migrate/src/Controller/MigrateMessageController.php index c41931f3cdc6..91fab3715a5e 100644 --- a/core/modules/migrate/src/Controller/MigrateMessageController.php +++ b/core/modules/migrate/src/Controller/MigrateMessageController.php @@ -247,7 +247,7 @@ public function details(string $migration_id, Request $request): array { * @param \Drupal\Core\Database\Query\SelectInterface $query * The database query. */ - protected function addFilterToQuery(Request $request, SelectInterface &$query): void { + protected function addFilterToQuery(Request $request, SelectInterface $query): void { $session_filters = $request->getSession()->get('migration_messages_overview_filter', []); if (empty($session_filters)) { return; -- GitLab From 21870f36d60628636a7e2d4bf658d38d782f6c44 Mon Sep 17 00:00:00 2001 From: David Bekker <david.bekker@finalist.nl> Date: Fri, 21 Mar 2025 08:29:09 +0100 Subject: [PATCH 6/6] Fixed the remarks from Benji Fisher --- .../src/Controller/MigrateMessageController.php | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/core/modules/migrate/src/Controller/MigrateMessageController.php b/core/modules/migrate/src/Controller/MigrateMessageController.php index 91fab3715a5e..a7e4ac29f9f8 100644 --- a/core/modules/migrate/src/Controller/MigrateMessageController.php +++ b/core/modules/migrate/src/Controller/MigrateMessageController.php @@ -254,33 +254,27 @@ protected function addFilterToQuery(Request $request, SelectInterface $query): v } // Build the condition. - $condition_or = $query->orConditionGroup(); foreach ($session_filters as $filter) { if (empty($filter['value'])) { continue; } switch ($filter['type']) { case 'array': + $values = array_values($filter['value']); if ($filter['field'] === 'msg.level') { - $values = array_map(fn($x) => (int) $x, array_values($filter['value'])); + $values = array_map(fn($x) => (int) $x, $values); } - else { - $values = array_values($filter['value']); - } - $condition_or->condition($filter['field'], $values, 'IN'); + $query->condition($filter['field'], $values, 'IN'); break; case 'string': - $condition_or->condition($filter['field'], '%' . $filter['value'] . '%', 'LIKE'); + $query->condition($filter['field'], "%{$filter['value']}%", 'LIKE'); break; default: - $condition_or->condition($filter['field'], $filter['value']); + $query->condition($filter['field'], $filter['value']); } } - if ($condition_or->count() > 0) { - $query->condition($condition_or); - } } /** -- GitLab