chore: update code structure for better readability and maintainability

This commit is contained in:
2026-02-04 22:13:19 +01:00
parent 4276708e1c
commit 4ebf0766c6
6 changed files with 7006 additions and 20 deletions

View File

@@ -681,11 +681,11 @@ abstract class As4SearchEngine
}
$subQueryForRange = '';
if (AdvancedSearchCoreClass::_isFilledArray($where_translatable_value_range)) {
// Optymalizacja: usunięto zbędny JOIN do aclink (nie jest używany w podzapytaniu)
$subQueryForRange = '
AND acpc'.(int)$id_criterion_group.'.`id_criterion` IN (
SELECT ac'.(int)$id_criterion_group.'.`id_criterion`
FROM `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int)$search['id_search'].'` ac'.(int)$id_criterion_group.'
JOIN `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int)$search['id_search'].'_link` aclink'.(int)$id_criterion_group.' ON (ac'.(int)$id_criterion_group.'.`id_criterion` = aclink'.(int)$id_criterion_group.'.`id_criterion`)
JOIN `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int)$search['id_search'].'_lang` acl'.(int)$id_criterion_group.' ON (ac'.(int)$id_criterion_group.'.`id_criterion` = acl'.(int)$id_criterion_group.'.`id_criterion` AND acl'.(int)$id_criterion_group.'.`id_lang` = '.(int)$id_lang.' AND ('.implode(' OR ', $where_translatable_value_range).'))
WHERE ac'.(int)$id_criterion_group.'.`id_criterion_group` = '.(int)$id_criterion_group.'
)
@@ -710,19 +710,46 @@ abstract class As4SearchEngine
}
$current_where = '`id_criterion` IN ('.implode(', ', array_map('intval', $id_criterion)).')';
$where_join[] = 'acpc'.(int)$id_criterion_group.'.'.$current_where;
$join_criterion[] = 'JOIN `'._DB_PREFIX_.'pm_advancedsearch_cache_product_criterion_'.(int) $search['id_search'].'` acpc'.(int)$id_criterion_group.' ON ( acp.`id_cache_product` = acpc'.(int)$id_criterion_group.'.`id_cache_product`'.(AdvancedSearchCoreClass::_isFilledArray($where_join) ?' AND '.implode(' OR ', $where_join) : '').')';
$join_criterion_tables[] = 'acpc'.(int)$id_criterion_group;
// Optymalizacja: EXISTS TYLKO dla zapytań COUNT (getQueryCountResults)
// Dla innych metod (wyświetlanie filtrów, lista produktów) muszą być JOIN'y
$useExistsOptimization = ($fromMethod == 'getQueryCountResults' && isset($selected_criteria_groups_type[$id_criterion_group]) && $selected_criteria_groups_type[$id_criterion_group]['criterion_group_type'] != 'attribute');
if ($useExistsOptimization) {
// EXISTS jest szybszy dla zapytań COUNT (nie-atrybutowych)
$where_criterion[] = 'EXISTS (SELECT 1 FROM `'._DB_PREFIX_.'pm_advancedsearch_cache_product_criterion_'.(int) $search['id_search'].'` acpc'.(int)$id_criterion_group.' WHERE acp.`id_cache_product` = acpc'.(int)$id_criterion_group.'.`id_cache_product`'.(AdvancedSearchCoreClass::_isFilledArray($where_join) ?' AND ('.implode(' OR ', $where_join).')' : '').' LIMIT 1)';
} else {
// Standardowy JOIN dla wszystkich innych przypadków
$join_criterion[] = 'JOIN `'._DB_PREFIX_.'pm_advancedsearch_cache_product_criterion_'.(int) $search['id_search'].'` acpc'.(int)$id_criterion_group.' ON ( acp.`id_cache_product` = acpc'.(int)$id_criterion_group.'.`id_cache_product`'.(AdvancedSearchCoreClass::_isFilledArray($where_join) ?' AND '.implode(' OR ', $where_join) : '').')';
$join_criterion_tables[] = 'acpc'.(int)$id_criterion_group;
}
if (is_array($originalCriterions) && sizeof($originalCriterions) > 1 && $selected_criteria_groups_type[$id_criterion_group]['is_combined']) {
foreach ($originalCriterions as $idCriterionOriginal) {
if (isset($customCriterionsWithParent[$idCriterionOriginal])) {
$criterionsListForMerge = $customCriterionsWithParent[$idCriterionOriginal];
} else {
$criterionsListForMerge = array($idCriterionOriginal);
// Dla kryteriów połączonych (is_combined)
// Optymalizacja EXISTS tylko dla zapytań COUNT
$useCombinedExistsOptimization = ($fromMethod == 'getQueryCountResults' && isset($selected_criteria_groups_type[$id_criterion_group]) && $selected_criteria_groups_type[$id_criterion_group]['criterion_group_type'] != 'attribute');
if ($useCombinedExistsOptimization) {
// EXISTS dla zapytań COUNT (szybsze)
foreach ($originalCriterions as $idCriterionOriginal) {
if (isset($customCriterionsWithParent[$idCriterionOriginal])) {
$criterionsListForMerge = $customCriterionsWithParent[$idCriterionOriginal];
} else {
$criterionsListForMerge = array($idCriterionOriginal);
}
$where_criterion[] = 'EXISTS (SELECT 1 FROM `'._DB_PREFIX_.'pm_advancedsearch_cache_product_criterion_'.(int) $search['id_search'].'` acpc'.(int)$id_criterion_group.'_'.(int)$idCriterionOriginal.' WHERE acp.`id_cache_product` = acpc'.(int)$id_criterion_group.'_'.(int)$idCriterionOriginal.'.`id_cache_product` AND acpc'.(int)$id_criterion_group.'_'.(int)$idCriterionOriginal.'.`id_criterion` IN ('. implode(',', array_map('intval', $criterionsListForMerge)) . ') LIMIT 1)';
}
} else {
// Standardowy JOIN dla wszystkich innych przypadków
foreach ($originalCriterions as $idCriterionOriginal) {
if (isset($customCriterionsWithParent[$idCriterionOriginal])) {
$criterionsListForMerge = $customCriterionsWithParent[$idCriterionOriginal];
} else {
$criterionsListForMerge = array($idCriterionOriginal);
}
$join_criterion[] = 'JOIN `'._DB_PREFIX_.'pm_advancedsearch_cache_product_criterion_'.(int) $search['id_search'].'` acpc'.(int)$id_criterion_group.'_'.(int)$idCriterionOriginal.' ON (
acpc'.(int)$id_criterion_group.'.`id_cache_product` = acpc'.(int)$id_criterion_group.'_'.(int)$idCriterionOriginal.'.`id_cache_product`
AND acpc'.(int)$id_criterion_group.'_'.(int)$idCriterionOriginal.'.`id_criterion` IN ('. implode(',', array_map('intval', $criterionsListForMerge)) . '))';
$join_criterion_tables[] = 'acpc'.(int)$id_criterion_group.'_'.(int)$idCriterionOriginal;
}
$join_criterion[] = 'JOIN `'._DB_PREFIX_.'pm_advancedsearch_cache_product_criterion_'.(int) $search['id_search'].'` acpc'.(int)$id_criterion_group.'_'.(int)$idCriterionOriginal.' ON (
acpc'.(int)$id_criterion_group.'.`id_cache_product` = acpc'.(int)$id_criterion_group.'_'.(int)$idCriterionOriginal.'.`id_cache_product`
AND acpc'.(int)$id_criterion_group.'_'.(int)$idCriterionOriginal.'.`id_criterion` IN ('. implode(',', array_map('intval', $criterionsListForMerge)) . '))';
$join_criterion_tables[] = 'acpc'.(int)$id_criterion_group.'_'.(int)$idCriterionOriginal;
}
}
}
@@ -734,11 +761,11 @@ abstract class As4SearchEngine
if (isset($selected_criteria_groups_type[$id_criterion_group]) && $selected_criteria_groups_type[$id_criterion_group]['criterion_group_type'] == 'attribute') {
if ($fromMethod != 'getCriterionsRange' || $fromMethod == 'getCriterionsRange' && $id_criterion_group == $current_id_criterion_group) {
$attribute_selected = true;
$join_criterion['criterion_'.(int)$search['id_search'].'_'.(int)$id_criterion_group] = 'JOIN `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int) $search['id_search'].'` ac'.(int)$id_criterion_group.' ON (acpc'.(int)$id_criterion_group.'.`id_criterion` = ac'.(int)$id_criterion_group.'.`id_criterion`)';
$join_criterion['criterion_link_'.(int)$search['id_search'].'_'.(int)$id_criterion_group] = 'JOIN `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int) $search['id_search'].'_link` aclink'.(int)$id_criterion_group.' ON (ac'.(int)$id_criterion_group.'.`id_criterion` = aclink'.(int)$id_criterion_group.'.`id_criterion`)';
// Optymalizacja: łączymy acpc bezpośrednio z aclink (pomijamy pośrednika ac)
// Eliminuje to jeden JOIN dla każdej grupy atrybutów
$join_criterion['criterion_link_'.(int)$search['id_search'].'_'.(int)$id_criterion_group] = 'JOIN `'._DB_PREFIX_.'pm_advancedsearch_criterion_'.(int) $search['id_search'].'_link` aclink'.(int)$id_criterion_group.' ON (acpc'.(int)$id_criterion_group.'.`id_criterion` = aclink'.(int)$id_criterion_group.'.`id_criterion`)';
$join_criterion['pa'.(int)$id_criterion_group] = 'JOIN `'._DB_PREFIX_.'product_attribute` pa'.(int)$id_criterion_group.' ON (pa'.(int)$id_criterion_group.'.`id_product` = acp.`id_product`)';
$join_criterion[] = 'JOIN `'._DB_PREFIX_.'product_attribute_combination` pac'.(int)$id_criterion_group.' ON (pa'.(int)$id_criterion_group.'.`id_product_attribute` = pac'.(int)$id_criterion_group.'.`id_product_attribute` AND pac'.(int)$id_criterion_group.'.`id_attribute` = aclink'.(int)$id_criterion_group.'.`id_criterion_linked`'.($previousIdCriterionGroupSelected != null ? ' AND pa'.(int)$previousIdCriterionGroupSelected.'.`id_product_attribute` = pa'.(int)$id_criterion_group.'.`id_product_attribute` ' : '').')';
$join_criterion_tables[] = 'ac'.(int)$id_criterion_group;
$join_criterion_tables[] = 'pa'.(int)$id_criterion_group;
$join_criterion_tables[] = 'pac'.(int)$id_criterion_group;
$lastAttributeCombinationTableId = 'pac' . (int)$id_criterion_group;