bookwiz.io / supabase / migrations / 053_fix_word_count_queue_final.sql
053_fix_word_count_queue_final.sql
Raw
-- Final fix for the process_word_count_queue function
-- This should resolve the "column reference book_id is ambiguous" error

DROP FUNCTION IF EXISTS process_word_count_queue(INTEGER);

CREATE OR REPLACE FUNCTION process_word_count_queue(batch_size INTEGER DEFAULT 10)
RETURNS TABLE(book_id UUID, old_count INTEGER, new_count INTEGER, success BOOLEAN, error_message TEXT)
SECURITY DEFINER
SET search_path = public, pg_catalog, pg_temp
AS $$
DECLARE
    queue_record RECORD;
    old_word_count INTEGER;
    new_word_count INTEGER;
    error_text TEXT;
BEGIN
    -- Process books that need recalculation
    -- Use explicit table aliases to avoid ambiguous column references
    FOR queue_record IN 
        SELECT 
            q.book_id as queue_book_id, 
            b.title, 
            b.word_count
        FROM book_word_count_queue q
        JOIN books b ON q.book_id = b.id
        WHERE q.processed_at IS NULL
        AND q.attempts < 3  -- Limit retry attempts
        ORDER BY q.queued_at ASC
        LIMIT batch_size
    LOOP
        BEGIN
            old_word_count := queue_record.word_count;
            
            -- Calculate new word count
            new_word_count := calculate_book_word_count(queue_record.queue_book_id);
            
            -- Update the book's word count
            UPDATE books 
            SET word_count = new_word_count, 
                updated_at = NOW()
            WHERE id = queue_record.queue_book_id;
            
            -- Mark as processed
            UPDATE book_word_count_queue
            SET processed_at = NOW(),
                last_error = NULL
            WHERE book_id = queue_record.queue_book_id;
            
            -- Return success result
            book_id := queue_record.queue_book_id;
            old_count := old_word_count;
            new_count := new_word_count;
            success := TRUE;
            error_message := NULL;
            
            RETURN NEXT;
            
        EXCEPTION WHEN OTHERS THEN
            -- Handle errors
            error_text := SQLERRM;
            
            -- Update attempt count and error
            UPDATE book_word_count_queue
            SET attempts = attempts + 1,
                last_error = error_text
            WHERE book_id = queue_record.queue_book_id;
            
            -- Return error result
            book_id := queue_record.queue_book_id;
            old_count := queue_record.word_count;
            new_count := NULL;
            success := FALSE;
            error_message := error_text;
            
            RETURN NEXT;
        END;
    END LOOP;
    
    RETURN;
END;
$$ LANGUAGE plpgsql;