summaryrefslogtreecommitdiff
path: root/src/lib/db/prosodydb.ts
diff options
context:
space:
mode:
authorpolwex <polwex@sortug.com>2025-05-29 12:10:22 +0700
committerpolwex <polwex@sortug.com>2025-05-29 12:10:22 +0700
commita3f24ea79b14394b24c4b60a010651eb29eeb872 (patch)
treecb1c4937084116f66a59727ee752afd974714c8e /src/lib/db/prosodydb.ts
parent7abf2227438362ad30820ee236405ec1b57a40b6 (diff)
glorious new db
Diffstat (limited to 'src/lib/db/prosodydb.ts')
-rw-r--r--src/lib/db/prosodydb.ts238
1 files changed, 238 insertions, 0 deletions
diff --git a/src/lib/db/prosodydb.ts b/src/lib/db/prosodydb.ts
new file mode 100644
index 0000000..b3b973b
--- /dev/null
+++ b/src/lib/db/prosodydb.ts
@@ -0,0 +1,238 @@
+import Database from "bun:sqlite";
+type Str = string | null;
+type ItemType = "word" | "syllable" | "idiom";
+
+class DatabaseHandler {
+ db: Database;
+ constructor() {
+ const dbPath = "/home/y/code/bun/ssr/waku/bulkdata/prosodynew.db";
+ const db = new Database(dbPath, { create: true });
+ db.exec("PRAGMA journal_mode = WAL"); // Enable Write-Ahead Logging for better performance
+ db.exec("PRAGMA foreign_keys = ON");
+ this.db = db;
+ }
+ async init() {
+ const file = Bun.file("./prosodyschema.sql");
+ const sql = await file.text();
+ this.db.exec(sql);
+ }
+ // selects
+ fetchWords(words: string[]) {
+ const query = this.db.query(
+ `SELECT id FROM words where spelling IN (${words.map((w) => `'${w}'`).join(", ")})`,
+ );
+ return query.all() as Array<{ id: number }>;
+ }
+ // inserts
+
+ addLanguage(code: string, name: string) {
+ const query = this.db
+ .query(`INSERT OR IGNORE INTO languages(iso6392, english) VALUES(?, ?)`)
+ .run(code, name);
+ }
+ addPronunciation(
+ type: ItemType,
+ parentId: number | bigint,
+ ipa: string,
+ syllables: number,
+ tags: Str,
+ notes: Str,
+ ) {
+ try {
+ const query = this.db
+ .query(
+ `INSERT INTO pronunciation(type, parent_id,ipa, syllables, tag, notes) VALUES(?, ?, ?, ?, ?, ?)`,
+ )
+ .run(type, parentId, ipa, syllables, tags, notes);
+ } catch (e) {
+ // console.error(e);
+ }
+ }
+ addWordRhyme(wordId: number | bigint, ipa: string, lang: string, notes: Str) {
+ console.log("wordrhyme", notes);
+ try {
+ const query = this.db
+ .query(
+ `INSERT INTO word_rhymes(text, lang, notes) VALUES(?, ?, ?)
+ ON CONFLICT(text,lang) DO UPDATE SET
+ text = excluded.text
+ RETURNING rowid
+ `,
+ )
+ .get(ipa, lang, notes) as { id: number };
+ const query2 = this.db
+ .query(
+ `
+ INSERT INTO words_idioms(word_id, idiom_id) VALUES(?, ?)
+ `,
+ )
+ .run(wordId, query.id);
+ } catch (e) {
+ // console.error(e);
+ }
+ }
+ addIdiom(spelling: string, lang: string) {
+ const query = this.db.query(
+ `INSERT INTO idioms(spelling, lang) VALUES(?, ?)`,
+ );
+ const res = query.run(spelling, lang);
+ return res;
+ }
+ findIdiomWords(spelling: string, idId: number | bigint) {
+ const split = spelling.split(" ");
+ const words = this.fetchWords(split);
+ console.log({ words });
+ const tx = this.db.transaction(() => {
+ for (const w of words) {
+ this.db
+ .query(
+ `
+ INSERT INTO words_idioms(word_id, idiom_id) VALUES(?, ?)
+ `,
+ )
+ .run(w.id, idId);
+ }
+ });
+ tx();
+ }
+ findIdiomsWords() {
+ const rows: any = this.db.query(`SELECT id, spelling FROM idioms`);
+ for (const row of rows) {
+ this.findIdiomWords(row.spelling, row.id);
+ }
+ }
+ addWord(spelling: string, lang: string) {
+ const query = this.db.query(
+ // `INSERT OR IGNORE INTO words(spelling, lang) VALUES(?, ?)`,
+ `INSERT INTO words(spelling, lang) VALUES(?, ?)`,
+ );
+ const res = query.run(spelling, lang);
+ const wordId = res.lastInsertRowid;
+ return wordId;
+ }
+ addSyllable(
+ wordId: number | bigint,
+ text: string,
+ lang: string,
+ long: boolean,
+ onset: Str,
+ medial: Str,
+ nucleus: string,
+ coda: Str,
+ rhyme: string,
+ tone: Str,
+ notes: Str,
+ ) {
+ const tx = this.db.transaction(() => {
+ const query = this.db.query(
+ `INSERT INTO syllables(text, lang, long, onset, medial, nucleus, coda, rhyme, tone, notes) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
+ );
+ const res = query.run(
+ text,
+ lang,
+ long,
+ onset,
+ medial,
+ nucleus,
+ coda,
+ rhyme,
+ tone,
+ notes,
+ );
+ const sylId = res.lastInsertRowid;
+
+ const res1 = this.db
+ .query(`INSERT INTO syllables_words(syl_id, word_id) VALUES(?, ?)`)
+ .run(sylId, wordId);
+ //
+ return sylId;
+ });
+ const sylId = tx();
+ let res1: any;
+ if (onset) {
+ res1 = this.db
+ .query(
+ `INSERT INTO onsets(text, lang) VALUES(?, ?)
+ ON CONFLICT(text, lang) DO UPDATE SET
+ text = excluded.text
+ RETURNING rowid
+ `,
+ )
+ .get(onset, lang);
+ this.db
+ .query(`INSERT INTO onsets_syllables(syl_id, onset_id) VALUES(?, ?)`)
+ .run(sylId, res1.id);
+ }
+ if (medial) {
+ res1 = this.db
+ .query(
+ `INSERT INTO medials(text, lang) VALUES(?, ?)
+ ON CONFLICT(text, lang) DO UPDATE SET
+ text = excluded.text
+ RETURNING rowid
+ `,
+ )
+ .get(medial, lang);
+ this.db
+ .query(`INSERT INTO medials_syllables(syl_id, medial_id) VALUES(?, ?)`)
+ .run(sylId, res1.id);
+ }
+ res1 = this.db
+ .query(
+ `INSERT INTO nucleus(text, lang) VALUES(?, ?)
+ ON CONFLICT(text, lang) DO UPDATE SET
+ text = excluded.text
+ RETURNING rowid
+ `,
+ )
+ .get(nucleus, lang);
+ this.db
+ .query(`INSERT INTO nucleus_syllables(syl_id, nucleus_id) VALUES(?, ?)`)
+ .run(sylId, res1.id);
+ if (coda) {
+ res1 = this.db
+ .query(
+ `INSERT INTO codas(text, lang) VALUES(?, ?)
+ ON CONFLICT(text, lang) DO UPDATE SET
+ text = excluded.text
+ RETURNING rowid
+ `,
+ )
+ .get(coda, lang);
+ this.db
+ .query(`INSERT INTO codas_syllables(syl_id, coda_id) VALUES(?, ?)`)
+ .run(sylId, res1.id);
+ }
+ res1 = this.db
+ .query(
+ `INSERT INTO rhymes(text, lang) VALUES(?, ?)
+ ON CONFLICT(text, lang) DO UPDATE SET
+ text = excluded.text
+ RETURNING rowid
+ `,
+ )
+ .get(rhyme, lang);
+ this.db
+ .query(`INSERT INTO rhymes_syllables(syl_id, rhyme_id) VALUES(?, ?)`)
+ .run(sylId, res1.id);
+ if (tone) {
+ res1 = this.db
+ .query(
+ `INSERT INTO tones(text, lang) VALUES(?, ?)
+ ON CONFLICT(text, lang) DO UPDATE SET
+ text = excluded.text
+ RETURNING rowid
+ `,
+ )
+ .get(tone, lang);
+ this.db
+ .query(`INSERT INTO tones_syllables(syl_id, tone_id) VALUES(?, ?)`)
+ .run(sylId, res1.id);
+ }
+ }
+
+ // reads
+}
+const db = new DatabaseHandler();
+
+export default db;