From 7a84d59e13202d50cf5bfe7b3c60df0cdace42a9 Mon Sep 17 00:00:00 2001 From: stonebuzz Date: Wed, 24 Apr 2024 16:29:29 +0200 Subject: [PATCH 1/2] Optimize(Search): Handle LEFT JOIN which concern counting operations lastly --- src/Search/Provider/SQLProvider.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Search/Provider/SQLProvider.php b/src/Search/Provider/SQLProvider.php index 1e18d0f8c50..f8fe7dca804 100644 --- a/src/Search/Provider/SQLProvider.php +++ b/src/Search/Provider/SQLProvider.php @@ -3669,6 +3669,18 @@ public static function constructSQL(array &$data) $COMMONLEFTJOIN = \Search::addDefaultJoin($data['itemtype'], $itemtable, $already_link_tables); $FROM .= $COMMONLEFTJOIN; + // need to reorder $data['tocompute'] that contains searchoption ID + // to be sure that all LEFT JOIN related to count operation (saerchoption datatype = count)) + // are done after all other LEFT JOIN + $ordered_data_to_compute = $data['tocompute']; + foreach ($data['tocompute'] as $key => $val) { + if (isset($searchopt[$val]["datatype"]) && $searchopt[$val]["datatype"] == 'count') { + unset($ordered_data_to_compute[$key]); //remove key + array_push($ordered_data_to_compute, $val); //add it at end + } + } + $data['tocompute'] = $ordered_data_to_compute; + // Add all table for toview items foreach ($data['tocompute'] as $val) { if (!in_array($searchopt[$val]["table"], $blacklist_tables)) { From 695d7215d27d4b93edcfc0286803112847f9a63a Mon Sep 17 00:00:00 2001 From: Stanislas Date: Mon, 13 May 2024 08:40:47 +0200 Subject: [PATCH 2/2] fix typo Co-authored-by: Johan Cwiklinski --- src/Search/Provider/SQLProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Search/Provider/SQLProvider.php b/src/Search/Provider/SQLProvider.php index f8fe7dca804..e4f84269411 100644 --- a/src/Search/Provider/SQLProvider.php +++ b/src/Search/Provider/SQLProvider.php @@ -3670,7 +3670,7 @@ public static function constructSQL(array &$data) $FROM .= $COMMONLEFTJOIN; // need to reorder $data['tocompute'] that contains searchoption ID - // to be sure that all LEFT JOIN related to count operation (saerchoption datatype = count)) + // to be sure that all LEFT JOIN related to count operation (searchoption datatype = count)) // are done after all other LEFT JOIN $ordered_data_to_compute = $data['tocompute']; foreach ($data['tocompute'] as $key => $val) {