]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs/indice_bplus.c
Sigo puliendo el obtener siguiente, creo que ahora mas o menos pilotea, ni en pedo...
[z.facultad/75.06/emufs.git] / emufs / indice_bplus.c
index a1c0e0a4e98a149b9155ae8c26554b70ac1be0d9..c1a8059b41c80c4e600c1f645fdd7c6a87796344 100644 (file)
@@ -759,23 +759,45 @@ CLAVE emufs_b_plus_obtener_sig_clave(EMUFS *emu, CLAVE 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);       
                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);       
-               printf ("\nLa primera clave del bucket que devuelvo es: %i\n",idx->keybucket->claves[0]);                                               
-       } 
-       else {
-               /* Veo si ya devolvi la ultima */
+               printf ("La primera clave del bucket que devuelvo es: %i\n",idx->keybucket->claves[0].i_clave);                                         
+       }
+
+       /* Si me pide el siguiente de una clave que no esta en este bucket, pido un nuevo! */
+       if (idx->keybucket != NULL) {
+               i = idx->keybucket->cant_keys - 1;
+               while (i >= 0 && !emufs_indice_es_igual(emu->indices,key,idx->keybucket->claves[i])) --i;
+               if (i < 0) {
+                       /* Debo obtener un nuevo bucket pues este debe ser de otro query viejo */
+                       free(idx->keybucket->claves);
+                       free(idx->keybucket);
+                       emufs_b_plus_get_bloque(idx,&query,0);          
+                       idx->keybucket = emufs_tipo3_obtener_claves_raw(emu,query.num_bloque);
+                       /* Dejo el el iterador listo para la leer el siguiente, pues puede estar por el medio */
+                       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;                        
+                       printf ("\nLevante bloque nro: %li y obtuve un bucket con %i keys\n",query.num_bloque,idx->keybucket->cant_keys);       
+                       printf ("La primera clave del bucket que devuelvo es: %i\n",idx->keybucket->claves[0].i_clave);                                         
+               }
+       }               
+       
+       /* Veo si ya devolvi la ultima */
+       if (idx->keybucket != NULL)             
                if (idx->keybucket->current_key == idx->keybucket->cant_keys) {                 
                        /* Debo obtener un nuevo bucket de claves */            
                        if (b_plus_buscar_prepost(idx,idx->keybucket->claves[0],0,&query,1) != -1) {                            
                if (idx->keybucket->current_key == idx->keybucket->cant_keys) {                 
                        /* Debo obtener un nuevo bucket de claves */            
                        if (b_plus_buscar_prepost(idx,idx->keybucket->claves[0],0,&query,1) != -1) {                            
+                               free(idx->keybucket->claves);
+                               free(idx->keybucket);
                                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);       
                                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);       
-                               printf ("\nLa primera clave del bucket que devuelvo es: %i\n",idx->keybucket->claves[0]);                                                                               
-                               
+                               printf ("La primera clave del bucket que devuelvo es: %i\n",idx->keybucket->claves[0].i_clave);                                                                                                         
                        }
                        else return key;
                }
                        }
                        else return key;
                }
-       }
+       
                
                
-       /* Devuelvo el siguiente elemento del array */
+       /* Devuelvo el siguiente elemento del array solo si es mayor. Si es menor, lo skipeo */                 
        if (idx->keybucket->current_key < idx->keybucket->cant_keys) {
                i = idx->keybucket->current_key;
                idx->keybucket->current_key++;          
        if (idx->keybucket->current_key < idx->keybucket->cant_keys) {
                i = idx->keybucket->current_key;
                idx->keybucket->current_key++;