Class InvertedListIndex

java.lang.Object
AEDs3.DataBase.Index.InvertedListIndex
All Implemented Interfaces:
AutoCloseable

public class InvertedListIndex extends Object implements AutoCloseable
Classe que implementa um índice reverso por Lista Invertida. Gerencia um índice invertido no disco, mantendo um cache limitado (LRU) na memória com número ajustável de entradas. O restante é armazenado nos arquivos em disco.
  • Field Details

    • DEFAULT_CACHE_SIZE

      private static final int DEFAULT_CACHE_SIZE
      Tamanho padrão do cache, definido como 1024.
      See Also:
    • MAX_FREQUENCY

      private static final int MAX_FREQUENCY
      Frequência máxima permitida para uma palavra, definida como 4096.
      See Also:
    • blocksFilePath

      private final String blocksFilePath
      Caminho para o arquivo que armazena as postagens reais (palavra para lista de IDs).
    • directoryFilePath

      private final String directoryFilePath
      Caminho para o arquivo que armazena o dicionário mapeando palavra para offset nos blocos.
    • frequencyFilePath

      private final String frequencyFilePath
      Caminho para o arquivo que armazena o dicionário mapeando palavra para frequência.
    • blkRaf

      private final RandomAccessFile blkRaf
      Acesso aleatório ao arquivo de blocos.
    • dirRaf

      private final RandomAccessFile dirRaf
      Acesso aleatório ao arquivo de diretório.
    • freqRaf

      private final RandomAccessFile freqRaf
      Acesso aleatório ao arquivo de frequência.
    • cacheSize

      private long cacheSize
      Tamanho atual do cache.
    • cache

      Este cache armazena as postagens para até cacheSize palavras. Evicção baseada em LRU (LinkedHashMap com ordem de acesso = true).
  • Constructor Details

    • InvertedListIndex

      public InvertedListIndex(String blocksFilePath, String directoryFilePath, String frequencyFilePath) throws IOException
      Construtor único.
      Parameters:
      blocksFilePath - Caminho para o arquivo de blocos (postagens).
      directoryFilePath - Caminho para o arquivo de diretório (palavra para offset).
      frequencyFilePath - Caminho para o arquivo de frequência (palavra para frequência).
      Throws:
      IllegalStateException - se alguns arquivos existirem enquanto outros não. Cria novos arquivos vazios se nenhum existir; caso contrário, recarrega os arquivos existentes minimamente (não os lê inteiramente na memória).
      IOException - se ocorrer um erro de entrada/saída durante a inicialização.
  • Method Details

    • create

      public boolean create(String word, int id)
      Cria (insere) uma nova entrada.
      Parameters:
      word - A palavra a ser inserida.
      id - O ID do documento/entidade a ser associado a essa palavra.
      Returns:
      true se a entrada foi criada com sucesso.
      Throws:
      IllegalStateException - se a frequência da palavra for > 10000 ou qualquer outro erro lógico.
    • read

      public int[] read(String word)
      Lê (busca) uma entrada.
      Parameters:
      word - A palavra a ser buscada.
      Returns:
      Todos os IDs correspondentes, ou um array vazio se nenhum for encontrado.
      Throws:
      IllegalStateException - se a frequência da palavra for > 10000.
    • delete

      public boolean delete(String word, int id)
      Deleta uma associação (palavra para id).
      Parameters:
      word - a palavra a ser atualizada
      id - o ID a ser removido de suas postagens
      Returns:
      true se foi realmente removido; false se não encontrado
    • destruct

      public void destruct() throws IOException
      Destrói o índice invertido. Este método deleta todos os arquivos associados a este índice do disco, garantindo que todos os dados em cache sejam primeiro descarregados para o disco.
      Throws:
      IOException - se ocorrer um erro de entrada/saída durante o processo.
    • listFilePaths

      public String[] listFilePaths()
      Lista todos os caminhos de arquivo
      Returns:
      um array de caminhos de arquivo que este objeto gerencia
    • initFiles

      private void initFiles()
      Inicializa os arquivos necessários para o índice invertido. Verifica a existência dos arquivos de blocos, diretório e frequência. Se nenhum dos arquivos existir, cria novos arquivos vazios. Se apenas alguns dos arquivos existirem, lança uma exceção indicando que não é possível inicializar o índice devido à inconsistência.
      Throws:
      RuntimeException - se ocorrer um erro ao criar novos arquivos.
      IllegalStateException - se alguns arquivos existirem enquanto outros não.
    • getPosting

      private InvertedListIndex.CachedPosting getPosting(String word)
      Recupera uma postagem do cache ou a carrega do disco se não estiver em cache. Se não houver entrada no disco (palavra não encontrada no diretório), retorna uma nova postagem.
      Parameters:
      word - A palavra cuja postagem deve ser recuperada.
      Returns:
      A postagem em cache correspondente à palavra, ou uma nova postagem se não encontrada.
    • readString

      private static String readString(RandomAccessFile raf) throws IOException
      Método auxiliar que lê uma string codificada em UTF-8 a partir de um arquivo de acesso aleatório. A string é precedida por um inteiro que indica seu comprimento.
      Parameters:
      raf - O arquivo de acesso aleatório de onde a string será lida.
      Returns:
      A string lida do arquivo.
      Throws:
      IOException - Se ocorrer um erro de entrada/saída durante a leitura.
    • writeString

      private static void writeString(RandomAccessFile raf, String s) throws IOException
      Método auxiliar que escreve uma string codificada em UTF-8 em um arquivo de acesso aleatório, precedida por um inteiro que indica o comprimento da string.
      Parameters:
      raf - O arquivo de acesso aleatório onde a string será escrita.
      s - A string a ser escrita no arquivo.
      Throws:
      IOException - Se ocorrer um erro de entrada/saída durante a escrita.
    • loadPostingFromDisk

      private InvertedListIndex.CachedPosting loadPostingFromDisk(String word)
      Carrega ou cria a lista de postagens e frequência para uma palavra específica do disco.
      Parameters:
      word - A palavra cuja lista de postagens deve ser recuperada.
      Returns:
      A postagem em cache correspondente à palavra, ou uma nova postagem se não encontrada.
      Throws:
      RuntimeException - Se ocorrer um erro de entrada/saída ao carregar a palavra.
    • flushPostingToDisk

      private void flushPostingToDisk(String word, InvertedListIndex.CachedPosting posting)
      Salva a postagem que está na memória de volta para o disco, adicionando novos registros.
      Parameters:
      word - A palavra cuja postagem deve ser salva.
      posting - A postagem em cache que contém a lista de IDs e a frequência da palavra.
    • flushAllPostingsToDisk

      public void flushAllPostingsToDisk()
      Descarrega todas as postagens que estão atualmente no cache para o disco. Este método itera sobre todas as entradas no cache, salvando cada postagem no disco e, em seguida, limpa o cache. Isso garante que todas as alterações feitas nas postagens em cache sejam persistidas no armazenamento permanente.
    • close

      public void close() throws IOException
      Fecha o índice invertido, garantindo que todas as postagens em cache sejam descarregadas para o disco antes de fechar os arquivos de acesso aleatório.
      Specified by:
      close in interface AutoCloseable
      Throws:
      IOException - se ocorrer um erro de entrada/saída ao fechar os arquivos.
    • getDefaultCacheSize

      public static int getDefaultCacheSize()
      Retorna o tamanho padrão do cache.
      Returns:
      O tamanho padrão do cache.
    • getCacheSize

      public long getCacheSize()
      Retorna o tamanho atual do cache.
      Returns:
      O tamanho atual do cache.
    • setCacheSize

      public void setCacheSize(long cacheSize)
      Define o tamanho do cache.
      Parameters:
      cacheSize - O novo tamanho do cache.