Advertisement
Guest User

tree functions

a guest
Nov 25th, 2014
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.54 KB | None | 0 0
  1. CREATE PROCEDURAL LANGUAGE plpgsql;
  2.  
  3.  
  4. SET search_path = public, pg_catalog;
  5.  
  6.  
  7. CREATE FUNCTION bitfromint4(integer) RETURNS bit varying
  8. LANGUAGE plpgsql IMMUTABLE STRICT
  9. AS $_$
  10. begin
  11. return $1::bit(32);
  12. end;$_$;
  13.  
  14.  
  15. ALTER FUNCTION public.bitfromint4(integer) OWNER TO smarlowe;
  16.  
  17.  
  18. CREATE FUNCTION bittoint4(bit varying) RETURNS integer
  19. LANGUAGE plpgsql IMMUTABLE STRICT
  20. AS $_$
  21. begin
  22. return "int4"($1);
  23. end;$_$;
  24.  
  25.  
  26. ALTER FUNCTION public.bittoint4(bit varying) OWNER TO smarlowe;
  27.  
  28.  
  29. CREATE FUNCTION int_to_tree_key(integer) RETURNS bit varying
  30. LANGUAGE plpgsql IMMUTABLE STRICT
  31. AS $_$
  32.  
  33.  
  34.  
  35. declare
  36. p_intkey alias for $1;
  37. begin
  38. if p_intkey < 0 then
  39. raise exception 'int_to_tree_key: key must be a positive integer';
  40. end if;
  41.  
  42. if p_intkey < 128 then
  43. return substring(bitfromint4(p_intkey), 25, 8);
  44. else
  45. return substring(bitfromint4(cast (-2^31 + p_intkey as int4)), 1, 32);
  46. end if;
  47.  
  48. end;$_$;
  49.  
  50.  
  51. ALTER FUNCTION public.int_to_tree_key(integer) OWNER TO smarlowe;
  52.  
  53.  
  54. CREATE FUNCTION tree_ancestor_key(bit varying, integer) RETURNS bit varying
  55. LANGUAGE plpgsql IMMUTABLE STRICT
  56. AS $_$
  57.  
  58.  
  59. declare
  60. p_tree_key alias for $1;
  61. p_level alias for $2;
  62. v_level integer default 0;
  63. v_pos integer default 1;
  64. begin
  65.  
  66. if tree_level(p_tree_key) < p_level then
  67. raise exception 'tree_ancestor_key: key is at a level less than %', p_level;
  68. end if;
  69.  
  70. while v_level < p_level loop
  71. v_level := v_level + 1;
  72. if substring(p_tree_key, v_pos, 1) = '1' then
  73. v_pos := v_pos + 32;
  74. else
  75. v_pos := v_pos + 8;
  76. end if;
  77. end loop;
  78.  
  79. return substring(p_tree_key, 1, v_pos - 1);
  80.  
  81. end;$_$;
  82.  
  83.  
  84. ALTER FUNCTION public.tree_ancestor_key(bit varying, integer) OWNER TO smarlowe;
  85.  
  86.  
  87. CREATE FUNCTION tree_ancestor_keys(bit varying) RETURNS SETOF bit varying
  88. LANGUAGE sql IMMUTABLE STRICT
  89. AS $_$
  90.  
  91. select tree_ancestor_keys($1, 1)
  92.  
  93. $_$;
  94.  
  95.  
  96. ALTER FUNCTION public.tree_ancestor_keys(bit varying) OWNER TO smarlowe;
  97.  
  98.  
  99. CREATE FUNCTION tree_ancestor_keys(bit varying, integer) RETURNS SETOF bit varying
  100. LANGUAGE sql IMMUTABLE STRICT
  101. AS $_$
  102. select tree_ancestor_key($1, $2)
  103. union
  104. select tree_ancestor_keys($1, $2 + 1)
  105. where $2 < tree_level($1)
  106. $_$;
  107.  
  108.  
  109. ALTER FUNCTION public.tree_ancestor_keys(bit varying, integer) OWNER TO smarlowe;
  110.  
  111.  
  112. CREATE FUNCTION tree_ancestor_p(bit varying, bit varying) RETURNS boolean
  113. LANGUAGE plpgsql IMMUTABLE
  114. AS $_$
  115. declare
  116. p_potential_ancestor alias for $1;
  117. p_potential_child alias for $2;
  118. begin
  119. return position(p_potential_ancestor in p_potential_child) = 1;
  120. end;$_$;
  121.  
  122.  
  123. ALTER FUNCTION public.tree_ancestor_p(bit varying, bit varying) OWNER TO smarlowe;
  124.  
  125.  
  126. CREATE FUNCTION tree_increment_key(bit varying) RETURNS bit varying
  127. LANGUAGE plpgsql IMMUTABLE
  128. AS $_$
  129. declare
  130. p_child_sort_key alias for $1;
  131. v_child_sort_key integer;
  132. begin
  133. if p_child_sort_key is null then
  134. v_child_sort_key := 0;
  135. else
  136. v_child_sort_key := tree_leaf_key_to_int(p_child_sort_key) + 1;
  137. end if;
  138.  
  139. return int_to_tree_key(v_child_sort_key);
  140. end;$_$;
  141.  
  142.  
  143. ALTER FUNCTION public.tree_increment_key(bit varying) OWNER TO smarlowe;
  144.  
  145.  
  146. CREATE FUNCTION tree_key_to_int(bit varying, integer) RETURNS integer
  147. LANGUAGE plpgsql IMMUTABLE STRICT
  148. AS $_$
  149.  
  150.  
  151. declare
  152. p_tree_key alias for $1;
  153. p_level alias for $2;
  154. v_level integer default 0;
  155. v_parent_pos integer default 1;
  156. v_pos integer default 1;
  157. begin
  158.  
  159. -- Find the right key first
  160. while v_pos < length(p_tree_key) and v_level < p_level loop
  161. v_parent_pos := v_pos;
  162. v_level := v_level + 1;
  163. if substring(p_tree_key, v_pos, 1) = '1' then
  164. v_pos := v_pos + 32;
  165. else
  166. v_pos := v_pos + 8;
  167. end if;
  168. end loop;
  169.  
  170. if v_level < p_level then
  171. raise exception 'tree_key_to_int: key is at a level less than %', p_level;
  172. end if;
  173.  
  174. if substring(p_tree_key, v_parent_pos, 1) = '1' then
  175. return bittoint4(substring(p_tree_key, v_parent_pos + 1, 31));
  176. else
  177. return bittoint4(substring(p_tree_key, v_parent_pos, 8));
  178. end if;
  179.  
  180. end;$_$;
  181.  
  182.  
  183. ALTER FUNCTION public.tree_key_to_int(bit varying, integer) OWNER TO smarlowe;
  184.  
  185.  
  186. CREATE FUNCTION tree_leaf_key_to_int(bit varying) RETURNS integer
  187. LANGUAGE plpgsql IMMUTABLE STRICT
  188. AS $_$
  189.  
  190.  
  191. declare
  192. p_tree_key alias for $1;
  193. v_leaf_pos integer default 1;
  194. v_pos integer default 1;
  195. begin
  196.  
  197. -- Find the leaf key first
  198. while v_pos < length(p_tree_key) loop
  199. v_leaf_pos := v_pos;
  200. if substring(p_tree_key, v_pos, 1) = '1' then
  201. v_pos := v_pos + 32;
  202. else
  203. v_pos := v_pos + 8;
  204. end if;
  205. end loop;
  206.  
  207. if substring(p_tree_key, v_leaf_pos, 1) = '1' then
  208. return bittoint4(substring(p_tree_key, v_leaf_pos + 1, 31));
  209. else
  210. return bittoint4(substring(p_tree_key, v_leaf_pos, 8));
  211. end if;
  212.  
  213. end;$_$;
  214.  
  215.  
  216. ALTER FUNCTION public.tree_leaf_key_to_int(bit varying) OWNER TO smarlowe;
  217.  
  218.  
  219. CREATE FUNCTION tree_left(bit varying) RETURNS bit varying
  220. LANGUAGE plpgsql IMMUTABLE
  221. AS $_$
  222.  
  223.  
  224. declare
  225. key alias for $1;
  226. begin
  227. if key is null then
  228. return 'X00'::varbit;
  229. else
  230. return key || 'X00'::varbit;
  231. end if;
  232. end;$_$;
  233.  
  234.  
  235. ALTER FUNCTION public.tree_left(bit varying) OWNER TO smarlowe;
  236.  
  237.  
  238. CREATE FUNCTION tree_level(bit varying) RETURNS integer
  239. LANGUAGE plpgsql IMMUTABLE
  240. AS $_$
  241.  
  242.  
  243. declare
  244. p_tree_key alias for $1;
  245. v_pos integer;
  246. v_level integer;
  247.  
  248. begin
  249.  
  250. if p_tree_key is null then
  251. return 0;
  252. end if;
  253.  
  254. v_pos := 1;
  255. v_level := 0;
  256.  
  257. while v_pos <= length(p_tree_key) loop
  258. v_level := v_level + 1;
  259. if substring(p_tree_key, v_pos, 1) = '1' then
  260. v_pos := v_pos + 32;
  261. else
  262. v_pos := v_pos + 8;
  263. end if;
  264. end loop;
  265.  
  266. return v_level;
  267. end;$_$;
  268.  
  269.  
  270. ALTER FUNCTION public.tree_level(bit varying) OWNER TO smarlowe;
  271.  
  272.  
  273. CREATE FUNCTION tree_next_key(bit varying, integer) RETURNS bit varying
  274. LANGUAGE plpgsql IMMUTABLE
  275. AS $_$
  276. declare
  277. p_parent_key alias for $1;
  278. p_child_value alias for $2;
  279. v_child_value integer;
  280. begin
  281.  
  282. if p_child_value is null then
  283. v_child_value := 0;
  284. else
  285. v_child_value := p_child_value + 1;
  286. end if;
  287.  
  288. if p_parent_key is null then
  289. return int_to_tree_key(v_child_value);
  290. else
  291. return p_parent_key || int_to_tree_key(v_child_value);
  292. end if;
  293.  
  294. end;$_$;
  295.  
  296.  
  297. ALTER FUNCTION public.tree_next_key(bit varying, integer) OWNER TO smarlowe;
  298.  
  299.  
  300. CREATE FUNCTION tree_right(bit varying) RETURNS bit varying
  301. LANGUAGE plpgsql IMMUTABLE
  302. AS $_$
  303.  
  304.  
  305. declare
  306. key alias for $1;
  307. begin
  308. if key is null then
  309. return 'XFFFFFFFF'::varbit;
  310. else
  311. return key || 'XFFFFFFFF'::varbit;
  312. end if;
  313. end;$_$;
  314.  
  315.  
  316. ALTER FUNCTION public.tree_right(bit varying) OWNER TO smarlowe;
  317.  
  318.  
  319. CREATE FUNCTION tree_root_key(bit varying) RETURNS bit varying
  320. LANGUAGE plpgsql IMMUTABLE STRICT
  321. AS $_$
  322.  
  323.  
  324. declare
  325. p_tree_key alias for $1;
  326. begin
  327.  
  328. if substring(p_tree_key, 1, 1) = '1' then
  329. return substring(p_tree_key, 1, 32);
  330. else
  331. return substring(p_tree_key, 1, 8);
  332. end if;
  333.  
  334. end;$_$;
  335.  
  336.  
  337. ALTER FUNCTION public.tree_root_key(bit varying) OWNER TO smarlowe;
  338.  
  339.  
  340. REVOKE ALL ON SCHEMA public FROM PUBLIC;
  341. REVOKE ALL ON SCHEMA public FROM postgres;
  342. GRANT ALL ON SCHEMA public TO postgres;
  343. GRANT ALL ON SCHEMA public TO PUBLIC;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement