Import time improvment

Instead of making as many queries as you ps_feature entries (for each
product), it is possible to make it in one query.

And we test if the user has the MySQL rights to create temporary tables.
This commit is contained in:
Samy Rabih
2013-03-02 18:21:04 +01:00
parent cdb9c0cb40
commit 0882c187fc
+22 -11
View File
@@ -313,19 +313,30 @@ class FeatureCore extends ObjectModel
public static function cleanPositions()
{
$return = true;
$sql = '
SELECT `id_feature`
FROM `'._DB_PREFIX_.'feature`
ORDER BY `position`';
$result = Db::getInstance()->executeS($sql);
CREATE TEMPORARY TABLE `'._DB_PREFIX_.'feature_tmp` (
`rank` INT NOT NULL AUTO_INCREMENT,
`id_feature` int not null,
`position` int not null,
primary key(rank)
);
INSERT INTO '._DB_PREFIX_.'feature_tmp(id_feature,position) SELECT id_feature,position FROM '._DB_PREFIX_.'feature ORDER BY position ASC;
UPDATE `'._DB_PREFIX_.'feature` f LEFT JOIN '._DB_PREFIX_.'feature_tmp t USING(id_feature) SET f.position = rank-1';
$return = Db::getInstance()->executeS($sql);
if (!$return) {
$sql = '
SELECT `id_feature`
FROM `'._DB_PREFIX_.'feature`
ORDER BY `position`';
$result = Db::getInstance()->executeS($sql);
$i = 0;
foreach ($result as $value)
$return = Db::getInstance()->execute('
UPDATE `'._DB_PREFIX_.'feature`
SET `position` = '.(int)$i++.'
WHERE `id_feature` = '.(int)$value['id_feature']);
$i = 0;
foreach ($result as $value)
$return = Db::getInstance()->execute('
UPDATE `'._DB_PREFIX_.'feature`
SET `position` = '.(int)$i++.'
WHERE `id_feature` = '.(int)$value['id_feature']);
}
return $return;
}