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