From: Alan Kennedy Date: Sun, 30 May 2004 10:59:51 +0000 (+0000) Subject: Me rindo 3 horas de buscar un bug en busqueda de siguiente o anterior ancla para... X-Git-Tag: svn_import_r684~74 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/c52c97783d6e747849a0f3dbef223c18fcff99a8?ds=inline Me rindo 3 horas de buscar un bug en busqueda de siguiente o anterior ancla para una dada. Must fix manaina sino no va a funcionar la busqueda de un siguiente --- diff --git a/emufs/b_plus_test.c b/emufs/b_plus_test.c index d38f91f..72906eb 100644 --- a/emufs/b_plus_test.c +++ b/emufs/b_plus_test.c @@ -58,6 +58,15 @@ printf("La menor clave del arbol es: %i\n",querydata.clave.i_clave); querydata.clave = emufs_b_plus_obtener_mayor_clave(emu->indices); printf("La mayor clave del arbol es: %i\n",querydata.clave.i_clave); +querydata.clave = emufs_b_plus_obtener_menor_clave(emu->indices); +postkey.clave = emufs_b_plus_obtener_sig_clave(emu,querydata.clave); +postkey.clave = emufs_b_plus_obtener_sig_clave(emu,postkey.clave); +postkey.clave = emufs_b_plus_obtener_sig_clave(emu,postkey.clave); +postkey.clave = emufs_b_plus_obtener_sig_clave(emu,postkey.clave); +postkey.clave = emufs_b_plus_obtener_sig_clave(emu,postkey.clave); +postkey.clave = emufs_b_plus_obtener_sig_clave(emu,postkey.clave); +postkey.clave = emufs_b_plus_obtener_sig_clave(emu,postkey.clave); + /* NOTA: Deberia devolver el mismo 104 y Exitcode = -1 */ /*querydata.num_bloque = 104; querydata.clave.i_clave = 0; 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; +} diff --git a/emufs/indice_bplus.h b/emufs/indice_bplus.h index 49e10ef..012eb29 100644 --- a/emufs/indice_bplus.h +++ b/emufs/indice_bplus.h @@ -33,5 +33,6 @@ int b_plus_buscar_prepost(INDICE *idx, CLAVE key, int num_node, INDEX_DAT *prepo int emufs_b_plus_reemplazar_clave(INDICE *idx, CLAVE key, INDEX_DAT query, int num_node); CLAVE emufs_b_plus_obtener_menor_clave(INDICE *idx); CLAVE emufs_b_plus_obtener_mayor_clave(INDICE *idx); +CLAVE emufs_b_plus_obtener_sig_clave(EMUFS *emu, CLAVE key); int b_plus_destruir_nodo(NODO_B_PLUS *nodo); #endif