CREATE TABLE "entry" ( "id" UUID NOT NULL DEFAULT uuid_generate_v4(), "createdAt" TIMESTAMPTZ DEFAULT now(), "updatedAt" TIMESTAMPTZ DEFAULT now(), "userId" UUID NOT NULL REFERENCES "user"("id") ON DELETE CASCADE, "type" TEXT NOT NULL, "_type" TEXT[] GENERATED ALWAYS AS (CASE WHEN "type" = 'character' THEN ARRAY['character', 'hanzi', 'kanji'] ELSE ARRAY["type"] END) STORED, "entry" TEXT[] NOT NULL CHECK ("entry"[1] IS NOT NULL), "reading" JSONB NOT NULL DEFAULT '{}', -- TODO: jsonschema "translation" JSONB NOT NULL DEFAULT '{}', -- TODO: jsonschema "description" TEXT NOT NULL DEFAULT '', "tag" TEXT[] NOT NULL DEFAULT '{}', "level" FLOAT, "level.kanji" INT, "key" TEXT UNIQUE, "_meta" JSONB, -- TODO: jsonschema "priority" INT GENERATED ALWAYS AS (CASE WHEN "type" = 'vocabulary' THEN 10 WHEN "type" = 'character' THEN 5 WHEN "type" = 'sentence' THEN 1 ELSE 0 END) STORED, PRIMARY KEY ("id") ); CREATE TRIGGER "t_entry_updatedAt" BEFORE UPDATE ON "entry" FOR EACH ROW EXECUTE PROCEDURE "f_updatedAt"(); CREATE INDEX "idx_entry_priority" ON "entry" ("priority"); CREATE INDEX "idx_entry_updatedAt" ON "entry" ("updatedAt"); CREATE INDEX "idx_entry_userId" ON "entry" ("userId"); CREATE INDEX "idx_entry_type" ON "entry" USING GIN("_type"); CREATE INDEX "idx_entry_level" ON "entry" ("level"); CREATE INDEX "idx_entry_level.kanji" ON "entry" ("level.kanji"); CREATE INDEX "idx_entry_description" ON "entry" USING pgroonga("description") WITH (plugins='token_filters/stem', token_filters='TokenFilterStem'); CREATE INDEX "idx_entry_entry" ON "entry" USING pgroonga("entry") WITH ( tokenizer='TokenMecab', normalizer='NormalizerNFKC100("unify_kana", true)' ); CREATE INDEX "idx_entry_entry_gin" ON "entry" USING GIN("entry"); CREATE INDEX "idx_entry_tag" ON "entry" USING pgroonga ("tag"); CREATE INDEX "idx_entry_meta" ON "entry" USING pgroonga("_meta"); CREATE INDEX "idx_entry_reading" ON "entry" USING pgroonga("reading") WITH ( tokenizer='TokenMecab', normalizer='NormalizerNFKC100("unify_kana", true)' ); CREATE INDEX "idx_entry_translation" ON "entry" USING pgroonga("translation");