Spaces:
Paused
Paused
| CREATE EXTENSION IF NOT EXISTS ai CASCADE; | |
| -- 1. Authors | |
| CREATE TABLE IF NOT EXISTS authors ( | |
| author_id INT PRIMARY KEY, | |
| name_ar TEXT, | |
| death_hijri INT, | |
| death_hijri_text TEXT, | |
| alpha_sort TEXT, | |
| biography TEXT | |
| ); | |
| -- 2. Categories | |
| CREATE TABLE IF NOT EXISTS categories ( | |
| category_id INT PRIMARY KEY, | |
| category_name_ar TEXT, | |
| name_en TEXT, | |
| sort_order INT | |
| ); | |
| -- 3. Books | |
| CREATE TABLE IF NOT EXISTS books ( | |
| book_id INT PRIMARY KEY, | |
| shamela_id INT, | |
| title_ar TEXT, | |
| book_type INT, | |
| book_type_label TEXT, | |
| category_id INT REFERENCES categories(category_id), | |
| main_author_id INT REFERENCES authors(author_id), | |
| main_author_name_ar TEXT, | |
| main_author_death_hijri INT, | |
| main_author_death_hijri_text TEXT, | |
| authors_text TEXT, | |
| hijri_era TEXT, | |
| printed BOOLEAN, | |
| is_hidden BOOLEAN, | |
| parent_id INT, | |
| group_id INT, | |
| version_major INT, | |
| version_minor INT, | |
| betaka_text TEXT, | |
| meta JSONB, | |
| volume_count_observed INT, | |
| has_multi_part BOOLEAN, | |
| authors_json JSONB | |
| ); | |
| -- Book Authors (Many-to-Many relation between books and authors) | |
| CREATE TABLE IF NOT EXISTS book_authors ( | |
| book_id INT REFERENCES books(book_id), | |
| author_id INT REFERENCES authors(author_id), | |
| role TEXT, | |
| name_ar TEXT, | |
| death_hijri INT, | |
| PRIMARY KEY (book_id, author_id) | |
| ); | |
| -- 4. Pages | |
| CREATE TABLE IF NOT EXISTS pages ( | |
| page_id BIGINT PRIMARY KEY, | |
| book_id INT REFERENCES books(book_id), | |
| shamela_page_id INT, | |
| part TEXT, | |
| page_num INT, | |
| sequence_num INT, | |
| body TEXT, | |
| footnotes TEXT, | |
| hints TEXT, | |
| services_raw JSONB | |
| ); | |
| -- Index for Full-Text Search on Arabic text | |
| CREATE INDEX IF NOT EXISTS pages_body_idx ON pages USING GIN (to_tsvector('arabic', body)); | |
| -- 5. Table of Contents (TOC) | |
| CREATE TABLE IF NOT EXISTS toc ( | |
| title_id BIGINT PRIMARY KEY, | |
| book_id INT REFERENCES books(book_id), | |
| page_id BIGINT REFERENCES pages(page_id), | |
| parent_id BIGINT REFERENCES toc(title_id), | |
| shamela_title_id INT, | |
| title_text TEXT | |
| ); | |
| -- 6. Other Metadata Tables (Narrators, Quran, Roots, Xrefs) | |
| -- We use JSONB for flexible schema mapping until exact column definitions are parsed | |
| CREATE TABLE IF NOT EXISTS quran_verses ( | |
| verse_id INT PRIMARY KEY, | |
| surah_id INT, | |
| ayah_id INT, | |
| text_ar TEXT, | |
| data JSONB | |
| ); | |
| CREATE TABLE IF NOT EXISTS narrators ( | |
| narrator_id INT PRIMARY KEY, | |
| name_ar TEXT, | |
| data JSONB | |
| ); | |
| CREATE TABLE IF NOT EXISTS root_dictionary ( | |
| root_id INT PRIMARY KEY, | |
| token TEXT, | |
| data JSONB | |
| ); | |
| CREATE TABLE IF NOT EXISTS hadith_xrefs ( | |
| id SERIAL PRIMARY KEY, | |
| book_id INT REFERENCES books(book_id), | |
| page_id BIGINT REFERENCES pages(page_id), | |
| data JSONB | |
| ); | |
| CREATE TABLE IF NOT EXISTS tafsir_xrefs ( | |
| id SERIAL PRIMARY KEY, | |
| book_id INT REFERENCES books(book_id), | |
| page_id BIGINT REFERENCES pages(page_id), | |
| data JSONB | |
| ); | |
| CREATE TABLE IF NOT EXISTS page_isnads ( | |
| id SERIAL PRIMARY KEY, | |
| book_id INT REFERENCES books(book_id), | |
| page_id BIGINT REFERENCES pages(page_id), | |
| narrator_id INT REFERENCES narrators(narrator_id), | |
| data JSONB | |
| ); | |