chore: update code structure for better readability and maintainability
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user