Initial commit

This commit is contained in:
Luka Romih
2022-12-07 04:43:36 +01:00
commit 257f3c354f
496 changed files with 55373 additions and 0 deletions
+119
View File
@@ -0,0 +1,119 @@
CREATE OR REPLACE FUNCTION json_to_array (json)
RETURNS TEXT[]
AS $$
SELECT COALESCE(array_agg(x),
CASE WHEN $1 IS NULL THEN NULL ELSE ARRAY[]::TEXT[] END)
FROM json_array_elements_text($1) t(x);
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION entry_new (
_dictionary_id entry.dictionary_id%type,
_is_valid entry.is_valid%type,
_status entry.status%type,
_term entry.term%type,
_version_author entry.version_author%type,
_homonym_sort entry.homonym_sort%type,
_wordforms entry.wordforms%type,
_accent entry.accent%type,
_pronunciation entry.pronunciation%type,
_domain_label_name_list VARCHAR[],
_label entry.label%type,
_definition entry.definition%type,
_synonym entry.synonym%type,
_link_list JSON[],
_other entry.other%type,
_foreign_language_content_list JSON[],
_image entry.image%type,
_audio entry.audio%type,
_video entry.video%type,
OUT _entry_id entry.id%type
)
LANGUAGE plpgsql AS $$
DECLARE
_domain_label_id_list INT[] := ARRAY[]::INT[];
_domain_label_name_to_associate domain_label.name%type;
_domain_label_id_to_associate domain_label.id%type;
_link_to_associate JSON;
_foreign_language_content JSON;
_foreign_language_id_to_associate language.id%type;
BEGIN
-- Create new entry.
INSERT INTO entry (
dictionary_id,
is_valid,
status,
term,
version_author,
homonym_sort,
wordforms,
accent,
pronunciation,
label,
definition,
synonym,
other,
image,
audio,
video
)
VALUES (
_dictionary_id,
_is_valid,
_status,
_term,
_version_author,
_homonym_sort,
-- It would be better if instead of hardcoding the string, it said:
-- If value is NULL, insert the default value.
COALESCE(_wordforms, 'no content'),
COALESCE(_accent, 'no content'),
COALESCE(_pronunciation, 'no content'),
_label,
_definition,
_synonym,
_other,
_image,
_audio,
_video
)
RETURNING id
INTO _entry_id;
-- Create new domain labels, if any.
FOREACH _domain_label_name_to_associate IN ARRAY _domain_label_name_list LOOP
_domain_label_id_to_associate := (SELECT id FROM domain_label WHERE name = _domain_label_name_to_associate);
IF _domain_label_id_to_associate IS NULL THEN
INSERT INTO domain_label (name, dictionary_id) VALUES (_domain_label_name_to_associate, _dictionary_id)
returning id
INTO _domain_label_id_to_associate;
END IF;
_domain_label_id_list := _domain_label_id_list || _domain_label_id_to_associate;
END LOOP;
-- Associate domain labels, if any.
FOREACH _domain_label_id_to_associate IN ARRAY _domain_label_id_list LOOP
INSERT INTO entry_domain_label (entry_id, domain_label_id)
VALUES (_entry_id, _domain_label_id_to_associate);
END LOOP;
-- Associate links, if any.
FOREACH _link_to_associate IN ARRAY _link_list LOOP
INSERT INTO entry_link (entry_id, type, link)
VALUES (_entry_id, (_link_to_associate ->> 'type')::entry_link_type, _link_to_associate ->> 'link');
END LOOP;
-- Associate languages, if any.
FOREACH _foreign_language_content IN ARRAY _foreign_language_content_list LOOP
_foreign_language_id_to_associate := (SELECT id FROM language WHERE code = _foreign_language_content ->> 'language');
INSERT INTO entry_foreign (entry_id, language_id, term, definition, synonym)
VALUES (
_entry_id, _foreign_language_id_to_associate,
json_to_array(_foreign_language_content -> 'terms'),
_foreign_language_content ->> 'definition',
json_to_array(_foreign_language_content -> 'synonyms')
);
END LOOP;
END
$$