public function execute() { $search = new shopIndexSearch(); if (waRequest::param(0)) { $search->indexProduct(waRequest::param(0)); } else { $product_model = new shopProductModel(); $n = $product_model->countAll(); $limit = 100; $i = 0; $product_model->exec("TRUNCATE TABLE shop_search_index"); while ($i < $n) { echo $i . "/" . $n . "\n"; $sql = "SELECT p.*, t.name type_name FROM " . $product_model->getTableName() . " p\n LEFT JOIN shop_type t ON p.type_id = t.id\n LIMIT " . $i . ", " . $limit; $products = $product_model->query($sql)->fetchAll('id'); $product_ids = array_keys($products); // get skus $sql = "SELECT * FROM shop_product_skus WHERE product_id IN (i:id)"; $data = $product_model->query($sql, array('id' => $product_ids)); foreach ($data as $row) { $products[$row['product_id']]['skus'][] = $row; } // get tags $sql = "SELECT pt.product_id, t.name FROM shop_product_tags pt\n JOIN shop_tag t ON pt.tag_id = t.id WHERE pt.product_id IN (i:id)"; $data = $product_model->query($sql, array('id' => $product_ids)); foreach ($data as $row) { $products[$row['product_id']]['tags'][] = $row['name']; } // get features $sql = "SELECT pf.product_id, fv.value FROM shop_product_features pf\n JOIN shop_feature f ON pf.feature_id = f.id AND f.type = 'varchar'\n JOIN shop_feature_values_varchar fv ON pf.feature_value_id = fv.id WHERE pf.product_id IN (i:id)"; $data = $product_model->query($sql, array('id' => $product_ids)); foreach ($data as $row) { $products[$row['product_id']]['features'][] = $row['value']; } $sql = "SELECT pf.product_id, fv.value FROM shop_product_features pf\n JOIN shop_feature f ON pf.feature_id = f.id AND f.type = 'double'\n JOIN shop_feature_values_double fv ON pf.feature_value_id = fv.id WHERE pf.product_id IN (i:id)"; $data = $product_model->query($sql, array('id' => $product_ids)); foreach ($data as $row) { $products[$row['product_id']]['features'][] = $row['value']; } $sql = "SELECT pf.product_id, fv.value FROM shop_product_features pf\n JOIN shop_feature f ON pf.feature_id = f.id AND f.type = 'text'\n JOIN shop_feature_values_text fv ON pf.feature_value_id = fv.id WHERE pf.product_id IN (i:id)"; $data = $product_model->query($sql, array('id' => $product_ids)); foreach ($data as $row) { $products[$row['product_id']]['features'][] = $row['value']; } // get skus $sql = "SELECT * FROM shop_product_skus WHERE product_id IN (i:id)"; $data = $product_model->query($sql, array('id' => $product_ids)); foreach ($data as $row) { $products[$row['product_id']]['skus'][] = $row; } foreach ($products as $p) { $search->indexProduct($p, false); } $i += $limit; } } }
protected function step() { $limit = 10; $products = $this->product_model->select('id')->order('id')->limit("{$this->data['offset']}, {$limit}")->fetchAll(); foreach ($products as $p) { $this->data['offset'] += 1; try { // DO something with product $p $this->search_index->indexProduct($p['id']); } catch (Exception $e) { $this->error($e->getMessage()); } } sleep(1); }