separate queries

This commit is contained in:
Pavel 2024-04-18 20:32:07 +03:00
parent 0bb1040195
commit 460f903f3e
3 changed files with 104 additions and 62 deletions

@ -701,70 +701,112 @@ WITH user_data AS (
SELECT AmoID SELECT AmoID
FROM users FROM users
WHERE users.AccountID = $1 WHERE users.AccountID = $1
) ),
insert AS (
INSERT INTO tags (amoID, accountID, Entity, name, color, createdAt) INSERT INTO tags (amoID, accountID, Entity, name, color, createdAt)
SELECT (new_tags->>'AmoID')::INT, SELECT (new_tags->>'AmoID')::INT,
user_data.AmoID, user_data.AmoID,
CAST(new_tags->>'Entity' AS entitytype), CAST(new_tags->>'Entity' AS entitytype),
COALESCE(new_tags->>'Name', '')::varchar(50), COALESCE(new_tags->>'Name', '')::varchar(50),
COALESCE(new_tags->>'Color', '')::varchar(50), COALESCE(new_tags->>'Color', '')::varchar(50),
CURRENT_TIMESTAMP CURRENT_TIMESTAMP
FROM json_array_elements($2::json) AS new_tags FROM json_array_elements($2::json) AS new_tags
JOIN user_data ON true JOIN user_data ON true
ON CONFLICT (amoID, accountID, entity) DO UPDATE ON CONFLICT (amoID, accountID, entity) DO NOTHING
SET name = CASE WHEN tags.name <> EXCLUDED.name THEN EXCLUDED.name ELSE tags.name END, RETURNING EXCLUDED.*
color = CASE WHEN tags.color <> EXCLUDED.color THEN EXCLUDED.color ELSE tags.color END, )
createdAt = CASE WHEN tags.createdAt <> CURRENT_TIMESTAMP THEN CURRENT_TIMESTAMP ELSE tags.createdAt END SELECT * FROM insert;
RETURNING *;
-- name: UpdateTags :json_array
UPDATE tags AS t
SET name = (update_data ->> 'Name')::varchar(50),
color = (update_data ->> 'Color')::varchar(50),
createdAt = CURRENT_TIMESTAMP
FROM json_array_elements($1::json) AS update_data
WHERE t.amoID = (update_data ->> 'AmoID')::INT
AND t.accountID = (update_data ->> 'AccountID')::INT
AND t.Entity = (update_data ->> 'Entity')::entitytype;
-- name: CheckPipelines :many -- name: CheckPipelines :many
WITH insert AS (
INSERT INTO pipelines (amoID, accountID, name, isArchive, createdAt) INSERT INTO pipelines (amoID, accountID, name, isArchive, createdAt)
SELECT (new_pipelines->>'AmoID')::INT, SELECT (new_pipelines->>'AmoID')::INT,
(new_pipelines->>'AccountID')::INT, (new_pipelines->>'AccountID')::INT,
COALESCE(new_pipelines->>'Name', '')::varchar(50), COALESCE(new_pipelines->>'Name', '')::varchar(50),
CASE WHEN (new_pipelines->>'IsArchive') = 'true' THEN TRUE ELSE FALSE END, CASE WHEN (new_pipelines->>'IsArchive') = 'true' THEN TRUE ELSE FALSE END,
CURRENT_TIMESTAMP CURRENT_TIMESTAMP
FROM json_array_elements($1::json) AS new_pipelines FROM json_array_elements($1::json) AS new_pipelines
ON CONFLICT (amoID, accountID) DO UPDATE ON CONFLICT (amoID, accountID) DO NOTHING
SET name = CASE WHEN pipelines.name <> EXCLUDED.name THEN EXCLUDED.name ELSE pipelines.name END, RETURNING EXCLUDED.*
isArchive = CASE WHEN pipelines.isArchive <> EXCLUDED.isArchive THEN EXCLUDED.isArchive ELSE pipelines.isArchive END, )
createdAt = CASE WHEN pipelines.createdAt <> CURRENT_TIMESTAMP THEN CURRENT_TIMESTAMP ELSE pipelines.createdAt END SELECT * FROM insert;
RETURNING *;
-- name: UpdatePipelines :exec
UPDATE pipelines AS p
SET name = (update_data ->> 'Name')::varchar(50),
isArchive = CASE WHEN (update_data ->> 'IsArchive') = 'true' THEN TRUE ELSE FALSE END,
createdAt = CURRENT_TIMESTAMP
FROM json_array_elements($1::json) AS update_data
WHERE p.amoID = (update_data ->> 'AmoID')::INT
AND p.accountID = (update_data ->> 'AccountID')::INT;
-- name: CheckSteps :many -- name: CheckSteps :many
INSERT INTO steps (amoID,pipelineID, accountID, name, color, createdAt) WITH insert AS (
SELECT (new_steps->>'AmoID')::INT, INSERT INTO steps (amoID, pipelineID, accountID, name, color, createdAt)
(new_steps->>'PipelineID')::INT, SELECT (new_steps->>'AmoID')::INT,
(new_steps->>'AccountID')::INT, (new_steps->>'PipelineID')::INT,
COALESCE(new_steps->>'Name', '')::varchar(50), (new_steps->>'AccountID')::INT,
COALESCE(new_steps->>'Color', '')::varchar(50), COALESCE(new_steps->>'Name', '')::varchar(50),
CURRENT_TIMESTAMP COALESCE(new_steps->>'Color', '')::varchar(50),
FROM json_array_elements($1::json) AS new_steps CURRENT_TIMESTAMP
ON CONFLICT (amoID, accountID, PipelineID) DO UPDATE FROM json_array_elements($1::json) AS new_steps
SET name = CASE WHEN steps.name <> EXCLUDED.name THEN EXCLUDED.name ELSE steps.name END, ON CONFLICT (amoID, accountID, PipelineID) DO NOTHING
color = CASE WHEN steps.color <> EXCLUDED.color THEN EXCLUDED.color ELSE steps.color END, RETURNING EXCLUDED.*
createdAt = CASE WHEN steps.createdAt <> CURRENT_TIMESTAMP THEN CURRENT_TIMESTAMP ELSE steps.createdAt END )
RETURNING *; SELECT * FROM insert;
-- name: UpdateSteps :exec
UPDATE steps AS s
SET name = (update_data ->> 'Name')::varchar(50),
color = (update_data ->> 'Color')::varchar(50),
createdAt = CURRENT_TIMESTAMP
FROM json_array_elements($1::json) AS update_data
WHERE s.amoID = (update_data ->> 'AmoID')::INT
AND s.accountID = (update_data ->> 'AccountID')::INT
AND s.pipelineID = (update_data ->> 'PipelineID')::INT;
-- name: CheckFields :many -- name: CheckFields :many
WITH user_data AS ( WITH user_data AS (
SELECT AmoID SELECT AmoID
FROM users FROM users
WHERE users.AccountID = $1 WHERE users.AccountID = $1
),
insert AS (
INSERT INTO fields (amoID, code, accountID, name, Entity, type, createdAt)
SELECT (new_fields->>'AmoID')::INT,
COALESCE(new_fields->>'Code', '')::varchar(255),
user_data.AmoID,
COALESCE(new_fields->>'Name', '')::varchar(50),
CAST(new_fields->>'Entity' AS entitytype),
COALESCE(new_fields->>'Type', '')::varchar(50),
CURRENT_TIMESTAMP
FROM json_array_elements($2::json) AS new_fields
JOIN user_data ON true
ON CONFLICT (amoID, accountID, entity) DO NOTHING
RETURNING EXCLUDED.*
) )
INSERT INTO fields (amoID, code, accountID, name, Entity, type, createdAt) SELECT * FROM insert;
SELECT (new_fields->>'AmoID')::INT,
COALESCE(new_fields->>'Code', '')::varchar(255), -- name: UpdateFields :exec
user_data.AmoID, UPDATE fields AS f
COALESCE(new_fields->>'Name', '')::varchar(50), SET name = (update_data ->> 'Name')::varchar(50),
CAST(new_fields->>'Entity' AS entitytype), code = (update_data ->> 'Code')::varchar(255),
COALESCE(new_fields->>'Type', '')::varchar(50), type = (update_data ->> 'Type')::varchar(50),
CURRENT_TIMESTAMP createdAt = CURRENT_TIMESTAMP
FROM json_array_elements($2::json) AS new_fields FROM json_array_elements($1::json) AS update_data
JOIN user_data ON true WHERE f.amoID = (update_data ->> 'AmoID')::INT
ON CONFLICT (amoID, accountID, entity) DO UPDATE AND f.accountID = (update_data ->> 'AccountID')::INT
SET name = CASE WHEN fields.name <> EXCLUDED.name THEN EXCLUDED.name ELSE fields.name END, AND f.Entity = (update_data ->> 'Entity')::entitytype;
code = CASE WHEN fields.code <> EXCLUDED.code THEN EXCLUDED.code ELSE fields.code END,
type = CASE WHEN fields.type <> EXCLUDED.type THEN EXCLUDED.type ELSE fields.type END,
createdAt = CASE WHEN fields.createdAt <> CURRENT_TIMESTAMP THEN CURRENT_TIMESTAMP ELSE fields.createdAt END
RETURNING *;

@ -1,7 +1,7 @@
ALTER TABLE pipelines DROP CONSTRAINT IF EXISTS unique_pipeline; DROP INDEX IF EXISTS idx_unique_pipeline;
ALTER TABLE steps DROP CONSTRAINT IF EXISTS unique_step; DROP INDEX IF EXISTS idx_unique_step;
ALTER TABLE fields DROP CONSTRAINT IF EXISTS unique_field; DROP INDEX IF EXISTS idx_unique_field;
ALTER TABLE tags DROP CONSTRAINT IF EXISTS unique_tag; DROP INDEX IF EXISTS idx_unique_tag;
ALTER TABLE question ALTER TABLE question
DROP COLUMN IF EXISTS utm, DROP COLUMN IF EXISTS utm,

@ -78,7 +78,7 @@ ADD COLUMN utm jsonb NOT NULL DEFAULT '{}';
ALTER TABLE quiz ALTER TABLE quiz
ADD COLUMN rules jsonb NOT NULL DEFAULT '{}'; ADD COLUMN rules jsonb NOT NULL DEFAULT '{}';
ALTER TABLE pipelines ADD CONSTRAINT unique_pipeline UNIQUE (amoID, accountID); CREATE UNIQUE INDEX idx_unique_pipeline ON pipelines (amoID, accountID);
ALTER TABLE steps ADD CONSTRAINT unique_step UNIQUE (amoID, accountID, PipelineID); CREATE UNIQUE INDEX idx_unique_step ON steps (amoID, accountID, PipelineID);
ALTER TABLE fields ADD CONSTRAINT unique_field UNIQUE (amoID, accountID, entity); CREATE UNIQUE INDEX idx_unique_field ON fields (amoID, accountID, entity);
ALTER TABLE tags ADD CONSTRAINT unique_tag UNIQUE (amoID, accountID, entity); CREATE UNIQUE INDEX idx_unique_tag ON tags (amoID, accountID, entity);