I want to create a local language dictionary

20 views Asked by At

I created this stored function to retrieve my data

CREATE OR REPLACE FUNCTION generate_word_data(word_input VARCHAR(255))
RETURNS JSONB AS
$$
DECLARE
    word_record RECORD;
    phonetic_record RECORD;
    meaning_record RECORD;
    synonym_record RECORD;
    antonym_record RECORD;
    word_data JSON;
    phonetics_array JSON[];
    meanings_array JSON[];
    synonyms_array JSON[] := '{}'; -- Initialize the array
    antonyms_array JSON[] := '{}'; -- Initialize the array
BEGIN
    -- Error handling
    BEGIN
        -- Fetch word details
        SELECT w.word, w.phonetic
        INTO word_record
        FROM public.word w
        WHERE w.word = word_input;

        -- Fetch phonetic details
        FOR phonetic_record IN SELECT p.text, p.audio FROM public.phonetics p WHERE p.word_id = (SELECT word_id FROM public.word WHERE word = word_input)
        LOOP
            IF phonetic_record.text IS NOT NULL OR phonetic_record.audio IS NOT NULL THEN
                phonetics_array := array_append(phonetics_array, json_build_object('text', phonetic_record.text, 'audio', phonetic_record.audio)::JSON);
            END IF;
        END LOOP;
        
        -- Fetch meanings details
        FOR meaning_record IN SELECT partofspeech, definition, example FROM public.meanings WHERE word_id = (SELECT word_id FROM public.word WHERE word = word_input)
        LOOP
            -- Reset arrays for synonyms and antonyms
            synonyms_array := '{}';
            antonyms_array := '{}';
            
            -- Fetch synonyms for each meaning
            FOR synonym_record IN SELECT s.synonym FROM public.synonyms s WHERE s.meaning_id IN (SELECT meaning_id FROM public.meanings WHERE word_id = (SELECT word_id FROM public.word WHERE word = word_input))
            LOOP
                IF synonym_record.synonym IS NOT NULL THEN
                    synonyms_array := array_append(synonyms_array, json_build_object('synonym', synonym_record.synonym)::JSON);
                END IF;
            END LOOP;
            
            -- Fetch antonyms for each meaning
            FOR antonym_record IN SELECT a.antonym FROM public.antonyms a WHERE a.meaning_id IN (SELECT meaning_id FROM public.meanings WHERE word_id = (SELECT word_id FROM public.word WHERE word = word_input))
            LOOP
                IF antonym_record.antonym IS NOT NULL THEN
                    antonyms_array := array_append(antonyms_array, json_build_object('antonym', antonym_record.antonym)::JSON);
                END IF;
            END LOOP;
            
            -- Construct JSON object for each meaning
            IF meaning_record.partofspeech IS NOT NULL OR meaning_record.definition IS NOT NULL OR meaning_record.example IS NOT NULL THEN
                meanings_array := array_append(meanings_array, json_build_object(
                    'partOfSpeech', meaning_record.partofspeech,
                    'definitions', json_build_array(
                        json_build_object('definition', meaning_record.definition, 'synonyms', synonyms_array, 'antonyms', antonyms_array)
                    )
                ));
            END IF;
        END LOOP;
        
        -- Construct final JSON object
        word_data := json_build_object(
            'word', word_record.word,
            'phonetic', word_record.phonetic,
            'phonetics', phonetics_array,
            'meanings', meanings_array
        );
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            RAISE EXCEPTION 'Word not found: %', word_input;
        WHEN TOO_MANY_ROWS THEN
            RAISE EXCEPTION 'Multiple entries found for word: %', word_input;
        WHEN OTHERS THEN
            RAISE EXCEPTION 'Error fetching data for word: %', word_input;
    END;

    RETURN word_data;
END;
$$
LANGUAGE plpgsql;

when i execute this stored function in supabase sql editor using

SELECT generate_word_data ('mobile');

i get this output

{"word":"mobile","meanings":[{"definitions":[{"antonyms":[{"antonym":"fixed"},{"antonym":"immobile"},{"antonym":"sessile"},{"antonym":"stationary"}],"synonyms":[{"synonym":"excitable"},{"synonym":"fickle"},{"synonym":"cell"},{"synonym":"cell phone"},{"synonym":"cellphone"},{"synonym":"cellular"},{"synonym":"cellular mobile"},{"synonym":"cellular phone"},{"synonym":"cellular telephone"},{"synonym":"handphone"}],"definition":"A kinetic sculpture or decorative arrangement made of items hanging so that they can move independently from each other."}],"partOfSpeech":"noun"},{"definitions":[{"antonyms":[{"antonym":"fixed"},{"antonym":"immobile"},{"antonym":"sessile"},{"antonym":"stationary"}],"synonyms":[{"synonym":"excitable"},{"synonym":"fickle"},{"synonym":"cell"},{"synonym":"cell phone"},{"synonym":"cellphone"},{"synonym":"cellular"},{"synonym":"cellular mobile"},{"synonym":"cellular phone"},{"synonym":"cellular telephone"},{"synonym":"handphone"}],"definition":"The internet accessed via mobile devices."}],"partOfSpeech":"noun"},{"definitions":[{"antonyms":[{"antonym":"fixed"},{"antonym":"immobile"},{"antonym":"sessile"},{"antonym":"stationary"}],"synonyms":[{"synonym":"excitable"},{"synonym":"fickle"},{"synonym":"cell"},{"synonym":"cell phone"},{"synonym":"cellphone"},{"synonym":"cellular"},{"synonym":"cellular mobile"},{"synonym":"cellular phone"},{"synonym":"cellular telephone"},{"synonym":"handphone"}],"definition":"Something that can move."}],"partOfSpeech":"noun"},{"definitions":[{"antonyms":[{"antonym":"fixed"},{"antonym":"immobile"},{"antonym":"sessile"},{"antonym":"stationary"}],"synonyms":[{"synonym":"excitable"},{"synonym":"fickle"},{"synonym":"cell"},{"synonym":"cell phone"},{"synonym":"cellphone"},{"synonym":"cellular"},{"synonym":"cellular mobile"},{"synonym":"cellular phone"},{"synonym":"cellular telephone"},{"synonym":"handphone"}],"definition":"Capable of being moved, especially on wheels."}],"partOfSpeech":"adjective"},{"definitions":[{"antonyms":[{"antonym":"fixed"},{"antonym":"immobile"},{"antonym":"sessile"},{"antonym":"stationary"}],"synonyms":[{"synonym":"excitable"},{"synonym":"fickle"},{"synonym":"cell"},{"synonym":"cell phone"},{"synonym":"cellphone"},{"synonym":"cellular"},{"synonym":"cellular mobile"},{"synonym":"cellular phone"},{"synonym":"cellular telephone"},{"synonym":"handphone"}],"definition":"Pertaining to or by agency of mobile phones."}],"partOfSpeech":"adjective"},{"definitions":[{"antonyms":[{"antonym":"fixed"},{"antonym":"immobile"},{"antonym":"sessile"},{"antonym":"stationary"}],"synonyms":[{"synonym":"excitable"},{"synonym":"fickle"},{"synonym":"cell"},{"synonym":"cell phone"},{"synonym":"cellphone"},{"synonym":"cellular"},{"synonym":"cellular mobile"},{"synonym":"cellular phone"},{"synonym":"cellular telephone"},{"synonym":"handphone"}],"definition":"Characterized by an extreme degree of fluidity; moving or flowing with great freedom."}],"partOfSpeech":"adjective"},{"definitions":[{"antonyms":[{"antonym":"fixed"},{"antonym":"immobile"},{"antonym":"sessile"},{"antonym":"stationary"}],"synonyms":[{"synonym":"excitable"},{"synonym":"fickle"},{"synonym":"cell"},{"synonym":"cell phone"},{"synonym":"cellphone"},{"synonym":"cellular"},{"synonym":"cellular mobile"},{"synonym":"cellular phone"},{"synonym":"cellular telephone"},{"synonym":"handphone"}],"definition":"Easily moved in feeling, purpose, or direction; excitable; changeable; fickle."}],"partOfSpeech":"adjective"},{"definitions":[{"antonyms":[{"antonym":"fixed"},{"antonym":"immobile"},{"antonym":"sessile"},{"antonym":"stationary"}],"synonyms":[{"synonym":"excitable"},{"synonym":"fickle"},{"synonym":"cell"},{"synonym":"cell phone"},{"synonym":"cellphone"},{"synonym":"cellular"},{"synonym":"cellular mobile"},{"synonym":"cellular phone"},{"synonym":"cellular telephone"},{"synonym":"handphone"}],"definition":"Changing in appearance and expression under the influence of the mind."}],"partOfSpeech":"adjective"},{"definitions":[{"antonyms":[{"antonym":"fixed"},{"antonym":"immobile"},{"antonym":"sessile"},{"antonym":"stationary"}],"synonyms":[{"synonym":"excitable"},{"synonym":"fickle"},{"synonym":"cell"},{"synonym":"cell phone"},{"synonym":"cellphone"},{"synonym":"cellular"},{"synonym":"cellular mobile"},{"synonym":"cellular phone"},{"synonym":"cellular telephone"},{"synonym":"handphone"}],"definition":"Capable of being moved, aroused, or excited; capable of spontaneous movement."}],"partOfSpeech":"adjective"},{"definitions":[{"antonyms":[{"antonym":"fixed"},{"antonym":"immobile"},{"antonym":"sessile"},{"antonym":"stationary"}],"synonyms":[{"synonym":"excitable"},{"synonym":"fickle"},{"synonym":"cell"},{"synonym":"cell phone"},{"synonym":"cellphone"},{"synonym":"cellular"},{"synonym":"cellular mobile"},{"synonym":"cellular phone"},{"synonym":"cellular telephone"},{"synonym":"handphone"}],"definition":"A portable telephone that connects with the telephone network over radio wave transmission."}],"partOfSpeech":"noun"}],"phonetic":"/ˈməʊbaɪl/","phonetics":[{"text":"/ˈməʊbaɪl/","audio":"https://api.dictionaryapi.dev/media/pronunciations/en/mobile-uk.mp3"},{"text":"/ˈmoʊbaɪl/","audio":null}]}

but when i run it in my code in flutter

import 'dart:convert';

import 'package:dictionary/models/response_model.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

class API {
  static Future<ResponseModel> fetchMeaning(String word) async {
    // Call the Supabase function using the client provided by supabase_flutter
    final response = await Supabase.instance.client
        .rpc('generate_word_data', params: {'word_input': word});

    print(response);

    // Check if the response is successful
    if (response.error == null) {
      final data = response.data as List<dynamic>;
      return ResponseModel.fromJson(data[0]);
    } else {
      // Throw an exception if the response is not successful
      throw Exception('Failed to load meaning: ${response.error}');
    }
  }
}

i get this output {word: null, meanings: null, phonetic: null, phonetics: null}

why is it that am getting null values when there is data in my tables, please help me.

I have tried running the rpc using postman, but i still get this:

{
    "word": null,
    "meanings": null,
    "phonetic": null,
    "phonetics": null
}

but there is data in my tables

0

There are 0 answers