Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Function: create_node(character varying, integer, integer, bigint, character varying, character varying, character varying, character varying, character varying, integer, integer)
- -- DROP FUNCTION create_node(character varying, integer, integer, bigint, character varying, character varying, character varying, character varying, character varying, integer, integer);
- CREATE OR REPLACE FUNCTION create_node(
- ps_table_name character varying,
- pn_user_id integer,
- pn_node_lvl integer,
- pn_parent_node_id bigint,
- ps_column_name character varying,
- ps_column_statement character varying,
- ps_answer_column character varying,
- ps_is_virtual character varying,
- ps_parent_full_statement character varying,
- pn_min_split_cnt integer,
- pn_min_node_cnt integer)
- RETURNS numeric AS
- $BODY$
- -- создаем новый узел дерева
- --ps_table_name -- имя анализируемой таблицы
- --pn_user_id -- идентификатор пользователя
- --pn_node_lvl -- уровень узла
- --pn_parent_node_id -- id родительского узла
- --ps_column_name -- имя параметра (столбца) на которое накладывается условие column_statement
- --ps_column_statement varchar -- значение при равенстве которому будет осуществляться выбор этого узла
- --ps_answer_column -- название столбца в котором содержится классификация
- --ps_is_virtual - создаем ноду или только считаем по ней статистику? 'Y' - только статистика, 'N' - создаем
- --ps_parent_full_statement - условия для select полностью определяющие родительскую вершину
- --pn_min_split_cnt - вершины такого и меньшего размера алгоритм не пытается дальше делить
- --pn_min_node_cnt - число частиц объектов, после которого вершина не создается
- DECLARE
- new_id bigint;
- full_statement varchar(4000);
- node_stat_record RECORD;
- tmp_step integer;
- BEGIN
- new_id:=nextval('SEQtree_nodes');
- -- получим условие на дереве полностью определяющее данные этой вершины
- --if ps_column_statement is null then ps_column_statement:=''; end if;
- if ps_column_statement is not null then
- full_statement:=ps_parent_full_statement||' and '||ps_column_name||'='''||ps_column_statement||'''';
- else
- full_statement:=ps_parent_full_statement||' and '||ps_column_name||' is null';
- end if;
- -- занесем статистику по ноде в таблицу и получим данные для занесеня в текущую таблицу
- node_stat_record:=create_node_stat(ps_table_name,
- ps_answer_column,
- new_id,
- full_statement);
- 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;
- -- занесем данные по ноде в таблицу
- if ps_is_virtual='N' then
- if node_stat_record.pn_full_cnt>pn_min_node_cnt then -- не заносим в таблицу слишком маленькие ноды. фактически, постпрунинг по правилу 70/30 на этапе классификации. и, надеюсь, оптимизация производительности
- 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)
- values (new_id, ps_table_name, pn_user_id, pn_node_lvl, pn_parent_node_id, ps_column_name,
- node_stat_record.ps_default_value,
- node_stat_record.pn_full_cnt,
- node_stat_record.pn_main_class_count,
- node_stat_record.pn_entropy,
- tmp_step,ps_column_statement);
- end if;
- end if;
- /*if node_stat_record.pn_entropy is null or node_stat_record.pn_full_cnt is null then
- RAISE EXCEPTION 'тест 66: это произошло! % % % % %' ,node_stat_record.pn_entropy,node_stat_record.pn_full_cnt,ps_table_name,ps_answer_column,full_statement ;
- end if;*/
- return node_stat_record.pn_entropy*node_stat_record.pn_full_cnt; -- вернем энтропию вершины домноженую на количество объектов в подгруппе
- END;
- $BODY$
- LANGUAGE plpgsql VOLATILE
- COST 100;
- ALTER FUNCTION create_node(character varying, integer, integer, bigint, character varying, character varying, character varying, character varying, character varying, integer, integer)
- OWNER TO postgres;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement