tamarin_vs19

Untitled

Nov 12th, 2021 (edited)
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.51 KB | None | 0 0
  1. drop function tree_info;
  2. create or replace function node_info(n int)
  3.     returns int[]
  4. as
  5. $$
  6.     class Node:
  7.         def __init__(self, idx, parent):
  8.             self.idx = idx
  9.             self.parent = parent
  10.             self.children = []
  11.             self.level = 0
  12.             self.branch_size = 1
  13.  
  14.         def __eq__(self, other):
  15.             return self.idx == other.idx
  16.  
  17.     def read_data():
  18.         nodes_data = plpy.execute('SELECT * FROM Tree')
  19.         nodes = {}
  20.         for data in nodes_data:
  21.             if data['p'] is None:
  22.                 node = Node(data['n'], 0)
  23.                 root = node
  24.             else:
  25.                 node = Node(data['n'], data['p'])
  26.             nodes[node.idx] = node
  27.  
  28.         for node in nodes.values():
  29.             if node != root:
  30.                 nodes[node.parent].children.append(node)
  31.         return nodes, root
  32.  
  33.     def calc_levels(root, init_level):
  34.         root.level = init_level
  35.         for child in root.children:
  36.             calc_levels(child, init_level + 1)
  37.             root.branch_size += child.branch_size
  38.  
  39.     def get_level_size(level, nodes):
  40.         return sum(1 for node in nodes.values() if node.level == level)
  41.  
  42.     def get_info(idx, nodes):
  43.         node = nodes[idx]
  44.         level_size = get_level_size(node.level, nodes)
  45.         return node.idx, node.level, node.branch_size, level_size
  46.  
  47.     nodes, root = read_data()
  48.     calc_levels(root, 1)
  49.     return get_info(n, nodes)
  50.  
  51. $$ language plpython3u;
  52.  
  53. select * from node_info(3);
  54.  
Add Comment
Please, Sign In to add comment