Get product import started
This commit is contained in:
@@ -465,6 +465,7 @@ async function importProducts(prodConnection, localConnection) {
|
|||||||
|
|
||||||
console.log(`Inserting ${batch.length} products`);
|
console.log(`Inserting ${batch.length} products`);
|
||||||
|
|
||||||
|
// First insert the products
|
||||||
const values = batch.flatMap(r => [
|
const values = batch.flatMap(r => [
|
||||||
r.product_id, r.title, r.description, r.SKU, r.created_at, r.first_received,
|
r.product_id, r.title, r.description, r.SKU, r.created_at, r.first_received,
|
||||||
r.stock_quantity, r.preorder_count, r.notions_inv_count, r.price, r.regular_price,
|
r.stock_quantity, r.preorder_count, r.notions_inv_count, r.price, r.regular_price,
|
||||||
@@ -477,64 +478,94 @@ async function importProducts(prodConnection, localConnection) {
|
|||||||
r.baskets, r.notifies, r.date_last_sold
|
r.baskets, r.notifies, r.date_last_sold
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Create a constant for the SQL query to improve readability
|
// Get the number of columns from the first row's values
|
||||||
const insertProductsSQL = `
|
const columnsPerRow = values.length / batch.length;
|
||||||
INSERT INTO products (
|
const placeholders = batch.map(() =>
|
||||||
product_id, title, description, SKU, created_at, first_received,
|
`(${Array(columnsPerRow).fill('?').join(',')})`
|
||||||
stock_quantity, preorder_count, notions_inv_count, price, regular_price,
|
).join(',');
|
||||||
cost_price, landing_cost_price, barcode, harmonized_tariff_code,
|
|
||||||
updated_at, visible, managing_stock, replenishable, vendor,
|
|
||||||
vendor_reference, notions_reference, permalink,
|
|
||||||
image, image_175, image_full, brand, line, subline, artist,
|
|
||||||
options, tags, moq, uom, rating, reviews, weight, length,
|
|
||||||
width, height, country_of_origin, location, total_sold,
|
|
||||||
baskets, notifies, date_last_sold
|
|
||||||
)
|
|
||||||
VALUES ${batch.map(() => '(' + '?,'.repeat(45).slice(0,-1) + ')').join(',')}
|
|
||||||
ON DUPLICATE KEY UPDATE
|
|
||||||
title = VALUES(title),
|
|
||||||
description = VALUES(description),
|
|
||||||
stock_quantity = VALUES(stock_quantity),
|
|
||||||
preorder_count = VALUES(preorder_count),
|
|
||||||
notions_inv_count = VALUES(notions_inv_count),
|
|
||||||
price = VALUES(price),
|
|
||||||
regular_price = VALUES(regular_price),
|
|
||||||
cost_price = VALUES(cost_price),
|
|
||||||
landing_cost_price = VALUES(landing_cost_price),
|
|
||||||
barcode = VALUES(barcode),
|
|
||||||
harmonized_tariff_code = VALUES(harmonized_tariff_code),
|
|
||||||
updated_at = VALUES(updated_at),
|
|
||||||
visible = VALUES(visible),
|
|
||||||
replenishable = VALUES(replenishable),
|
|
||||||
vendor = VALUES(vendor),
|
|
||||||
vendor_reference = VALUES(vendor_reference),
|
|
||||||
notions_reference = VALUES(notions_reference),
|
|
||||||
permalink = VALUES(permalink),
|
|
||||||
image = VALUES(image),
|
|
||||||
image_175 = VALUES(image_175),
|
|
||||||
image_full = VALUES(image_full),
|
|
||||||
brand = VALUES(brand),
|
|
||||||
line = VALUES(line),
|
|
||||||
subline = VALUES(subline),
|
|
||||||
artist = VALUES(artist),
|
|
||||||
options = VALUES(options),
|
|
||||||
tags = VALUES(tags),
|
|
||||||
moq = VALUES(moq),
|
|
||||||
uom = VALUES(uom),
|
|
||||||
rating = VALUES(rating),
|
|
||||||
reviews = VALUES(reviews),
|
|
||||||
weight = VALUES(weight),
|
|
||||||
length = VALUES(length),
|
|
||||||
width = VALUES(width),
|
|
||||||
height = VALUES(height),
|
|
||||||
country_of_origin = VALUES(country_of_origin),
|
|
||||||
location = VALUES(location),
|
|
||||||
total_sold = VALUES(total_sold),
|
|
||||||
baskets = VALUES(baskets),
|
|
||||||
notifies = VALUES(notifies),
|
|
||||||
date_last_sold = VALUES(date_last_sold)`;
|
|
||||||
|
|
||||||
await localConnection.query(insertProductsSQL, values);
|
const sql = `INSERT INTO products (
|
||||||
|
pid, title, description, SKU, created_at, first_received,
|
||||||
|
stock_quantity, preorder_count, notions_inv_count, price, regular_price,
|
||||||
|
cost_price, landing_cost_price, barcode, harmonized_tariff_code,
|
||||||
|
updated_at, visible, managing_stock, replenishable, vendor,
|
||||||
|
vendor_reference, notions_reference, permalink,
|
||||||
|
image, image_175, image_full, brand, line, subline, artist,
|
||||||
|
options, tags, moq, uom, rating, reviews, weight, length,
|
||||||
|
width, height, country_of_origin, location, total_sold,
|
||||||
|
baskets, notifies, date_last_sold
|
||||||
|
)
|
||||||
|
VALUES ${placeholders}
|
||||||
|
ON DUPLICATE KEY UPDATE
|
||||||
|
title = VALUES(title),
|
||||||
|
description = VALUES(description),
|
||||||
|
stock_quantity = VALUES(stock_quantity),
|
||||||
|
preorder_count = VALUES(preorder_count),
|
||||||
|
notions_inv_count = VALUES(notions_inv_count),
|
||||||
|
price = VALUES(price),
|
||||||
|
regular_price = VALUES(regular_price),
|
||||||
|
cost_price = VALUES(cost_price),
|
||||||
|
landing_cost_price = VALUES(landing_cost_price),
|
||||||
|
barcode = VALUES(barcode),
|
||||||
|
harmonized_tariff_code = VALUES(harmonized_tariff_code),
|
||||||
|
updated_at = VALUES(updated_at),
|
||||||
|
visible = VALUES(visible),
|
||||||
|
replenishable = VALUES(replenishable),
|
||||||
|
vendor = VALUES(vendor),
|
||||||
|
vendor_reference = VALUES(vendor_reference),
|
||||||
|
notions_reference = VALUES(notions_reference),
|
||||||
|
permalink = VALUES(permalink),
|
||||||
|
image = VALUES(image),
|
||||||
|
image_175 = VALUES(image_175),
|
||||||
|
image_full = VALUES(image_full),
|
||||||
|
brand = VALUES(brand),
|
||||||
|
line = VALUES(line),
|
||||||
|
subline = VALUES(subline),
|
||||||
|
artist = VALUES(artist),
|
||||||
|
options = VALUES(options),
|
||||||
|
tags = VALUES(tags),
|
||||||
|
moq = VALUES(moq),
|
||||||
|
uom = VALUES(uom),
|
||||||
|
rating = VALUES(rating),
|
||||||
|
reviews = VALUES(reviews),
|
||||||
|
weight = VALUES(weight),
|
||||||
|
length = VALUES(length),
|
||||||
|
width = VALUES(width),
|
||||||
|
height = VALUES(height),
|
||||||
|
country_of_origin = VALUES(country_of_origin),
|
||||||
|
location = VALUES(location),
|
||||||
|
total_sold = VALUES(total_sold),
|
||||||
|
baskets = VALUES(baskets),
|
||||||
|
notifies = VALUES(notifies),
|
||||||
|
date_last_sold = VALUES(date_last_sold)`;
|
||||||
|
|
||||||
|
await localConnection.query(sql, values);
|
||||||
|
|
||||||
|
// Then insert the category relationships for this batch
|
||||||
|
const categoryPromises = batch.map(async product => {
|
||||||
|
// Get the category IDs from the production query
|
||||||
|
const [categoryRows] = await prodConnection.query(`
|
||||||
|
SELECT DISTINCT cat_id
|
||||||
|
FROM product_category_index
|
||||||
|
WHERE pid = ? AND cat_id IN (
|
||||||
|
SELECT cat_id FROM product_categories WHERE hidden = 0
|
||||||
|
)
|
||||||
|
`, [product.product_id]);
|
||||||
|
|
||||||
|
return categoryRows.map(row => [row.cat_id, product.product_id]);
|
||||||
|
});
|
||||||
|
|
||||||
|
const categoryResults = await Promise.all(categoryPromises);
|
||||||
|
const categoryRelationships = categoryResults.flat();
|
||||||
|
|
||||||
|
if (categoryRelationships.length > 0) {
|
||||||
|
const catPlaceholders = categoryRelationships.map(() => '(?, ?)').join(',');
|
||||||
|
await localConnection.query(`
|
||||||
|
INSERT INTO product_categories (cat_id, pid)
|
||||||
|
VALUES ${catPlaceholders}
|
||||||
|
ON DUPLICATE KEY UPDATE cat_id = VALUES(cat_id)
|
||||||
|
`, categoryRelationships.flat());
|
||||||
|
}
|
||||||
|
|
||||||
current += batch.length;
|
current += batch.length;
|
||||||
updateProgress(current, total, 'Products import', startTime);
|
updateProgress(current, total, 'Products import', startTime);
|
||||||
|
|||||||
Reference in New Issue
Block a user