Make calculations incremental
This commit is contained in:
@@ -104,17 +104,44 @@ async function calculateMetrics() {
|
||||
WHERE status = 'running'
|
||||
`);
|
||||
|
||||
// Get counts from all relevant tables
|
||||
// Get counts of records that need updating based on last calculation time
|
||||
const [[productCount], [orderCount], [poCount]] = await Promise.all([
|
||||
connection.query('SELECT COUNT(*) as total FROM products'),
|
||||
connection.query('SELECT COUNT(*) as total FROM orders'),
|
||||
connection.query('SELECT COUNT(*) as total FROM purchase_orders')
|
||||
connection.query(`
|
||||
SELECT COUNT(*) as total
|
||||
FROM products p
|
||||
LEFT JOIN calculate_status cs ON cs.module_name = 'product_metrics'
|
||||
WHERE p.updated > COALESCE(cs.last_calculation_timestamp, '1970-01-01')
|
||||
`),
|
||||
connection.query(`
|
||||
SELECT COUNT(*) as total
|
||||
FROM orders o
|
||||
LEFT JOIN calculate_status cs ON cs.module_name = 'product_metrics'
|
||||
WHERE o.updated > COALESCE(cs.last_calculation_timestamp, '1970-01-01')
|
||||
AND o.canceled = false
|
||||
`),
|
||||
connection.query(`
|
||||
SELECT COUNT(*) as total
|
||||
FROM purchase_orders po
|
||||
LEFT JOIN calculate_status cs ON cs.module_name = 'product_metrics'
|
||||
WHERE po.updated > COALESCE(cs.last_calculation_timestamp, '1970-01-01')
|
||||
`)
|
||||
]);
|
||||
|
||||
totalProducts = productCount.total;
|
||||
totalOrders = orderCount.total;
|
||||
totalPurchaseOrders = poCount.total;
|
||||
|
||||
// If nothing needs updating, we can exit early
|
||||
if (totalProducts === 0 && totalOrders === 0 && totalPurchaseOrders === 0) {
|
||||
console.log('No records need updating');
|
||||
return {
|
||||
processedProducts: 0,
|
||||
processedOrders: 0,
|
||||
processedPurchaseOrders: 0,
|
||||
success: true
|
||||
};
|
||||
}
|
||||
|
||||
// Create history record for this calculation
|
||||
const [historyResult] = await connection.query(`
|
||||
INSERT INTO calculate_history (
|
||||
@@ -239,7 +266,7 @@ async function calculateMetrics() {
|
||||
});
|
||||
|
||||
if (!SKIP_PRODUCT_METRICS) {
|
||||
const result = await calculateProductMetrics(startTime, totalProducts);
|
||||
const result = await calculateProductMetrics(startTime, totalProducts, processedProducts, isCancelled);
|
||||
await updateProgress(result.processedProducts, result.processedOrders, result.processedPurchaseOrders);
|
||||
if (!result.success) {
|
||||
throw new Error('Product metrics calculation failed');
|
||||
|
||||
Reference in New Issue
Block a user