Advertisement
Guest User

Untitled

a guest
May 24th, 2015
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.20 KB | None | 0 0
  1. -- Function: get_clssfctn_by_node_id(bigint, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying)
  2.  
  3. -- DROP FUNCTION get_clssfctn_by_node_id(bigint, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying);
  4.  
  5. CREATE OR REPLACE FUNCTION get_clssfctn_by_node_id(
  6. pn_node_id bigint,
  7. ps_if character varying,
  8. ps_equal character varying,
  9. ps_endif character varying,
  10. ps_closeif character varying,
  11. ps_comment character varying,
  12. ps_assign_close character varying,
  13. ps_assign character varying,
  14. ps_quote character varying,
  15. ps_indent character varying,
  16. ps_cur_indent character varying,
  17. ps_result_name character varying,
  18. ps_entr character varying,
  19. v_is_null_str character varying)
  20. RETURNS text AS
  21. $BODY$
  22. -- по номеру ноды находим ее дочерние и строим для каждой из них рекурсивно текст классификатора
  23. DECLARE
  24. tmp_txt text;
  25. tmp_txt2 text;
  26. result_name varchar default 'result';
  27. vn_id bigint;
  28. vs_default_value varchar;
  29. vn_count integer;
  30. vn_entropy numeric;
  31. vs_column_name varchar;
  32. vs_c_ststement varchar;
  33. vs_last_str varchar;
  34. vs_first_str varchar;
  35. pn_main_class_count integer;
  36. BEGIN
  37. tmp_txt:='';
  38.  
  39. for vn_id, vs_default_value, vn_count, vn_entropy, vs_column_name, vs_c_ststement, vs_last_str, vs_first_str, pn_main_class_count in
  40. select id, tn.default_value, rcount, rentropy, column_name, column_statement,
  41. lead(id,1,'-1') over(order by tn.column_statement),
  42. lag(id,1,'-1') over(order by tn.column_statement),
  43. main_class_count
  44. from tree_nodes tn
  45. where tn.parent_node_id=pn_node_id
  46. order by tn.column_statement
  47. loop
  48. if vs_first_str='-1' then tmp_txt:=tmp_txt||ps_cur_indent||ps_entr; end if; -- сделаем пробел перед if-ами. так код легче читается
  49.  
  50. -- как нужно описывать равенство при выводе текста кода. добавлена обработка null значений
  51. if v_is_null_str is null then -- если никакой явной обработки null значений не предусмотрено, считаем их раыными пустой строке
  52. if vs_c_ststement is null then vs_c_ststement:=''; end if;
  53. tmp_txt2:=vs_column_name||ps_equal||ps_quote||vs_c_ststement||ps_quote;
  54. else -- иначе вставляем строку обозначающую эти самые null значения
  55. if vs_c_ststement is null then
  56. -- если случился null
  57. tmp_txt2:=vs_column_name||' '||v_is_null_str;
  58. else
  59. -- если null не случился (самая обычная строка)
  60. tmp_txt2:=vs_column_name||ps_equal||ps_quote||vs_c_ststement||ps_quote;
  61. end if;
  62. end if;
  63.  
  64. tmp_txt:=tmp_txt||ps_cur_indent||ps_if||' '||tmp_txt2||' '||ps_endif||ps_entr;
  65. -- откажемся от энтропии в пользу числачастиц
  66. tmp_txt:=tmp_txt||ps_cur_indent||ps_indent||result_name||ps_assign||ps_quote||vs_default_value||ps_quote||ps_assign_close||ps_comment||'count='||vn_count||'; main class '||cast(cast(pn_main_class_count as numeric)/vn_count*100 as numeric(10,1))||'%'||ps_entr;
  67.  
  68.  
  69. -- сделаем рекурсивный вызов для дочерних нод
  70. tmp_txt:=tmp_txt||get_clssfctn_by_node_id (vn_id,
  71. ps_if,
  72. ps_equal,
  73. ps_endif,
  74. ps_closeif,
  75. ps_comment,
  76. ps_assign_close,
  77. ps_assign,
  78. ps_quote,
  79. ps_indent,
  80. ps_cur_indent||ps_indent,
  81. ps_result_name,
  82. ps_entr,
  83. v_is_null_str);
  84.  
  85. tmp_txt:=tmp_txt||ps_cur_indent||ps_closeif||ps_entr;
  86. if vs_last_str<>'-1' then tmp_txt:=tmp_txt||ps_entr; end if;-- если строка не последняя - добавим разделение между if-ами
  87. end loop;
  88.  
  89. RETURN tmp_txt;
  90. END;
  91. $BODY$
  92. LANGUAGE plpgsql VOLATILE
  93. COST 100;
  94. ALTER FUNCTION get_clssfctn_by_node_id(bigint, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying, character varying)
  95. OWNER TO postgres;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement