Guest User

Untitled

a guest
Dec 15th, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.10 KB | None | 0 0
  1. -- обход дерева в глубину (делать каждый раз, когда вносим вершину) --
  2. -- если будет время, то переписать с учетом того, что дерево уже заполнено --
  3. -- для этого надо пересчитывать только то, что "справо" от вставки --
  4. CREATE OR REPLACE FUNCTION dfs(parent_id INTEGER, count INTEGER, current_depth INTEGER)
  5. RETURNS INTEGER
  6. LANGUAGE plpgsql
  7. AS $$
  8. DECLARE
  9. child INTEGER ARRAY;
  10. BEGIN
  11. child := get_array_childs(parent_id);
  12.  
  13. RAISE NOTICE 'parent_id: %, count: %', parent_id, count;
  14.  
  15. UPDATE node
  16. SET left_v = count
  17. WHERE node.id = parent_id;
  18.  
  19. IF array_length(child, 1) IS NULL
  20. THEN
  21. UPDATE node
  22. SET right_v = count + 1, depth = current_depth
  23. WHERE node.id = parent_id;
  24. RETURN count + 1;
  25. END IF;
  26.  
  27. FOR i IN 1 .. array_length(child, 1)
  28. LOOP
  29. count := dfs(child [i], count + 1, current_depth + 1);
  30. END LOOP;
  31.  
  32. UPDATE node
  33. SET right_v = count + 1, depth = current_depth
  34. WHERE node.id = parent_id;
  35.  
  36. RETURN count + 1;
  37. END $$;
Add Comment
Please, Sign In to add comment