Example #1
0
        /**Presta una clave a alguna nodo del arbol*/
        public void prestarClavePagina(CNodo paginaAux, CNodo paginaA, CNodo paginaB, int i, int posB)
        {
            int  posClave, posIns, posEliminado;
            Object clave;
            
            if (i < posB)
            {
                posClave = i;
                clave = paginaAux.getAtClave(i);
                posIns = paginaA.getNumElemnt();
                posEliminado = 0;
            }
            else
            {
                posClave = posB;
                clave = paginaAux.getAtClave(posB);
                posIns = 0;
                posEliminado = paginaB.getNumElemnt()-1;
            }

            paginaA.insClaveOrd(clave, null, null, posIns);
            paginaA.setAtDirClaves(posIns, paginaAux.getAtDirClaves(posClave));
            paginaAux.setAtClave(posClave, paginaB.getAtClave(posEliminado));
            paginaAux.setAtDirClaves(posClave, paginaB.getAtDirClaves(posEliminado));

            if (i < posB)
            {
                paginaA.setAtDirNodo(posIns + 1, paginaB.getAtDirNodo(0));
                paginaB.eliminaClaveOrd(paginaB.getAtClave(0));
            }
            else
            {
                paginaA.setAtDirNodo(1, paginaA.getAtDirNodo(0));
                paginaA.setAtDirNodo(0, paginaB.getAtDirNodo(posEliminado+1));
                paginaB.eliminaClaveOrd(paginaB.getAtClave(posEliminado));
            }
        }
Example #2
0
        /**\brief Particiona un nodo del Arbol B+*/
        public CNodo particiona(CNodo hoja, CBloque b, long posB, ref Object clave, ref long dirClave, int i)
        {
            CNodo nuevo = new CNodo(hoja.getTipoNodo(), GRADO);
            int k, j;
            Object claveAux = null;
            long dirAux = -1;

            if (hoja.getTipoNodo() == RAIZHOJA)
            {
                hoja.setTipoNodo(HOJA);
                nuevo.setTipoNodo(HOJA);
            }
            else
                if (hoja.getTipoNodo() == RAIZ)
                {
                    hoja.setTipoNodo(PAGINA);
                    nuevo.setTipoNodo(PAGINA);
                }

            nuevo.setTipoClave(b.getTipoCA());

            j = (2 * GRADO) - 1;

            if (i >= GRADO)
            {
                if (hoja.getTipoNodo() == RAIZ || hoja.getTipoNodo() == PAGINA)
                {
                    if (i == GRADO)
                    {
                        k = GRADO - 1;
                        hoja.setNumElemnt(GRADO);
                        claveAux = clave;
                        dirAux = dirClave;
                    }
                    else
                    {
                        k = GRADO - 2;
                        hoja.setNumElemnt(GRADO);
                        claveAux = hoja.getAtClave(GRADO);
                        dirAux = hoja.getAtDirClaves(GRADO);
                    }
                }
                else
                {
                    k = GRADO - 1;
                    hoja.setNumElemnt(GRADO);
                }
            }
            else
            {
                if (hoja.getTipoNodo() == RAIZ || hoja.getTipoNodo() == PAGINA)
                {
                    claveAux = hoja.getAtClave(GRADO - 1);
                    dirAux = hoja.getAtDirClaves(GRADO - 1);
                    k = GRADO - 1;
                }
                else
                    k = GRADO;
                
                hoja.setNumElemnt(GRADO - 1);
            }

            nuevo.setNumElemnt(k + 1);

            for (; k >= 0; k--, j--)
            {
                nuevo.setAtClave(k, hoja.getAtClave(j));
                nuevo.setAtDirClaves(k, hoja.getAtDirClaves(j));

                if (hoja.getTipoNodo() == RAIZ || hoja.getTipoNodo() == PAGINA)
                    nuevo.setAtDirNodo(k + 1, hoja.getAtDirNodo(j + 1));
                else
                    nuevo.setAtDirNodo(k, hoja.getAtDirNodo(j));
            }

            if (i >= GRADO)
            {
                if (hoja.getTipoNodo() == RAIZ || hoja.getTipoNodo() == PAGINA)
                {
                    if (i != GRADO)
                    {
                        nuevo.setAtDirNodo(0, hoja.getAtDirNodo(GRADO + 1));
                        nuevo.insClaveOrd(clave, b, getArchivo(), (i - GRADO) - 1);
                        nuevo.setAtDirClaves((i - GRADO) - 1, dirClave);
                        nuevo.setAtDirNodo(i - GRADO, posB);
                    }else
                        nuevo.setAtDirNodo(0, posB);
                }
                else
                    nuevo.insClaveOrd(clave, b, getArchivo(), i - GRADO);
            }
            else
            {
                hoja.insClaveOrd(clave, b, getArchivo(), i);
                if (hoja.getTipoNodo() == RAIZ || hoja.getTipoNodo() == PAGINA)
                {
                    nuevo.setAtDirNodo(0, hoja.getAtDirNodo(GRADO));
                    hoja.setAtDirClaves(i, dirClave);
                    hoja.setAtDirNodo(i + 1, posB);
                }
            }


            if (hoja.getTipoNodo() == RAIZ || hoja.getTipoNodo() == PAGINA)
            {
                clave = claveAux;
                dirClave = dirAux;
            }else
            {
                clave = nuevo.getAtClave(0);
                dirClave = nuevo.getAtDirClaves(0);
            }

            getArchivo().escribeNodo(hoja);
            nuevo.setDir(getArchivo().ENDF());
            getArchivo().escribeNodo(nuevo);

            return (nuevo);
        }