root
first commit
de15ca4
-- =================================================================
-- XARVIONEX MEMORY BLUEPRINT (PHASE 1.5)
-- Canonical Source of Truth for Data Structure
-- Location: /opt/xarvionex/memory/postgres/init.sql
-- =================================================================
-- 1. EXTENSIONS
-- Mengaktifkan UUID generator untuk ID yang unik secara global
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- =================================================================
-- 2. IMMUTABLE HISTORY (The Write Model)
-- Tabel ini mencatat setiap kejadian tanpa pernah diubah (Append Only).
-- =================================================================
CREATE TABLE IF NOT EXISTS event_logs (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
-- Identitas Event
event_type VARCHAR(100) NOT NULL, -- Contoh: 'SOCIAL_SIGNAL', 'CONVERSION'
source_organ VARCHAR(50) NOT NULL, -- Contoh: 'SENSORY_NODE_01', 'VEXA_01'
actor_xar_id VARCHAR(100) NOT NULL, -- Stable Anonymized ID: 'VX-USR-[HASH]'
-- Polymer Energy Matrix (Phase 1.5 Spec)
-- Menyimpan nilai energi dalam format JSONB fleksibel
-- Contoh: {"financial": {"val": 10, "curr": "USD"}, "social": {"val": 0.8}}
energy_matrix JSONB DEFAULT '{}'::jsonb,
-- Context Data (Payload Mentah)
payload JSONB NOT NULL,
-- Tracing & Forensics
external_ref_id VARCHAR(100), -- ID dari sistem luar (Telegram ID / Order ID)
correlation_id UUID, -- ID pelacakan lintas layanan
-- Timestamps
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
processed_at TIMESTAMP WITH TIME ZONE -- Kapan Worker selesai memproses
);
-- 3. INDEXING (Performance & Safety)
-- Mempercepat pencarian berdasarkan tipe event dan waktu
CREATE INDEX IF NOT EXISTS idx_event_type ON event_logs(event_type);
CREATE INDEX IF NOT EXISTS idx_created_at ON event_logs(created_at);
-- GUARD: Hard Idempotency (Sistem Imun Level DB)
-- Mencegah satu event eksternal yang sama masuk dua kali ke dalam sejarah.
-- Jika Worker gagal memfilter di Redis, DB akan menolaknya di sini.
CREATE UNIQUE INDEX IF NOT EXISTS idx_unique_event_ref
ON event_logs (source_organ, external_ref_id)
WHERE external_ref_id IS NOT NULL;
-- =================================================================
-- 4. MUTABLE STATE (The Read Model)
-- Tabel ini menyimpan status terkini sistem (Agregat).
-- Worker memperbarui tabel ini setiap kali ada event baru.
-- =================================================================
CREATE TABLE IF NOT EXISTS system_state (
metric_key VARCHAR(50) PRIMARY KEY, -- 'financial_total', 'social_mood'
metric_value JSONB, -- Nilai saat ini (Snapshot)
last_updated TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 5. INITIAL STATE SEEDING
-- Menanamkan nilai awal agar Worker tidak error saat mencoba membaca/update.
INSERT INTO system_state (metric_key, metric_value)
VALUES
('financial_total', '{"value": 0.0, "currency": "USD"}'::jsonb),
('social_sentiment', '{"value": 0.0, "label": "NEUTRAL"}'::jsonb)
ON CONFLICT (metric_key) DO NOTHING;