perf: Use denormalized product_count in pipeline and favorites routes
- pipeline.ts: Replace correlated subquery with d.product_count - consumer-favorites.ts: Replace correlated subquery with d.product_count Correlated subqueries were causing N+1 query patterns. Using the denormalized column is O(1) lookup per row. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -75,6 +75,7 @@ router.get('/', async (req: Request, res: Response) => {
|
|||||||
});
|
});
|
||||||
} else if (domain === 'findadispo.com') {
|
} else if (domain === 'findadispo.com') {
|
||||||
// Dispensary favorites
|
// Dispensary favorites
|
||||||
|
// Use denormalized product_count column (faster than correlated subquery)
|
||||||
const result = await pool.query(
|
const result = await pool.query(
|
||||||
`SELECT f.*,
|
`SELECT f.*,
|
||||||
d.name as current_name,
|
d.name as current_name,
|
||||||
@@ -88,7 +89,7 @@ router.get('/', async (req: Request, res: Response) => {
|
|||||||
d.hours,
|
d.hours,
|
||||||
d.latitude,
|
d.latitude,
|
||||||
d.longitude,
|
d.longitude,
|
||||||
(SELECT COUNT(*) FROM store_products WHERE dispensary_id = d.id AND stock_status = 'in_stock') as product_count
|
COALESCE(d.product_count, 0) as product_count
|
||||||
FROM findadispo_favorites f
|
FROM findadispo_favorites f
|
||||||
LEFT JOIN dispensaries d ON f.dispensary_id = d.id
|
LEFT JOIN dispensaries d ON f.dispensary_id = d.id
|
||||||
WHERE f.user_id = $1
|
WHERE f.user_id = $1
|
||||||
|
|||||||
@@ -679,11 +679,11 @@ router.post('/stores/:id/approve', async (req: Request, res: Response) => {
|
|||||||
const dispensaryId = parseInt(id, 10);
|
const dispensaryId = parseInt(id, 10);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Get the dispensary with product count
|
// Get the dispensary with product count (use denormalized column)
|
||||||
const { rows } = await pool.query(`
|
const { rows } = await pool.query(`
|
||||||
SELECT d.*,
|
SELECT d.*,
|
||||||
dcp.id as profile_id,
|
dcp.id as profile_id,
|
||||||
(SELECT COUNT(*) FROM store_products sp WHERE sp.dispensary_id = d.id) as product_count
|
COALESCE(d.product_count, 0) as product_count
|
||||||
FROM dispensaries d
|
FROM dispensaries d
|
||||||
LEFT JOIN dispensary_crawler_profiles dcp ON dcp.dispensary_id = d.id AND dcp.enabled = true
|
LEFT JOIN dispensary_crawler_profiles dcp ON dcp.dispensary_id = d.id AND dcp.enabled = true
|
||||||
WHERE d.id = $1
|
WHERE d.id = $1
|
||||||
@@ -760,7 +760,7 @@ router.post('/stores/approve-batch', async (req: Request, res: Response) => {
|
|||||||
try {
|
try {
|
||||||
let query = `
|
let query = `
|
||||||
SELECT d.id, d.name,
|
SELECT d.id, d.name,
|
||||||
(SELECT COUNT(*) FROM store_products sp WHERE sp.dispensary_id = d.id) as product_count
|
COALESCE(d.product_count, 0) as product_count
|
||||||
FROM dispensaries d
|
FROM dispensaries d
|
||||||
WHERE d.stage = 'sandbox'
|
WHERE d.stage = 'sandbox'
|
||||||
`;
|
`;
|
||||||
|
|||||||
Reference in New Issue
Block a user