Consultas booleanas - UTEC-BDII/Lab6.2 GitHub Wiki
Las consultas booleanas implementadas en el índice son las de AND, OR y AND_NOT. Asimismo, se implementó la función L que recibe un término y retorna la lista de documentos asociados a este. Esta función también puede recibir como parámetro una lista, cosa que se puede dar al hacer consultas consecutivas, en cuyo caso retorna la misma lista.
AND
La función AND recibe dos términos. Primero, se recuperan las listas de los documentos asociados a cada término llamando a la función L para cada uno y se agrega al final de cada una -1, valor que va a servir para identificar que se llegó al final de la lista. También se declaran las variables p1 y p2, inicialmente en 0, que van a servir como índices para las listas. Luego de esto, se entra al bucle while donde se implementa el algoritmo de mezcla. Mientras ambas listas no hayan sido leídas por completo, es decir los valores en las posiciones de sus índices p1 y p2 no es -1, se va a ejecutar el bucle. Si los valores de las listas en sus respectivas posiciones son iguales, entonces se añade el valor a la lista resultante pues se cumple la condición AND y se avanzan ambos índices para acceder a los elementos siguientes en ambas listas. De no ser así, avanza el puntero de la lista cuyo elemento sea menor pues ambas listas están ordenadas. Al finalizar, se retorna la lista resultante.
OR
La función OR funciona de manera similar a AND con la diferencia de que no solo se añaden elementos a la lista resultante si los valores en las posiciones respectivas de ambas listas son iguales, sino que también cuando no lo son, esto para cumplir con la condición del operador OR. Asimismo, puede ocurrir que cuando se salga del bucle una lista no haya sido leída por completo, para lo cual se añaden dos bucles while, uno por cada lista, luego del principal que van a añadir a la lista resultante los elementos restantes en caso no se hayan terminado de leer de modo que al finalizar la función se tengan todos los IDs de los documentos en los que aparece al menos uno de los términos.
AND_NOT
La función AND_NOT funciona de manera similar a AND con la diferencia de que solo se añaden elementos a la lista resultante cuando el índice de la lista del primer término avanza, es decir cuando el elemento de la primera lista sea menor al de la segunda, y ya no cuando sean iguales. Esto va a hacer que en la lista resultantes estén solo los documentos que contienen al primer término más no al segundo.
Prueba del programa
Para probar la funcionalidad del programa se ejecutaron las consultas (Gandalf AND Frodo) AND NOT Gondor, Orthanc OR (Anillo AND NOT Nazgûl) y (Merry AND Hobbit) OR Gimli. Los resultados obtenidos fueron los siguientes: