Created
February 22, 2023 12:57
-
-
Save ealvesss/33ad7add01c49a47ff07f2decd91ebec to your computer and use it in GitHub Desktop.
function
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
create function export_lime_data() returns trigger | |
language plpgsql | |
as | |
$$ | |
DECLARE v_sid INT; | |
v_gid INT; | |
v_qid INT; | |
v_type VARCHAR(1); | |
v_title VARCHAR(10); | |
v_question VARCHAR(500); | |
v_question_order INT; | |
v_table_name VARCHAR(50); | |
v_parent_qid INT; | |
v_column_name VARCHAR(255); | |
v_query TEXT; | |
v_response_id INT; | |
v_response_value VARCHAR(500); | |
v_submitdate TIMESTAMP; | |
v_customer_cpf VARCHAR(20); | |
v_response varchar(500); | |
v_created_at timestamptz; | |
v_sub_question varchar(200); | |
v_quiz_codes uuid[]; | |
-- ## Cursors | |
DECLARE curQuestions refcursor; | |
curResponses refcursor; | |
curSubQuestions refcursor; | |
curCustomerCpf refcursor; | |
curFinal refcursor; | |
BEGIN | |
v_table_name := TG_TABLE_NAME::regclass::text; | |
-- | |
DROP TABLE IF EXISTS temp_result_data; | |
DROP TABLE IF EXISTS temp_customer_cpf; | |
-- | |
CREATE TEMPORARY TABLE temp_result_data( | |
id INT GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1) PRIMARY KEY NOT NULL, | |
response_id INT NOT NULL, | |
survey_id INT NOT NULL, | |
question VARCHAR(500) NULL, | |
response_value VARCHAR(500) NULL, | |
question_order INT NOT NULL, | |
parent_qid INT NOT NULL, | |
question_type VARCHAR(1) NULL, | |
created_at TIMESTAMPTZ DEFAULT NOW(), | |
title VARCHAR(100) NOT NULL, | |
submit_date TIMESTAMP NULL, | |
cpf VARCHAR(20) NULL); | |
-- | |
CREATE TEMPORARY TABLE temp_customer_cpf( | |
response_id INT NOT NULL, | |
cpf VARCHAR(20) NOT NULL); | |
--- | |
OPEN curQuestions FOR | |
SELECT lq.sid, | |
lq.gid, | |
lq.qid, | |
lq.type, | |
lq.title, | |
lql.question, | |
lq.question_order, | |
lq.parent_qid | |
FROM lime_groups AS lg | |
INNER JOIN lime_group_l10ns AS lgl ON lgl.gid = lg.gid | |
INNER JOIN lime_questions AS lq ON lq.gid = lgl.gid | |
INNER JOIN lime_question_l10ns AS lql ON lql.qid = lq.qid | |
WHERE lq.gid = lgl.gid | |
AND lq.parent_qid = 0 | |
AND lq.sid = cast(substring(v_table_name from '(\d{6})$') as integer) | |
ORDER BY lq.question_order; | |
FETCH curQuestions INTO | |
v_sid, | |
v_gid, | |
v_qid, | |
v_type, | |
v_title, | |
v_question, | |
v_question_order, | |
v_parent_qid; | |
WHILE FOUND | |
LOOP | |
-- | |
IF(v_type IN ('S', 'N')) THEN | |
v_column_name := CAST(v_sid AS VARCHAR(100)) || 'X' || CAST(v_gid AS VARCHAR(100)) || 'X' || CAST(v_qid AS VARCHAR(100)); | |
-- | |
DROP TABLE IF EXISTS temp_responses; | |
-- | |
v_query := 'CREATE TABLE temp_responses AS SELECT id, "' || v_column_name || '", submitdate FROM ' || v_table_name || ' WHERE ' || ' id = ' || NEW.id; | |
EXECUTE (v_query); | |
-- | |
OPEN curResponses FOR SELECT * FROM temp_responses; | |
FETCH curResponses INTO | |
v_response_id, | |
v_response_value, | |
v_submitdate; | |
WHILE FOUND | |
LOOP | |
IF(v_title = 'CPF' AND v_response_value IS NOT NULL) THEN | |
INSERT INTO temp_customer_cpf(response_id, cpf) VALUES(NEW.id, v_response_value); | |
END IF; | |
-- | |
INSERT INTO temp_result_data(response_id, survey_id, question, response_value, question_order, parent_qid, title, submit_date) VALUES(v_response_id, v_sid, v_question, v_response_value, v_question_order, v_parent_qid, v_title, v_submitdate); | |
-- | |
FETCH curResponses INTO v_response_id, v_response_value; | |
END LOOP; | |
CLOSE curResponses; | |
ELSE | |
-- | |
IF(v_title = 'CPF' AND v_response_value IS NOT NULL) THEN | |
INSERT INTO temp_customer_cpf(response_id, cpf) VALUES(NEW.id, v_response_value); | |
END IF; | |
-- | |
INSERT INTO temp_result_data(response_id, survey_id, question, response_value, question_order, parent_qid, question_type, title) VALUES(NEW.id, v_sid, v_question, v_response_value, v_question_order, v_parent_qid, v_type, v_title); | |
END IF; | |
-- | |
FETCH curQuestions INTO v_sid, v_gid, v_qid, v_type, v_title, v_question, v_question_order; | |
END LOOP; | |
CLOSE curQuestions; | |
-- subQuestions | |
OPEN curSubQuestions FOR | |
SELECT lq.sid, | |
lq.gid, | |
lq.qid, | |
lq.type, | |
lq.title, | |
lql.question, | |
lq.question_order, | |
lq.parent_qid | |
FROM lime_groups AS lg | |
INNER JOIN lime_group_l10ns AS lgl ON lgl.gid = lg.gid | |
INNER JOIN lime_questions AS lq ON lq.gid = lgl.gid | |
INNER JOIN lime_question_l10ns AS lql ON lql.qid = lq.qid | |
WHERE lq.gid = lgl.gid | |
AND lq.parent_qid > 0 | |
AND lq.sid = cast(substring(v_table_name from '(\d{6})$') as integer) | |
ORDER BY lq.question_order; | |
FETCH curSubQuestions INTO | |
v_sid, | |
v_gid, | |
v_qid, | |
v_type, | |
v_title, | |
v_question, | |
v_question_order, | |
v_parent_qid; | |
WHILE FOUND | |
LOOP | |
v_column_name := CAST(v_sid AS VARCHAR(100)) || 'X' || CAST(v_gid AS VARCHAR(100)) || 'X' || CAST(v_parent_qid AS VARCHAR(100)) || CAST(v_title AS VARCHAR(5)); | |
-- | |
DROP TABLE IF EXISTS temp_responses; | |
v_query := 'CREATE TABLE temp_responses AS SELECT id, "' || v_column_name || '", submitdate FROM ' || v_table_name || ' WHERE submitdate IS NOT NULL AND ' || ' id = ' || NEW.id; | |
EXECUTE (v_query); | |
-- | |
OPEN curResponses FOR SELECT * FROM temp_responses; | |
FETCH curResponses INTO | |
v_response_id, | |
v_response_value, | |
v_submitdate; | |
WHILE FOUND | |
LOOP | |
-- | |
INSERT INTO temp_result_data(response_id, survey_id, question, response_value, question_order, parent_qid, title, submit_date) VALUES(NEW.id, v_sid, v_question, v_response_value, v_question_order, v_parent_qid, v_title, v_submitdate); | |
FETCH curResponses INTO v_response_id, v_response_value; | |
END LOOP; | |
CLOSE curResponses; | |
-- | |
FETCH curSubQuestions INTO v_sid, v_gid, v_qid, v_type, v_title, v_question, v_question_order, v_parent_qid; | |
END LOOP; | |
CLOSE curSubQuestions; | |
-- | |
DROP TABLE IF EXISTS temp_responses; | |
-- | |
OPEN curCustomerCpf FOR | |
SELECT response_id, cpf FROM temp_customer_cpf; | |
FETCH curCustomerCpf INTO | |
v_response_id, | |
v_customer_cpf; | |
WHILE FOUND | |
LOOP | |
UPDATE temp_result_data | |
SET cpf = v_customer_cpf | |
WHERE response_id = NEW.id; | |
FETCH curCustomerCpf INTO v_response_id, v_customer_cpf; | |
END LOOP; | |
CLOSE curCustomerCpf; | |
-- | |
--RETURN QUERY | |
-- | |
OPEN curFinal FOR | |
SELECT trd.response_id, | |
trd.survey_id, | |
lql.question, | |
trd.question, | |
CASE | |
WHEN trd.response_value = '' THEN NULL | |
ELSE | |
trd.response_value | |
END AS response, | |
trd.parent_qid, | |
trd.question_order, | |
trd.created_at, | |
trd.title, | |
trd.submit_date, | |
trd.cpf | |
FROM temp_result_data trd | |
INNER JOIN lime_question_l10ns lql ON lql.qid = trd.parent_qid | |
UNION ALL | |
SELECT response_id, | |
survey_id, | |
question, | |
null, | |
response_value, | |
parent_qid, | |
question_order, | |
created_at, | |
title, | |
submit_date, | |
cpf | |
FROM temp_result_data | |
WHERE parent_qid = 0 | |
ORDER BY parent_qid, question_order; | |
FETCH curFinal INTO | |
v_response_id, | |
v_sid, | |
v_question, | |
v_sub_question, | |
v_response, | |
v_parent_qid, | |
v_question_order, | |
v_created_at, | |
v_title, | |
v_submitdate, | |
v_customer_cpf; | |
WHILE FOUND | |
LOOP | |
IF(NEW.submitdate IS NOT NULL) THEN | |
INSERT INTO mihmo.lime_exported_data(id, | |
id_response, | |
id_survey, | |
question_desc, | |
sub_question, | |
response_value, | |
qid_parent, | |
q_order, | |
inserted_at, | |
title_response, | |
submitdate, | |
customer_cpf) | |
VALUES((SELECT CASE WHEN MAX(id) IS NULL THEN 1 ELSE (max(id) + 1) END | |
FROM mihmo.lime_exported_data), | |
NEW.id, | |
v_sid, | |
v_question, | |
v_sub_question, | |
v_response, | |
v_parent_qid, | |
v_question_order, | |
v_created_at, | |
v_title, | |
v_submitdate, | |
v_customer_cpf); | |
END IF; | |
-- | |
FETCH curFinal INTO v_response_id,v_sid,v_question,v_sub_question,v_response,v_parent_qid,v_question_order,v_created_at,v_title,v_submitdate,v_customer_cpf; | |
-- | |
END LOOP; | |
CLOSE curFinal; | |
-- | |
SELECT array_agg(q.quizid) INTO v_quiz_codes | |
FROM mihmo.lime_exported_data led | |
INNER JOIN mihmo.quiz q ON q.integrationid = led.title_response | |
WHERE led.id_response = NEW.id | |
AND led.response_value IS NOT NULL; | |
-- | |
ASSERT v_quiz_codes.length() > 0 | |
-- | |
SELECT customer_cpf INTO v_customer_cpf | |
FROM mihmo.lime_exported_data | |
WHERE id_response = NEW.id LIMIT 1; | |
-- | |
UPDATE mihmo.customer | |
SET quizcodes = v_quiz_codes, | |
lastmodificationdate = now() | |
WHERE cpf = v_customer_cpf; | |
-- | |
RETURN NULL; | |
END; | |
$$; | |
alter function export_lime_data() owner to root; | |
grant execute on function export_lime_data() to lime_user; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment