/**Funciión Hash, implementada con el modulo*/
        public int FuncionHash(CBloque b)
        {
            //Aplicando modulo
            Object clave = b.dameClavePrim();
            int pos, c = 0;

            pos = -1;

            switch (b.getTipoCA())
            {
                case 3: //Entero
                    pos = (int)clave % TAM_CUBETA;
                break;
                case 5: //Long
                    pos = (int)((long)clave)%TAM_CUBETA;
                break;
                case 7: //Cadena
                    pos = Math.Abs(((string)clave).GetHashCode())%TAM_CUBETA;
                break;
            }

            return (pos);
        }
Beispiel #2
0
        /**\brief Inseta una clave en el nodo en forma ordenada*/
        public void insClaveOrd(Object clave, CBloque bloque, CArchivo file, int posClave)
        {
            //Movimiento de claves, dirClaves y dirNodos
            for (int i = getNumElemnt(); i > posClave; i--)
            {
                claves[i] = claves[i - 1];
                dirClaves[i] = dirClaves[i - 1];
                
                if (getTipoNodo() == 1 || getTipoNodo() == 4)//Si la clave a insertar es diferente a una hoja
                    dirNodos[i+1] = dirNodos[i];
                else
                    dirNodos[i] = dirNodos[i - 1];
            }

            if (getTipoNodo() == 2 || getTipoNodo() == 3)//La clave se va a insertar en una hoja o en la raizHoja
            {
                dirNodos[posClave] = file.ENDF();
                file.EscribeBloque(bloque, file.ENDF());
            }

            claves[posClave] = clave;
            incNumElem();

            if (getTipoNodo() == 2 || getTipoNodo() == 3)//Si la clave a insertar es diferente a una raiz o pagima
            {
                dirClaves[posClave] = file.ENDF();
                escribeClave(clave, file.ENDF(), bloque.getTipoCA(), file);
            }
        }
        /**Implemeta un función hash con la tecnica del plegamiento para obtener la posición
         * donde se insertara la nueva deirección del registro en la cubeta y la tabla hash*/
        public void FuncionHash(CBloque b, ref int fH, ref int fC)
        {
           
            Object clave = b.dameClavePrim();
            int c = 0;

            switch (b.getTipoCA())
            {
                case 3: //Entero
                   c = (int)clave;
                break;
                case 5: //Long
                    c = (int)((long)clave);
                break;
                case 7: //Cadena
                    c =  Math.Abs(((string)clave).GetHashCode());
                break;
            }

            while (c / 10 != 0)
                c = plegamiento(c);

            fC = fH = c;

            if (fC >= TAM_CUBETA)
            {
                fC = (fC - TAM_CUBETA) - 2;
                if (fC < 0)
                    fC = 0;
            }
            
            if (fH >= TAM_HASH)
               fH -= TAM_HASH;

        }
        /**\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);
        }
        /**Metodo principal para la inserción de la clave junto con su bloque de datos*/
        public bool AltaArbolBplus(CNodoEntidad e, CBloque b, long posB)
        {
            CNodo nuevo = null;
            Object clave;
            bool res = true;
            long dirClave = -1;

            clave = b.dameClavePrim();

            if (e.getApCabDatos() == -1)//Si no hay algun arbol se crea la primera pagina
            {
                nuevo = new CNodo(RAIZHOJA, GRADO);
                nuevo.setDir(getArchivo().ENDF());
                nuevo.setTipoClave(b.getTipoCA());
                getArchivo().escribeNodo(nuevo);
                e.setApCabDatos(nuevo.getDir());
                getArchivo().escribeEntidad(e, e.getDir());
            }
            else
            {
                bool bandera = false;

                res = EmpujaDato(e.getApCabDatos(), ref clave, ref dirClave, b, posB, ref nuevo, ref bandera);

                if (bandera == true)//La raiz se partido
                {
                    CNodo nuevaRaiz;
                    nuevaRaiz = new CNodo(RAIZ, GRADO);

                    nuevaRaiz.setAtClave(0, clave);
                    nuevaRaiz.setAtDirClaves(0, dirClave);
                    nuevaRaiz.setAtDirNodo(0, ent.getApCabDatos());
                    nuevaRaiz.setAtDirNodo(1, nuevo.getDir());
                    nuevaRaiz.setDir(getArchivo().ENDF());
                    nuevaRaiz.setNumElemnt(1);
                    nuevaRaiz.setTipoClave(b.getTipoCA());
                    getArchivo().escribeNodo(nuevaRaiz);
                    e.setApCabDatos(nuevaRaiz.getDir());
                    getArchivo().escribeEntidad(e, e.getDir());
                }
            }

            return (res);
        }
        /* Crea el indice primario correspondiente al bloque*/
        public CIndice generaIndPri(CBloque nuevoB)
        {
            CIndice nuevo = new CIndice();
            byte[] indAux = null;
            int num, tamInd = 0;
            long num2;

            switch (nuevoB.getTipoCA())
            {
                case 3://Clave Primaria de Tipo entera
                    num = BitConverter.ToInt32(nuevoB.dameClave(), 0);
                    indAux = BitConverter.GetBytes((num / 10) * 10);
                    tamInd = 4;
                break;
                case 5://Clave primaria de tipo Long
                    num2 = BitConverter.ToInt64(nuevoB.dameClave(), 0);
                    indAux = BitConverter.GetBytes((num2 / 10) * 10);
                    tamInd = 8;
                break;
                case 7://Clave Primaria de Tipo Cadena
                    indAux = new byte[1];//Se saca el primer caracter
                    indAux[0] = nuevoB.dameClave()[0];
                    tamInd = 1;
                break;
            }

            nuevo.setTipoInd(nuevoB.getTipoCA());
            nuevo.setTamIndPri(tamInd);
            nuevo.setIndPrim(indAux);
       
            return (nuevo);
        }