我正在开发各种工作流引擎,其中管理员可以构建一组工作流程步骤,这些步骤已应用条件,然后用户可以启动项目并启动相应的步骤。
conditional
对象基本上具有以下关键点:
conditional.isDefault
是true
,那么它适用于所有项目conditional
会有数字fieldName
,operand
和value
字段,字符串只有fieldName
和value
字段匹配(即由美国国家选择列表定义的state
字段)我有一个直接的SQL查询(下面)可以工作并说明我在做什么,但我很好奇两件事:
1)是否可以使用sequelize而不是使用原始sql来执行此操作?
2)让postgres执行这些操作是否更高效,或者将整个工作流程步骤集合到我的nodejs应用程序然后在javascript中迭代数组会更高效吗?
这是SQl查询,显示我想要对单个JSONB字段中包含的数据数组做什么(注意:我不是超级熟练的w / SQL,特别是postgres的新手 - 所以这可能是各种错了!):
WITH steps(projId, step) AS (
SELECT
ppr.id AS projId,
jsonb_array_elements(ppr."workflowSteps") AS step
FROM "provider_project_ruleset" AS ppr
)
SELECT ARRAY(SELECT
jsonb(steps.step)
FROM
steps
WHERE
steps.step -> 'conditional' @> '{"isDefault": true}'
OR (step -> 'conditional' ->> 'fieldName' = 'state' AND step -> 'conditional' ->> 'value' = 'TN')
OR (step -> 'conditional' ->> 'fieldName' = 'amount' AND
(CASE step -> 'conditional' ->> 'operand'
WHEN '>=' THEN CASE WHEN (step -> 'conditional' ->> 'value')::bigint <= 10000000000 THEN 0 ELSE 1 END
WHEN '<=' THEN CASE WHEN (step -> 'conditional' ->> 'value')::bigint >= 10000000000 THEN 0 ELSE 1 END
WHEN '=' THEN CASE WHEN (step -> 'conditional' ->> 'value')::bigint = 10000000000 THEN 0 ELSE 1 END
ELSE 1
END) = 0
)
)