File size: 2,529 Bytes
776244c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
-- Enable pgvector extension
CREATE EXTENSION IF NOT EXISTS vector;

-- ── Documents table ────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS documents (
    doc_id          UUID PRIMARY KEY,
    doc_name        TEXT NOT NULL,
    jurisdiction    TEXT NOT NULL,
    doc_type        TEXT NOT NULL,
    source_url      TEXT NOT NULL,
    effective_date  DATE,
    gazette_number  TEXT,
    total_chunks    INTEGER DEFAULT 0,
    ingested_at     TIMESTAMPTZ DEFAULT NOW(),
    is_active       BOOLEAN DEFAULT TRUE
);

-- ── Legal chunks table ─────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS legal_chunks (
    chunk_id            UUID PRIMARY KEY,
    doc_id              UUID REFERENCES documents(doc_id) ON DELETE CASCADE,
    jurisdiction        TEXT NOT NULL,
    doc_type            TEXT NOT NULL,
    doc_name            TEXT NOT NULL,
    section_id          TEXT NOT NULL,
    section_title       TEXT NOT NULL,
    section_hierarchy   TEXT[] NOT NULL DEFAULT '{}',
    text                TEXT NOT NULL,
    effective_date      DATE,
    superseded_by       UUID REFERENCES legal_chunks(chunk_id),
    status              TEXT NOT NULL DEFAULT 'active',
    source_url          TEXT NOT NULL,
    page_number         INTEGER NOT NULL,
    embedding           vector(768),          -- matches EMBEDDING_DIMENSION in .env
    created_at          TIMESTAMPTZ DEFAULT NOW()
);

-- ── Indexes ────────────────────────────────────────────────────────────────────
-- HNSW index for fast approximate nearest neighbor search
CREATE INDEX IF NOT EXISTS legal_chunks_embedding_idx
    ON legal_chunks
    USING hnsw (embedding vector_cosine_ops)
    WITH (m = 16, ef_construction = 64);

-- Filter indexes for metadata queries
CREATE INDEX IF NOT EXISTS legal_chunks_jurisdiction_idx
    ON legal_chunks (jurisdiction);

CREATE INDEX IF NOT EXISTS legal_chunks_doc_type_idx
    ON legal_chunks (doc_type);

CREATE INDEX IF NOT EXISTS legal_chunks_section_id_idx
    ON legal_chunks (section_id);

CREATE INDEX IF NOT EXISTS legal_chunks_status_idx
    ON legal_chunks (status);