Advertisement
Guest User

Untitled

a guest
May 24th, 2015
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.82 KB | None | 0 0
  1. -- Function: create_node(character varying, integer, integer, bigint, character varying, character varying, character varying, character varying, character varying, integer, integer)
  2.  
  3. -- DROP FUNCTION create_node(character varying, integer, integer, bigint, character varying, character varying, character varying, character varying, character varying, integer, integer);
  4.  
  5. CREATE OR REPLACE FUNCTION create_node(
  6. ps_table_name character varying,
  7. pn_user_id integer,
  8. pn_node_lvl integer,
  9. pn_parent_node_id bigint,
  10. ps_column_name character varying,
  11. ps_column_statement character varying,
  12. ps_answer_column character varying,
  13. ps_is_virtual character varying,
  14. ps_parent_full_statement character varying,
  15. pn_min_split_cnt integer,
  16. pn_min_node_cnt integer)
  17. RETURNS numeric AS
  18. $BODY$
  19. -- создаем новый узел дерева
  20. --ps_table_name -- имя анализируемой таблицы
  21. --pn_user_id -- идентификатор пользователя
  22. --pn_node_lvl -- уровень узла
  23. --pn_parent_node_id -- id родительского узла
  24. --ps_column_name -- имя параметра (столбца) на которое накладывается условие column_statement
  25. --ps_column_statement varchar -- значение при равенстве которому будет осуществляться выбор этого узла
  26. --ps_answer_column -- название столбца в котором содержится классификация
  27. --ps_is_virtual - создаем ноду или только считаем по ней статистику? 'Y' - только статистика, 'N' - создаем
  28. --ps_parent_full_statement - условия для select полностью определяющие родительскую вершину
  29. --pn_min_split_cnt - вершины такого и меньшего размера алгоритм не пытается дальше делить
  30. --pn_min_node_cnt - число частиц объектов, после которого вершина не создается
  31. DECLARE
  32. new_id bigint;
  33. full_statement varchar(4000);
  34. node_stat_record RECORD;
  35. tmp_step integer;
  36. BEGIN
  37. new_id:=nextval('SEQtree_nodes');
  38.  
  39. -- получим условие на дереве полностью определяющее данные этой вершины
  40. --if ps_column_statement is null then ps_column_statement:=''; end if;
  41. if ps_column_statement is not null then
  42. full_statement:=ps_parent_full_statement||' and '||ps_column_name||'='''||ps_column_statement||'''';
  43. else
  44. full_statement:=ps_parent_full_statement||' and '||ps_column_name||' is null';
  45. end if;
  46.  
  47.  
  48. -- занесем статистику по ноде в таблицу и получим данные для занесеня в текущую таблицу
  49. node_stat_record:=create_node_stat(ps_table_name,
  50. ps_answer_column,
  51. new_id,
  52. full_statement);
  53.  
  54. if node_stat_record.pn_entropy = 0 or node_stat_record.pn_full_cnt<=pn_min_split_cnt then tmp_step:=3; else tmp_step:=1; end if;
  55.  
  56. -- занесем данные по ноде в таблицу
  57. if ps_is_virtual='N' then
  58. if node_stat_record.pn_full_cnt>pn_min_node_cnt then -- не заносим в таблицу слишком маленькие ноды. фактически, постпрунинг по правилу 70/30 на этапе классификации. и, надеюсь, оптимизация производительности
  59. insert into tree_nodes (id, table_name, user_id, node_lvl, parent_node_id, column_name, default_value, rcount, main_class_count, rentropy, step, column_statement)
  60. values (new_id, ps_table_name, pn_user_id, pn_node_lvl, pn_parent_node_id, ps_column_name,
  61. node_stat_record.ps_default_value,
  62. node_stat_record.pn_full_cnt,
  63. node_stat_record.pn_main_class_count,
  64. node_stat_record.pn_entropy,
  65. tmp_step,ps_column_statement);
  66. end if;
  67. end if;
  68.  
  69. /*if node_stat_record.pn_entropy is null or node_stat_record.pn_full_cnt is null then
  70. RAISE EXCEPTION 'тест 66: это произошло! % % % % %' ,node_stat_record.pn_entropy,node_stat_record.pn_full_cnt,ps_table_name,ps_answer_column,full_statement ;
  71. end if;*/
  72. return node_stat_record.pn_entropy*node_stat_record.pn_full_cnt; -- вернем энтропию вершины домноженую на количество объектов в подгруппе
  73.  
  74. END;
  75. $BODY$
  76. LANGUAGE plpgsql VOLATILE
  77. COST 100;
  78. ALTER FUNCTION create_node(character varying, integer, integer, bigint, character varying, character varying, character varying, character varying, character varying, integer, integer)
  79. OWNER TO postgres;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement