X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/439bc9dba0fb23fa34afeebb80e1288d9f8d39f4..4cbdb39bf0f27ac467d8132ffb03c5a69fdd56e6:/emufs/indice_bplus.c?ds=sidebyside diff --git a/emufs/indice_bplus.c b/emufs/indice_bplus.c index 1cf8b01..bdbbce0 100644 --- a/emufs/indice_bplus.c +++ b/emufs/indice_bplus.c @@ -1,4 +1,6 @@ /** Arbol B+ */ +#include "tipo1.h" +#include "tipo3.h" #include "indices.h" #include "indice_bplus.h" @@ -363,7 +365,7 @@ int b_plus_buscar_prepost(INDICE *idx, CLAVE key, int num_node, INDEX_DAT *prepo } break; /* Busco sucesor en la hoja */ - case 1: if (emufs_indice_es_igual(idx,nodo->claves[i],key) && (i == nodo->cant_claves-1)) exitcode = 0; + case 1: if ((nodo->claves[i].i_clave == key.i_clave) && (i == nodo->cant_claves-1)) exitcode = 0; else { prepostkey->clave = nodo->claves[i+1]; prepostkey->num_bloque = nodo->hijos[i+1]; @@ -739,3 +741,41 @@ CLAVE emufs_b_plus_obtener_mayor_clave(INDICE *idx) { return key; } + +CLAVE emufs_b_plus_obtener_sig_clave(EMUFS *emu, CLAVE key) { + + INDICE *idx = emu->indices; + INDEX_DAT query; + int i = 0; + query.clave = key; + + /* Si aun no tengo un array, obtengo uno */ + if (emu->indices->keybucket == NULL) { + /* Busco el ancla para esta key */ + emufs_b_plus_get_bloque(idx,&query,0); + idx->keybucket = emufs_tipo3_obtener_claves_raw(emu,query.num_bloque); + printf ("\nLevante bloque nro: %li y obtuve un bucket con %i keys\n",query.num_bloque,idx->keybucket->cant_keys); + return (idx->keybucket->claves[0]); + } + else { + /* Veo si la ultima clave retornada es la ultima del array */ + if (idx->keybucket->current_key == idx->keybucket->cant_keys-1) { + /* Debo obtener un nuevo bucket de claves */ + if (b_plus_buscar_prepost(idx,key,0,&query,1) != -1) { + idx->keybucket = emufs_tipo3_obtener_claves_raw(emu,query.num_bloque); + printf ("\nLevante bloque nro: %li y obtuve un bucket con %i keys\n",query.num_bloque,idx->keybucket->cant_keys); + } + else return key; + } + } + + /* Busco la clave en el array de atras hacia adelante. */ + if (idx->keybucket->current_key < idx->keybucket->cant_keys-1) { + i = idx->keybucket->cant_keys - 1; + while (i >= 0 && emufs_indice_es_menor(idx,key,idx->keybucket->claves[i])) --i; + ++i; + idx->keybucket->current_key = i; + return (idx->keybucket->claves[i]); + } + else return key; +}