CREATE TABLE "wanikani.subjects" ( "id" INT NOT NULL, "updatedAt" TIMESTAMPTZ NOT NULL, "object" TEXT NOT NULL, "url" TEXT NOT NULL, "data" JSONB NOT NULL, -- slug: string -- characters?: string -- character_images?: { url: string; content_type: string; metadata: any }[] -- amalgamation_subject_ids: int[] -- visually_similar_subject_ids?: int[] -- component_subject_ids?: int[] -- meanings: { meaning: string; accepted_answer: boolean }[] -- readings: { reading: string; type: string; accepted_answer: boolean; primary: boolean }[] -- context_sentences?: { en: string; ja: string }[] PRIMARY KEY ("id") ); CREATE INDEX "idx_wanikani.subjects_object" ON "wanikani.subjects" ("object"); CREATE INDEX "idx_wanikani.subjects_data-characters" ON "wanikani.subjects" (("data" ->> 'characters')); CREATE INDEX "idx_wanikani.subjects_data-level" ON "wanikani.subjects" ((("data" -> 'level')::int)); CREATE INDEX "idx_wanikani.subjects_data" ON "wanikani.subjects" USING pgroonga("data") WITH ( plugins='token_filters/stem', token_filters='TokenFilterStem' ); CREATE INDEX "idx_wanikani.subjects_data_kana" ON "wanikani.subjects" USING pgroonga((identity("data"))) WITH ( tokenizer='TokenMecab', normalizer='NormalizerNFKC100("unify_kana", true)' ); CREATE MATERIALIZED VIEW "wanikani.subjects.sentences" AS ( SELECT (s ->> 'ja') "ja", (s ->> 'en') "en" FROM "wanikani.subjects", jsonb_array_elements("data" -> 'context_sentences') "s" WHERE s ->> 'ja' > '' ); CREATE INDEX "idx_wanikani.subjects.sentences_ja" ON "wanikani.subjects.sentences" USING pgroonga("ja") WITH ( tokenizer='TokenMecab', normalizer='NormalizerNFKC100("unify_kana", true)' ); CREATE INDEX "idx_wanikani.subjects.sentences_ja_kana" ON "wanikani.subjects.sentences" USING pgroonga((identity("ja"))) WITH ( tokenizer='TokenMecab("use_reading", true)', normalizer='NormalizerNFKC100("unify_kana", true)' ); CREATE INDEX "idx_wanikani.subjects.sentences_en" ON "wanikani.subjects.sentences" USING pgroonga("en") WITH ( plugins='token_filters/stem', token_filters='TokenFilterStem' );