summaryrefslogtreecommitdiff
path: root/src/actions/tones.ts
diff options
context:
space:
mode:
authorpolwex <polwex@sortug.com>2025-05-29 16:25:31 +0700
committerpolwex <polwex@sortug.com>2025-05-29 16:25:31 +0700
commita03c92dc82ad527d7da6bbaa3c43000e2e5f0e69 (patch)
tree9a47cae250d043d31f751c1383bdcbe09d4bc9d8 /src/actions/tones.ts
parent7de09570c0d7907424c30f492207e80ff69e4061 (diff)
better better
Diffstat (limited to 'src/actions/tones.ts')
-rw-r--r--src/actions/tones.ts47
1 files changed, 30 insertions, 17 deletions
diff --git a/src/actions/tones.ts b/src/actions/tones.ts
index 8089453..7d85d1c 100644
--- a/src/actions/tones.ts
+++ b/src/actions/tones.ts
@@ -1,31 +1,31 @@
-'use server';
+"use server";
-import db from '@/lib/db';
-import { WordData } from '@/zoom/logic/types';
+import db from "@/lib/db";
+import { WordData } from "@/zoom/logic/types";
// Helper to extract tone from prosody - assuming prosody is an array of objects like [{tone: number}, ...]
const getTonesFromProsody = (prosody: any): number[] | null => {
if (Array.isArray(prosody) && prosody.length > 0) {
- return prosody.map(p => p.tone).filter(t => typeof t === 'number');
+ return prosody.map((p) => p.tone).filter((t) => typeof t === "number");
}
return null;
};
export async function fetchWordsByToneAndSyllables(
syllableCount: number,
- tones: (number | null)[] // Array of tones, one for each syllable. null means any tone.
+ tones: (number | null)[], // Array of tones, one for each syllable. null means any tone.
): Promise<WordData | null> {
if (syllableCount !== tones.length) {
console.error("Syllable count and tones array length mismatch");
return null;
}
- const queryParams: (string | number)[] = ['th', syllableCount, syllableCount]; // lang, syllables (for WHERE), syllables (for json_array_length)
+ const queryParams: (string | number)[] = ["th", syllableCount, syllableCount]; // lang, syllables (for WHERE), syllables (for json_array_length)
let toneConditions = "";
const toneClauses: string[] = [];
tones.forEach((tone, index) => {
- if (tone !== null && typeof tone === 'number') {
+ if (tone !== null && typeof tone === "number") {
// Assumes SQLite's json_extract function is available and prosody is like: [{"tone": 1}, {"tone": 3}, ...]
// Path for first syllable's tone: '$[0].tone'
toneClauses.push(`json_extract(prosody, '$[${index}].tone') = ?`);
@@ -34,11 +34,20 @@ export async function fetchWordsByToneAndSyllables(
});
if (toneClauses.length > 0) {
- toneConditions = `AND ${toneClauses.join(' AND ')}`;
+ toneConditions = `AND ${toneClauses.join(" AND ")}`;
}
const queryString = `
- SELECT id, spelling, prosody, syllables, lang, type, frequency, confidence, ipa, senses_array
+ SELECT id, spelling, prosody, syllables, lang, type, frequency, confidence, ipa,
+ (SELECT
+ json_group_array(json_object(
+ 'pos', pos,
+ 'senses', s.senses,
+ 'forms', forms,
+ 'etymology', etymology,
+ 'related', related)
+ ) FROM senses s WHERE s.parent_id = expressions.id
+ ) as senses_array
FROM expressions
WHERE lang = ?
AND syllables = ?
@@ -52,7 +61,7 @@ export async function fetchWordsByToneAndSyllables(
try {
const query = db.db.query(queryString);
- const row = query.get(...queryParams) as any;
+ const row = query.get(...queryParams) as any;
if (!row) return null;
@@ -69,13 +78,17 @@ export async function fetchWordsByToneAndSyllables(
confidence: row.confidence,
ipa: row.ipa ? JSON.parse(row.ipa) : [],
// Senses parsing is simplified here. Adjust if full sense data is needed.
- senses: row.senses_array ? JSON.parse(row.senses_array).map((s: any) => ({
- pos: s.pos,
- senses: typeof s.senses === 'string' ? JSON.parse(s.senses) : s.senses,
- forms: typeof s.forms === 'string' ? JSON.parse(s.forms) : s.forms,
- etymology: s.etymology,
- related: typeof s.related === 'string' ? JSON.parse(s.related) : s.related,
- })) : [],
+ senses: row.senses_array
+ ? JSON.parse(row.senses_array).map((s: any) => ({
+ pos: s.pos,
+ senses:
+ typeof s.senses === "string" ? JSON.parse(s.senses) : s.senses,
+ forms: typeof s.forms === "string" ? JSON.parse(s.forms) : s.forms,
+ etymology: s.etymology,
+ related:
+ typeof s.related === "string" ? JSON.parse(s.related) : s.related,
+ }))
+ : [],
};
return word;
} catch (error) {