[BACK]Return to crud_node.psql CVS log [TXT][DIR] Up to [pgFoundry] / pgtreelib / pgtreelib / src / main

Diff for /pgtreelib/pgtreelib/src/main/crud_node.psql between version 1.7 and 1.8

version 1.7, 2008/09/11 05:39:24 version 1.8, 2008/09/11 15:46:50
Line 48  CREATE OR REPLACE FUNCTION  %%_util.add_
Line 48  CREATE OR REPLACE FUNCTION  %%_util.add_
    r.node_sn := p_node_sn;     r.node_sn := p_node_sn;
    r.node_name := arg_node_name;     r.node_name := arg_node_name;
   
    insert into %%_util.tree_node ( id , node_sn, node_data_id , weight ,  internal_weight, tree_id, node_name,lft,rgt, level)     insert into %%_util.tree_node ( id , node_sn, node_data_id , weight ,  internal_weight, tree_id, node_name,lft,rgt, level,ntype)
    values (r.id, r.node_sn, r.node_data_id, r.weight,  r.internal_weight, r.tree_id ,r.node_name,1,2,0 );     values (r.id, r.node_sn, r.node_data_id, r.weight,  r.internal_weight, r.tree_id ,r.node_name,1,2,0,0 );
   
    rep :=  %%_util.unode_to_node(r);     rep :=  %%_util.unode_to_node(r);
    return rep;     return rep;
Line 92  CREATE OR REPLACE FUNCTION  %%.add_orpha
Line 92  CREATE OR REPLACE FUNCTION  %%.add_orpha
  END   END
  $$ VOLATILE LANGUAGE plpgsql;   $$ VOLATILE LANGUAGE plpgsql;
   
  ---------------------------------------------------------------------------  
  --  
  ---------------------------------------------------------------------------  
   
 CREATE OR REPLACE FUNCTION  %%.add_named_orphan_node(arg_tree_name varchar, arg_node_name varchar, arg_node_data bigint, arg_node_weight double precision) RETURNS %%.tree_node AS $$  
  DECLARE  
  r %%.tree_node;  
  tmp boolean;  
  BEGIN  
         r := %%.add_orphan_node(arg_tree_name  ,arg_node_data , arg_node_weight);  
         if (r.id is null) then  
                 return r;  
         end if;  
   
         tmp := %%.set_node_name(r.id , arg_node_name);  
         if (tmp = false) then  
                 RAISE EXCEPTION 'UNEXPECTED ERROR CANOT SET NAME TO NODE';  
         end if;  
   
         r.node_name := arg_node_name;  
         return r;  
  END  
  $$ VOLATILE LANGUAGE plpgsql;  
   
   
  ---------------------------------------------------------------------------   ---------------------------------------------------------------------------
Line 166  BEGIN
Line 144  BEGIN
  END   END
  $$ VOLATILE LANGUAGE plpgsql;   $$ VOLATILE LANGUAGE plpgsql;
   
   
  ---------------------------------------------------------------------------   ---------------------------------------------------------------------------
  --   --
  ---------------------------------------------------------------------------   ---------------------------------------------------------------------------
   
   CREATE OR REPLACE FUNCTION  %%.add_named_orphan_node(arg_tree_name varchar, arg_node_name varchar, arg_node_data bigint, arg_node_weight double precision) RETURNS %%.tree_node AS $$
    DECLARE
    r %%.tree_node;
    tmp boolean;
    BEGIN
           r := %%.add_orphan_node(arg_tree_name  ,arg_node_data , arg_node_weight);
           if (r.id is null) then
                   return r;
           end if;
   
           tmp := %%.set_node_name(r.id , arg_node_name);
           if (tmp = false) then
                   RAISE EXCEPTION 'UNEXPECTED ERROR CANOT SET NAME TO NODE';
           end if;
   
           r.node_name := arg_node_name;
           return r;
    END
    $$ VOLATILE LANGUAGE plpgsql;
    ---------------------------------------------------------------------------
    --
    ---------------------------------------------------------------------------
   
   CREATE OR REPLACE FUNCTION  %%.add_named_sn_orphan_node(arg_tree_name varchar, arg_node_name varchar, arg_node_sn bigint, arg_node_data bigint, arg_node_weight double precision) RETURNS %%.tree_node AS $$
    DECLARE
    r %%.tree_node;
    tmp boolean;
    BEGIN
           r := %%.add_orphan_sn_node(arg_tree_name, arg_node_sn,arg_node_data , arg_node_weight);
           if (r.id is null) then
                   return r;
           end if;
   
           tmp := %%.set_node_name(r.id , arg_node_name);
           if (tmp = false) then
                   RAISE EXCEPTION 'UNEXPECTED ERROR CANOT SET NAME TO NODE';
           end if;
   
           r.node_name := arg_node_name;
           return r;
    END
    $$ VOLATILE LANGUAGE plpgsql;
   
    ---------------------------------------------------------------------------
    --
    ---------------------------------------------------------------------------
  CREATE OR REPLACE FUNCTION  %%.set_root_node(arg_node bigint) RETURNS boolean AS $$   CREATE OR REPLACE FUNCTION  %%.set_root_node(arg_node bigint) RETURNS boolean AS $$
  DECLARE   DECLARE
         rec1 RECORD;          rec1 RECORD;
Line 187  BEGIN
Line 211  BEGIN
    end if;     end if;
   
    if %%_util.get_root_id(rec1.tree_id) is not null then     if %%_util.get_root_id(rec1.tree_id) is not null then
                 RAISE NOTICE 'TREE HAS ALLREDY ROOT NODE %' ,  %%_util.get_root_id(rec1.tree_id);                  --RAISE NOTICE 'TREE HAS ALLREDY ROOT NODE %' ,  %%_util.get_root_id(rec1.tree_id);
                   --update %%_util.tree_node SET root = 0  WHERE id = rec1.tree_id;
             return false;              return false;
    end if;     end if;
   
    if rec1.parent_id is not null then     --if rec1.parent_id is not null then
                 RAISE NOTICE 'NODE % IS NOT ORPHAN ',arg_node ;     --           RAISE NOTICE 'NODE % IS NOT ORPHAN ',arg_node ;
                 return false;     --           return false;
    end if;     --end if;
   
    if rec1.level !=0 then     --if rec1.level !=0 then
                 RAISE NOTICE 'NODE % IS NOT ORPHAN ',arg_node ;     --           RAISE NOTICE 'NODE % IS NOT ORPHAN ',arg_node ;
                 return false;     --           return false;
    end if;    -- end if;
   
         --update %%_util.tree_node SET level = 0  WHERE id = arg_node;          --update %%_util.tree_node SET level = 0  WHERE id = arg_node;
         update %%_util.tree_node SET ntype = 1  WHERE id = arg_node;          update %%_util.tree_node SET root = 1  WHERE id = arg_node;
   
         return true;          return true;
  END   END
Line 317  BEGIN
Line 342  BEGIN
         rec1 RECORD;          rec1 RECORD;
  BEGIN   BEGIN
         if (arg_node is null) then          if (arg_node is null) then
                 RAISE NOTICE 'arg_node IS MANTATORY';                  RAISE EXCEPTION 'arg_node IS MANTATORY';
         end if;          end if;
   
         update %%_util.tree_node set node_data_id = arg_node_data_id WHERE id = arg_node;          update %%_util.tree_node set node_data_id = arg_node_data_id WHERE id = arg_node;
Line 341  BEGIN
Line 366  BEGIN
         rec1 RECORD;          rec1 RECORD;
  BEGIN   BEGIN
         if (arg_node is null) then          if (arg_node is null) then
                 RAISE NOTICE 'arg_node IS MANTATORY';                  RAISE EXCEPTION 'arg_node IS MANTATORY';
         end if;          end if;
   
    SELECT INTO rec1 tn.level, tn.tree_id, tn.parent_id , tn.ntype     SELECT INTO rec1 tn.level, tn.tree_id, tn.parent_id , tn.ntype
Line 351  BEGIN
Line 376  BEGIN
                 return false;                  return false;
    end if;     end if;
   
    if rec1.parent_id is not null then     --if rec1.parent_id is not null then
                 RAISE NOTICE 'NODE % IS NOT ROOT',arg_node;     --           RAISE NOTICE 'NODE % IS NOT ROOT',arg_node;
                 return false;     --           return false;
    end if;     --end if;
   
    if rec1.ntype !=1  then     if rec1.root !=1  then
                 RAISE NOTICE 'NODE % IS NOT ROOT',arg_node;                  RAISE NOTICE 'NODE % IS NOT ROOT',arg_node;
                 return false;                  return false;
    end if;     end if;
   
   
    if rec1.level != 0 then     --if rec1.level != 0 then
                 RAISE NOTICE 'NODE % IS NOT ROOT',arg_node;     --           RAISE NOTICE 'NODE % IS NOT ROOT',arg_node;
                 return false;     --           return false;
    end if;     --end if;
   
         --update %%_util.tree_node SET level = null  WHERE id = arg_node;          --update %%_util.tree_node SET level = null  WHERE id = arg_node;
   
         update %%_util.tree_node SET ntype = 0  WHERE id = arg_node;          update %%_util.tree_node SET root = 0  WHERE id = arg_node;
   
         return true;          return true;
  END   END
  $$ VOLATILE LANGUAGE plpgsql;   $$ VOLATILE LANGUAGE plpgsql;
   
   
    CREATE OR REPLACE FUNCTION  %%.unset_root_node(arg_tree_name varchar) RETURNS boolean AS $$
    DECLARE
           rec1 RECORD;
           p_n_id bigint;
    BEGIN
           if (arg_tree_name is null) then
                   RAISE EXCEPTION 'arg_tree_name IS MANTATORY';
                   --return false;
           end if;
   
           p_n_id := %%_util.get_tree_id(arg_tree_name);
           if (p_n_id is null) then
                   return false;
           end if;
   
   
           update %%_util.tree_node SET root = 0  WHERE id = p_n_id;
   
           return true;
    END
    $$ VOLATILE LANGUAGE plpgsql;
   
  ---------------------------------------------------------------------------   ---------------------------------------------------------------------------
  --   --
Line 403  CREATE OR REPLACE FUNCTION  %%.set_paren
Line 449  CREATE OR REPLACE FUNCTION  %%.set_paren
         p_a2 bigint;          p_a2 bigint;
         p_si_p bigint;          p_si_p bigint;
         p_n bigint;          p_n bigint;
           p_parent_id_p bigint;
         rec record;          rec record;
           p_ntype integer;
   
  BEGIN   BEGIN
     --RAISE NOTICE 'set_parentship % %',arg_parent_node, arg_child_node;      --RAISE NOTICE 'set_parentship % %',arg_parent_node, arg_child_node;
Line 415  CREATE OR REPLACE FUNCTION  %%.set_paren
Line 463  CREATE OR REPLACE FUNCTION  %%.set_paren
         end if;          end if;
   
    --stixia parent_node kai tis ikogenias pou ine parent     --stixia parent_node kai tis ikogenias pou ine parent
    SELECT INTO rec1 tn.level, tn.tree_id, tn.node_sn, tn.rgt, tn.lft,tn.set_id  FROM %%_util.tree_node tn WHERE tn.id = arg_parent_node;     SELECT INTO rec1 tn.level, tn.tree_id, tn.node_sn, tn.rgt, tn.lft,tn.set_id, tn.parent_id  FROM %%_util.tree_node tn WHERE tn.id = arg_parent_node;
         if not found then          if not found then
                 RAISE NOTICE 'CANOT FOUND PARENT NODE %',arg_parent_node ;                  RAISE NOTICE 'CANOT FOUND PARENT NODE %',arg_parent_node ;
                 return false;                  return false;
Line 426  CREATE OR REPLACE FUNCTION  %%.set_paren
Line 474  CREATE OR REPLACE FUNCTION  %%.set_paren
    p_rgt_p := rec1.rgt;     p_rgt_p := rec1.rgt;
    p_lft_p := rec1.lft;     p_lft_p := rec1.lft;
    p_si_p := rec1.set_id;     p_si_p := rec1.set_id;
      p_parent_id_p := rec1.parent_id;
   
    --if p_level is null then     --if p_level is null then
    --   return false;     --   return false;
    --end if;     --end if;
   
    --stixia child_node     --stixia child_node
    SELECT INTO rec1  tn.level, tn.tree_id, tn.internal_weight, tn.weight, tn.lft, tn.rgt, tn.set_id, tn.parent_id  FROM %%_util.tree_node tn WHERE tn.id = arg_child_node;     SELECT INTO rec1  tn.level, tn.tree_id, tn.internal_weight, tn.weight, tn.lft, tn.rgt, tn.set_id, tn.parent_id, tn.ntype  FROM %%_util.tree_node tn WHERE tn.id = arg_child_node;
         if not found then          if not found then
                 RAISE NOTICE 'CANOT FOUND CHILD NODE %',arg_child_node ;                  RAISE NOTICE 'CANOT FOUND CHILD NODE %',arg_child_node ;
                 return false;                  return false;
Line 452  CREATE OR REPLACE FUNCTION  %%.set_paren
Line 501  CREATE OR REPLACE FUNCTION  %%.set_paren
   
    p_internal_weight := rec1.internal_weight;     p_internal_weight := rec1.internal_weight;
    p_weight := rec1.weight;     p_weight := rec1.weight;
      p_ntype := rec1.ntype;
   
    -- ipologismos sta8eras gia ta update ton rgt lft     -- ipologismos sta8eras gia ta update ton rgt lft
    p_a1 := p_lft_p;     p_a1 := p_lft_p;
Line 470  CREATE OR REPLACE FUNCTION  %%.set_paren
Line 520  CREATE OR REPLACE FUNCTION  %%.set_paren
    ---------------     ---------------
    ---------------     ---------------
   
   
     -- update (lft,rgt) nodes releted to parent      -- update (lft,rgt) nodes releted to parent
         p_n := rec1.rgt;          p_n := rec1.rgt;
   
         --RAISE NOTICE 'PARENT RELATED UPDATES %',p_n;          --RAISE NOTICE 'PARENT RELATED UPDATES %',p_n;
           --update %%_util.tree_node
           --set
           --rgt = rgt + p_n,
           --lft = CASE WHEN  lft > p_lft_p THEN  lft + p_n ELSE lft END,
           --ntype = CASE WHEN id = arg_parent_node THEN      CASE WHEN p_parent_id_p is null THEN 1 ELSE 2 END       ELSE ntype END  --alagi type parent node
           --WHERE set_id = p_si_p and rgt > p_a1;
   
       --update  parent node
           update %%_util.tree_node
           set
           rgt = rgt + p_n,
           ntype = CASE WHEN p_parent_id_p is null THEN 1 ELSE 2 END
           WHERE id = arg_parent_node;
   
       --update rest parent related nodes
         update %%_util.tree_node          update %%_util.tree_node
         set          set
         rgt = rgt + p_n,          rgt = rgt + p_n,
         lft = CASE WHEN  lft > p_lft_p THEN  lft + p_n ELSE lft END          lft = CASE WHEN  lft > p_lft_p THEN  lft + p_n ELSE lft END
         WHERE set_id = p_si_p and rgt > p_a1;          WHERE set_id = p_si_p and rgt > p_a1 and id != arg_parent_node;
   
         --if p_level is not null then  
                 p_level = p_level + 1;          p_level = p_level + 1;
         --end if;  
   
     -- update (lft,rgt)  nodes related to child      -- update (lft,rgt)  nodes related to child
         p_n := p_a1;          p_n := p_a1;
Line 491  CREATE OR REPLACE FUNCTION  %%.set_paren
Line 557  CREATE OR REPLACE FUNCTION  %%.set_paren
         set_id = p_si_p,          set_id = p_si_p,
         lft = lft + p_n,          lft = lft + p_n,
         rgt = rgt + p_n,          rgt = rgt + p_n,
         level = p_level          level = level + p_level
         where          where
         set_id = rec1.set_id and lft > rec1.lft;          set_id = rec1.set_id and lft > rec1.lft;
   
Line 503  CREATE OR REPLACE FUNCTION  %%.set_paren
Line 569  CREATE OR REPLACE FUNCTION  %%.set_paren
   
         --update arg_child_node          --update arg_child_node
         update %%_util.tree_node          update %%_util.tree_node
         SET level = p_level, parent_id = arg_parent_node ,  parent_sn = p_node_sn_p, lft = p_lft, rgt = p_rgt, set_id = p_si_p          SET level = p_level, parent_id = arg_parent_node ,  parent_sn = p_node_sn_p, lft = p_lft, rgt = p_rgt, set_id = p_si_p,
           ntype= CASE WHEN p_ntype = 0 THEN 3 ELSE 2 END
         WHERE id = arg_child_node;          WHERE id = arg_child_node;
   
         --level          --level
Line 668  BEGIN
Line 735  BEGIN
   
  CREATE OR REPLACE FUNCTION  %%.make_orphan_node(arg_node bigint) RETURNS boolean AS $$   CREATE OR REPLACE FUNCTION  %%.make_orphan_node(arg_node bigint) RETURNS boolean AS $$
  DECLARE   DECLARE
         rec1 RECORD;          rec_c RECORD;
           rec_p RECORD;
           p_lr_diff_c bigint;
           p_lr_diff_p bigint;
           p_level_diff_c integer;
           p_set_id_c bigint;
           rec record;
           p_child_cound_p integer;
  BEGIN   BEGIN
   
    if (arg_node is null) then     if (arg_node is null) then
                 RAISE NOTICE 'arg_node IS MANTATORY';                  RAISE NOTICE 'arg_node IS MANTATORY';
    end if;     end if;
   
    SELECT INTO rec1 tn.level, tn.tree_id, tn.parent_id     -- CHILD NODE
      SELECT INTO rec_c tn.level, tn.tree_id, tn.parent_id, tn.lft, tn.rgt, tn.set_id
    FROM %%_util.tree_node tn WHERE tn.id = arg_node;     FROM %%_util.tree_node tn WHERE tn.id = arg_node;
    if not found then     if not found then
         RAISE NOTICE 'arg_node % NOT FOUND',arg_node ;          RAISE NOTICE 'arg_node % NOT FOUND',arg_node ;
                 return false;                  return false;
    end if;     end if;
   
      --PARENT NODE
      --SELECT INTO rec_c tn.level, tn.tree_id, tn.parent_id, tn.lft, tn.rgt, tn.set_id
      --FROM %%_util.tree_node tn WHERE tn.id = parent_id;
      --if not found then
      --     RAISE NOTICE 'UNEXPECTED ERROR: parent node % NOT FOUND',parent_id ;
      --           return false;
      --end if;
      select into rec count(*) FROM %%_util.tree_node WHERE parent_id = rec_c.parent_id;
      p_child_cound_p := rec.count;
   
   
       --constants for update detached tree
       p_lr_diff_c := rec_c.lft -1;
       p_level_diff_c := rec_c.level;
       p_set_id_c := nextval('%%_util.tree_node_set_id_seq');
   
       --constants for update main tree
       p_lr_diff_p := rec_c.rgt - rec_c.lft + 1;
   
       --update detached tree
       update %%_util.tree_node
       set
       lft = lft - p_lr_diff_c,
       rgt = rgt - p_lr_diff_c,
       level = level - p_level_diff_c,
       set_id = p_set_id_c
       WHERE set_id = rec_c.set_id and lft > rec_c.lft and rgt < rec_c.rgt;
   
       -- update detached node
           update %%_util.tree_node SET
           ntype = CASE WHEN lft = rgt -1 THEN 0 ELSE 1 END,
           set_id = p_set_id_c, level = 0, parent_id = null, parent_sn = null,
           lft = 1, rgt = rgt - p_lr_diff_c  WHERE id = arg_node;
   
       --update main tree (without parent_node
       update %%_util.tree_node
           set
           rgt = rgt - p_lr_diff_p,
           lft = CASE WHEN  lft > rec_c.rgt THEN  lft - p_lr_diff_p  ELSE lft END
           WHERE set_id = rec_c.set_id and rgt > rec_c.rgt and id != rec_c.parent_id ;
   
   
   
            --update parent_node
            --p_child_cound_p ari8mos pedion prin tin aferesi.. torinos ari8mos = p_child_cound_p - 1
           update %%_util.tree_node
           set
           rgt = rgt - p_lr_diff_p,
           ntype = CASE WHEN ntype = 1 THEN  (CASE WHEN p_child_cound_p = 1 THEN 0 ELSE 1 END)  ELSE  (CASE WHEN p_child_cound_p = 1 THEN 3 ELSE 2 END)   END
           WHERE  id = rec_c.parent_id ;
   
         update %%_util.tree_node SET level = null, parent_id = null, parent_sn = null  WHERE id = arg_node;  
   
         return true;          return true;
   
    END
    $$ VOLATILE LANGUAGE plpgsql;
   
   
     CREATE OR REPLACE FUNCTION  %%.make_orphan_node_sn(arg_tree_name varchar, arg_node_sn bigint) RETURNS boolean AS $$
    DECLARE
           p_id bigint;
           rep boolean;
    BEGIN
           p_id := %%_util.get_tree_node_id(arg_tree_name,arg_node_sn);
       rep := %%.make_orphan_node(p_id);
           return rep;
  END   END
  $$ VOLATILE LANGUAGE plpgsql;   $$ VOLATILE LANGUAGE plpgsql;
   

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.8

PgFoundry-cvsweb <pgfoundry-cvsweb@pgFoundry.org>