JSON рекурсия в PostgreSQL - бесконечный цикл - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть следующий JSON, хранящийся в столбце PostgreSQL (типа jsonb).

{
  "entity": "Book",
  "processes": [
       { "process": [
        { "processname": "Use",
          "option": "none",
          "processes": [
           { "process": [
           { "processname": "Lend",
            "option": "*",
            "processes": [
            { "process": [
              {
               "processname": "Borrow",
               "option": "none"
            }
        ]
    },
.......

Я хочу получить список всех процессов вместе с их родительским процессом и уровнем. Примерно так

Processname   Parent  Level
Use           {}        0 
Lend          Use       1
Borrow        Lend,Use  2

Я написал следующий код, но он продолжает выполняться в течение длительного времени (бесконечно l oop) без вывода каких-либо результатов.

WITH RECURSIVE recursion AS (
    SELECT  process -> 'processname' as processname, '{}'::jsonb[] as parents, 0 as lvl
    FROM   test3, jsonb_array_elements(j-> 'processes') processes, jsonb_array_elements(processes-> 'process') process


    UNION ALL
    select process -> 'processname' as processname, parents || '{}'::jsonb[], lvl+1
    FROM test3, jsonb_array_elements(j-> 'processes') processes, jsonb_array_elements(processes-> 'process') process
    JOIN recursion p on process -> 'processname' = p.processname
    WHERE not process -> 'processname' = any(parents)



)
SELECT *
FROM recursion;

Может кто-нибудь помочь мне?

...