2026-05-31 20:33:27 +07:00
|
|
|
-- Create text_analysis_cache table for DB-backed moderation analysis caching.
|
|
|
|
|
-- Full-text key preserves context so "kau" (clean) ≠ "awas kau" (harassment).
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS text_analysis_cache (
|
|
|
|
|
text TEXT PRIMARY KEY,
|
|
|
|
|
flags TEXT NOT NULL DEFAULT '[]',
|
|
|
|
|
source TEXT NOT NULL DEFAULT 'local'
|
2026-05-31 23:01:38 +07:00
|
|
|
CHECK (source IN ('local', 'nvidia', 'primary_ai', 'groq', 'vision_llm')),
|
2026-05-31 20:33:27 +07:00
|
|
|
analyzed_at BIGINT NOT NULL,
|
|
|
|
|
expires_at BIGINT NOT NULL,
|
|
|
|
|
hit_count INTEGER NOT NULL DEFAULT 0
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_text_analysis_cache_expires_at
|
|
|
|
|
ON text_analysis_cache (expires_at);
|
|
|
|
|
|
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_text_analysis_cache_source
|
|
|
|
|
ON text_analysis_cache (source);
|
|
|
|
|
|
|
|
|
|
-- Periodic cleanup: run every hour to remove expired entries.
|
|
|
|
|
-- This is optional; prune_expired_texts() in textCacheStore.ts also works.
|
|
|
|
|
-- COMMENT: Consider using pg_cron or an external scheduler for:
|
|
|
|
|
-- DELETE FROM text_analysis_cache WHERE expires_at < extract(epoch from now()) * 1000;
|