]> git.llucax.com Git - z.facultad/75.52/treemulator.git/commitdiff
Join de nodos cuando el padre en la raiz.
authorRicardo Markiewicz <rmarkie@fi.uba.ar>
Mon, 17 Oct 2005 03:48:27 +0000 (03:48 +0000)
committerRicardo Markiewicz <rmarkie@fi.uba.ar>
Mon, 17 Oct 2005 03:48:27 +0000 (03:48 +0000)
src/btree.cpp
src/btree.h

index 7c7a46bdbb674c315e1e9fae69ea93c637aed1ad..e747fb670621f5a868e70e5dcaf87ebe2439b095 100644 (file)
@@ -501,6 +501,16 @@ void BTree::DelKeyFromLeaf (Clave *k, uint node_num, uint padre)
                        node_keys.push_back (new BTreeLeafData (pedida));
                } else {
                        std::cout << "NADIE ME PUEDE PRESTAR, FUNDIR NODOS\n";
+                       uint join1, join2;
+                       if (hi != 0) {
+                               join1 = hi;
+                               join2 = node_num;
+                       } else {
+                               join1 = node_num;
+                               join2 = hd;
+                       }
+
+                       JoinNodes (join1, join2, padre);
                        return;
                }
 
@@ -513,7 +523,78 @@ void BTree::DelKeyFromLeaf (Clave *k, uint node_num, uint padre)
        delete [] node;
        std::cout << "Borrado de una hoja listo\n";
 }
+
+void BTree::JoinNodes (uint node1, uint node2, uint padre)
+{
+       uchar *n1, *n2, *npadre;
+       BTreeNodeHeader nh1, nh2, nhp;
+       std::list<BTreeData *> nk1, nk2, nkpadre;
+
+       /* Leo los nodos */
+       n1 = ReadBlock (node1);
+       n2 = ReadBlock (node2);
+       npadre = ReadBlock (padre);
+
+       ReadNodoHeader (n1, &nh1);
+       ReadNodoHeader (n2, &nh2);
+       ReadNodoHeader (npadre, &nhp);
+
+       nk1 = ReadKeys (n1, nh1);
+       nk2 = ReadKeys (n2, nh2);
+       nkpadre = ReadKeys (npadre, nhp);
+
+       /* Busco la clave a juntar con los nodos */
+       std::list<BTreeData *>::iterator it = nkpadre.begin ();
        
+       Clave *cpadre;
+       BTreeData *lchild = (*it++);
+
+       if (lchild->getChild () == node1) {
+               cpadre = (*it)->getClave ();
+       } else {
+               while (it != nkpadre.end ()) {
+                       if ((*it)->getChild () == node1)
+                               break;
+                       it++;
+               }
+               cpadre = (*it)->getClave ();
+       }
+
+       std::list<BTreeData *> newkeys;
+       std::list<BTreeData *>::iterator i;
+
+       i = nk1.begin ();
+       while (i != nk1.end ()) {
+               newkeys.push_back ( new BTreeLeafData ((*i)->getClave ()->Clone ()));
+               i++;
+       }
+       if (cpadre)
+               newkeys.push_back ( new BTreeLeafData (cpadre->Clone ()));
+       i = nk2.begin ();
+       while (i != nk2.end ()) {
+               newkeys.push_back ( new BTreeLeafData ((*i)->getClave ()->Clone ()));
+               i++;
+       }
+
+       if (padre == 0) {
+               nhp.level = 0;
+               WriteKeys (npadre, nhp, newkeys);
+               WriteNodoHeader (npadre, &nhp);
+               WriteBlock (npadre, padre);
+       } else {
+               std::cout << "TODO : Fundir en NO PADRE" << std::endl;
+       }
+
+       DeleteKeys (nk1);
+       DeleteKeys (nk2);
+       DeleteKeys (nkpadre);
+       DeleteKeys (newkeys);
+
+       delete [] n1;
+       delete [] n2;
+       delete [] npadre;
+}
+
 Clave *BTree::GetKey (uint node_num, char maxmin)
 {
        if (node_num == 0) return NULL;
@@ -531,6 +612,18 @@ Clave *BTree::GetKey (uint node_num, char maxmin)
        if (node_header.level != 0) it++;
 
        Clave *k;
+       uint free = node_header.free_space + (*it)->Size ();
+       if (free > (header.block_size/2)) {
+               WriteKeys (node, node_header, node_keys);
+               WriteNodoHeader (node, &node_header);
+               WriteBlock (node, node_num);
+               DeleteKeys (node_keys);
+       
+               delete [] node;
+
+               return NULL;
+       }
+
        if (maxmin == 0) {
                k = (*it)->getClave ()->Clone ();
                node_keys.erase (it);
@@ -546,6 +639,8 @@ Clave *BTree::GetKey (uint node_num, char maxmin)
        WriteBlock (node, node_num);
        DeleteKeys (node_keys);
 
+       delete [] node;
+
        return k;
 }
 
index 861b535c7f10ef26692460df8223698be521fe98..ec819032002b6eb06f504b90573c8b1629900d3e 100644 (file)
@@ -153,6 +153,7 @@ class BTree {
                void FindBrothers (uint node_num, uint padre, uint &left, uint &right);
                Clave *ReplaceKeyInFather (uint node_num, uint padre, Clave *k);
                Clave *GetKey (uint node_num, char maxmin);
+               void JoinNodes (uint node1, uint node2, uint padre);
 
                /* Funciones de Búsqueda */
                BTreeFindResult *FindKeyR (const Clave *k, uint node);