Class TrackDB
java.lang.Object
AEDs3.DataBase.TrackDB
- All Implemented Interfaces:
AutoCloseable,Iterable<Track>
Representa um banco de dados binário de faixas de música, permitindo
operações de CRUD (Criar, Ler, Atualizar e Deletar), filtragem e ordenação.
O banco de dados é gerenciado em um arquivo binário, com cada faixa de música
armazenada como um registro.
Esta classe implementa a interface Iterable, permitindo que o banco
de dados seja percorrido através de um iterador.
Além disso, a classe implementa a interface AutoCloseable, garantindo
que o arquivo seja fechado corretamente após o uso.
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classClasse interna que representa um filtro de busca para faixas. -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected InvertedListIndexÍndice de lista invertida para otimizar buscas pelo nome do álbum.protected InvertedListIndexÍndice de lista invertida para otimizar buscas pelo nome do artista.protected static final StringExtensão de arquivo padrão utilizada para o banco de dados.protected RandomAccessFileArquivo que contém os dados binários do banco de dados.protected final StringCaminho para o arquivo de banco de dados.protected longMáscara de bits que contém diversas flags para o banco de dados.protected static final shortTamanho do cabeçalho em bytes, incluindo os metadados do banco de dados.protected ForwardIndexÍndice primário utilizado para otimizar operações de busca e escrita.protected longPosição do último registro de faixa no banco de dados.protected intÚltimo ID inserido no banco de dados.protected intÚltimo ID encontrado pelo iterador.protected InvertedListIndexÍndice de lista invertida para otimizar buscas pelo nome da faixa.protected intNúmero de espaços usados no banco de dados, incluindo os com lápides.protected intNúmero de faixas válidas no banco de dados.protected TrackDB.TrackFilterFiltro de busca aplicado nas faixas do banco de dados.protected booleanIndica se o segmento atual de faixas foi completamente processado.protected longPosição do início do segmento atual de faixas.protected UUIDID único do banco de dados. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected intAdiciona uma faixa ao final do banco de dados, no arquivo binário.voidLimpa o filtro de busca atual.voidclose()Fecha o banco de dados, liberando todos os recursos utilizados.intAdiciona uma nova faixa ao banco de dados.voiddelete(int id) Deleta uma faixa do banco de dados, identificada pelo seu ID.voiddelete(Track.Field field, Object value) Deleta faixas do banco de dados que correspondem a um valor específico de campo.private voidRemove índices invertidos de uma faixa no banco de dados.voidDesabilita todos os índices no banco de dados.static StringRetorna a extensão de arquivo padrão utilizada para o banco de dados.Retorna o caminho para o arquivo de banco de dados.Retorna o filtro de busca atual.intRetorna o último ID inserido no banco de dados.intRetorna o número de espaços usados no banco de dados, incluindo os com lápides.intRetorna o número de faixas válidas no banco de dados.getUUID()Retorna o UUID único do banco de dados.booleanVerifica se o banco de dados utiliza um índice do tipo Árvore B.booleanVerifica se o banco de dados utiliza um índice do tipo Hash.booleanVerifica se o banco de dados utiliza um índice de Lista Invertida.booleanVerifica se o banco de dados possui um índice.private voidInsere índices invertidos para uma faixa no banco de dados.private static String[][]Divide os campos de nome, álbum e artista de uma faixa em partes menores, filtrando palavras com mais de 3 caracteres e que correspondem a letras.booleanVerifica se o ponteiro do arquivo chegou ao final.booleanVerifica se o banco de dados está ordenado.booleanVerifica se o segmento atual de faixas foi completamente processado.static booleanVerifica se um arquivo é um arquivo de banco de dados TrackDB válido.iterator()Retorna um iterador para percorrer as faixas armazenadas no banco de dados.String[]Retorna um array contendo os caminhos de todos os arquivos associados a este banco de dados, incluindo o arquivo de dados e quaisquer arquivos de índice.private BinaryTrackReaderRetorna o próximo leitor de faixa, independentemente de ser válido ou não (pode ser uma lápide).protected TrackRetorna a próxima faixa válida do banco de dados, considerando o filtro de busca, se houver.private BinaryTrackReaderRetorna o próximo leitor de faixa válido do banco de dados.voidopen()Abre o banco de dados a partir do arquivo especificado, inicializando os metadados e o cabeçalho do banco de dados.voidprint(int id) Imprime um sumário da faixa do banco de dados correspondente ao ID fornecido.voidprint(Track.Field field, Object value) Imprime um sumário de todas as faixas do banco de dados que correspondem a um valor específico de campo.voidprintAll()Imprime todas as faixas do banco de dados.read(int id) Lê uma faixa do banco de dados pelo seu ID.readFirst(Track.Field field, Object value) Lê a primeira faixa que corresponde ao valor de um campo específico.int[]readInvertedIndexes(String name, String album, String artist) Lê os índices invertidos para o nome, álbum e artista fornecidos.voidreindex()Reindexa o banco de dados, recriando o índice atual.private static int[]resultsIntersection(int[]... arrays) Encontra a intersecção de N arrays, podendo incluir arrays nulos ou vazios.protected voidRetorna o ponteiro do arquivo ao início do segmento atual durante a intercalação balanceada, necessário para que o iterador não descarte o primeiro registro do próximo segmentovoidsetBTreeIndex(boolean value) Configura o uso de um índice do tipo Árvore B no banco de dados.voidsetBTreeIndex(boolean value, int order) Configura o uso de um índice do tipo Árvore B no banco de dados com uma ordem específica.voidsetDynamicHashIndex(boolean value) Configura o uso de um índice do tipo Hash Dinâmica no banco de dados.voidsetDynamicHashIndex(boolean value, int bucketCapacity) Configura o uso de um índice do tipo Hash Dinâmica no banco de dados com uma capacidade de bucket específica.voidsetFilter(Track.Field field, Object value) Define o filtro de busca baseado em um campo e um valor específicos.voidsetFilter(TrackDB.TrackFilter searchFilter) Define o filtro de busca a ser utilizado para operações de pesquisa.voidsetInvertedListIndex(boolean value) Configura o uso de índices de lista invertida no banco de dados.voidsetLastId(int lastId) Define o último ID inserido no banco de dados e atualiza o cabeçalho.voidsetOrdered(boolean value) Define o estado de ordenação do banco de dados.voidsort()Ordena as faixas do banco de dados utilizando o algoritmo de ordenação Balanced Merge Sort com parâmetros padrão (sem configuração de fanout e maxHeapNodes).voidsort(int fanout, int maxHeapNodes) Ordena as faixas do banco de dados utilizando o algoritmo de ordenação Balanced Merge Sort (intercalação balanceada).protected voidtruncate()Trunca o arquivo, removendo todos os dados, exceto o UUID.voidAtualiza uma faixa no banco de dados, identificada pelo seu ID.protected voidAtualiza o cabeçalho do banco de dados no arquivo, incluindo informações como o UUID, o último ID, as flags e o número de faixas e espaços.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface java.lang.Iterable
forEach, spliterator
-
Field Details
-
file
Arquivo que contém os dados binários do banco de dados. -
filePath
Caminho para o arquivo de banco de dados. -
index
Índice primário utilizado para otimizar operações de busca e escrita. Pode ser do tipo Árvore B ou Hash Dinâmica, dependendo da configuração. -
nameIndex
Índice de lista invertida para otimizar buscas pelo nome da faixa. Armazena referências para faixas que contêm palavras específicas no nome. -
albumIndex
Índice de lista invertida para otimizar buscas pelo nome do álbum. Armazena referências para faixas que contêm palavras específicas no nome do álbum. -
artistIndex
Índice de lista invertida para otimizar buscas pelo nome do artista. Armazena referências para faixas que contêm palavras específicas no nome do artista. -
lastBinaryTrackPos
protected long lastBinaryTrackPosPosição do último registro de faixa no banco de dados. -
searchFilter
Filtro de busca aplicado nas faixas do banco de dados. É respeitado pelo iterador, que ignorará registros que não correspondem. -
uuid
ID único do banco de dados. -
lastId
protected int lastIdÚltimo ID inserido no banco de dados. -
numTracks
protected int numTracksNúmero de faixas válidas no banco de dados. -
numSpaces
protected int numSpacesNúmero de espaços usados no banco de dados, incluindo os com lápides. -
flags
protected long flagsMáscara de bits que contém diversas flags para o banco de dados. -
HEADER_SIZE
protected static final short HEADER_SIZETamanho do cabeçalho em bytes, incluindo os metadados do banco de dados.- See Also:
-
DEFAULT_FILE_EXTENSION
Extensão de arquivo padrão utilizada para o banco de dados.- See Also:
-
segmentFinished
protected boolean segmentFinishedIndica se o segmento atual de faixas foi completamente processado. -
lastIteratorId
protected int lastIteratorIdÚltimo ID encontrado pelo iterador. -
segmentStart
protected long segmentStartPosição do início do segmento atual de faixas.
-
-
Constructor Details
-
TrackDB
Constrói uma instância do banco de dados a partir de um arquivo.- Parameters:
fileName- Caminho para o arquivo do banco de dados.- Throws:
IOException- Se ocorrer um erro de leitura ou gravação no arquivo.
-
-
Method Details
-
open
Abre o banco de dados a partir do arquivo especificado, inicializando os metadados e o cabeçalho do banco de dados.Se o arquivo já contiver dados, o banco será carregado e os metadados serão lidos. Caso contrário, será gerado um novo UUID e o cabeçalho será inicializado com valores padrão.
- Throws:
IOException- Se ocorrer um erro ao abrir o arquivo ou ler os dados.
-
close
Fecha o banco de dados, liberando todos os recursos utilizados.- Specified by:
closein interfaceAutoCloseable- Throws:
IOException- Se ocorrer um erro ao fechar o arquivo.
-
isTrackDB
Verifica se um arquivo é um arquivo de banco de dados TrackDB válido.- Parameters:
file- O caminho para o arquivo a ser verificado.- Returns:
truese o arquivo não for um arquivo TrackDB válido,falsecaso contrário.- Throws:
IOException- Se ocorrer um erro de leitura ao acessar o arquivo.
-
create
Adiciona uma nova faixa ao banco de dados. O ID da faixa é atribuído automaticamente com base no último ID inserido.- Parameters:
track- A faixa a ser adicionada.- Returns:
- O ID da faixa inserida.
- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo.
-
append
Adiciona uma faixa ao final do banco de dados, no arquivo binário. A faixa é escrita no formato binário, incluindo o estado de lápide e o tamanho.- Parameters:
track- A faixa a ser adicionada.- Returns:
- O ID da faixa adicionada.
- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo.
-
read
Lê uma faixa do banco de dados pelo seu ID. Caso o banco de dados esteja desordenado, a busca é feita por todo o arquivo. Caso contrário, o método verifica rapidamente com um iterador.- Parameters:
id- O ID da faixa a ser lida.- Returns:
- A faixa correspondente ao ID, ou
nullse não encontrada. - Throws:
IOException- Se ocorrer um erro de leitura no arquivo.
-
readFirst
Lê a primeira faixa que corresponde ao valor de um campo específico. A busca é feita pelo arquivo a partir do cabeçalho.- Parameters:
field- O campo da faixa a ser comparado.value- O valor que o campo deve ter.- Returns:
- A primeira faixa que corresponde ao campo e valor especificados, ou
nullse não encontrada. - Throws:
IOException- Se ocorrer um erro de leitura no arquivo.
-
update
Atualiza uma faixa no banco de dados, identificada pelo seu ID. Se o tamanho da nova faixa for menor ou igual ao da faixa existente, ela sobrescreve o registro. Caso contrário, o registro antigo é marcado como lápide e o novo é adicionado no final.- Parameters:
id- O ID da faixa a ser atualizada.updated- A faixa com os dados atualizados.- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo.NoSuchElementException- Se não houver uma faixa com o ID fornecido.
-
delete
Deleta uma faixa do banco de dados, identificada pelo seu ID. O registro da faixa é marcado como lápide e o número de faixas é decrementado.- Parameters:
id- O ID da faixa a ser deletada.- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo.NoSuchElementException- Se não houver uma faixa com o ID fornecido.
-
delete
Deleta faixas do banco de dados que correspondem a um valor específico de campo. Todos os registros correspondentes são marcados como lápide.- Parameters:
field- O campo da faixa a ser comparado.value- O valor que o campo deve ter para que a faixa seja deletada.- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo.
-
sort
Ordena as faixas do banco de dados utilizando o algoritmo de ordenação Balanced Merge Sort (intercalação balanceada). O método permite configurar o fanout (quantidade de faixas que podem ser processadas por vez) e o número máximo de nós da heap para a ordenação.- Parameters:
fanout- Número de faixas processadas em cada fase do algoritmo de ordenação.maxHeapNodes- Número máximo de nós da heap para a ordenação.- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo durante a ordenação.
-
sort
Ordena as faixas do banco de dados utilizando o algoritmo de ordenação Balanced Merge Sort com parâmetros padrão (sem configuração de fanout e maxHeapNodes).- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo durante a ordenação.
-
print
Imprime um sumário da faixa do banco de dados correspondente ao ID fornecido.- Parameters:
id- O ID da faixa a ser impressa.- Throws:
IOException- Se ocorrer um erro de leitura no arquivo.
-
print
Imprime um sumário de todas as faixas do banco de dados que correspondem a um valor específico de campo.- Parameters:
field- O campo da faixa a ser comparado.value- O valor que o campo deve ter para que a faixa seja impressa.- Throws:
IOException- Se ocorrer um erro de leitura no arquivo.
-
printAll
Imprime todas as faixas do banco de dados.- Throws:
IOException- Se ocorrer um erro de leitura no arquivo.
-
nextTrack
Retorna a próxima faixa válida do banco de dados, considerando o filtro de busca, se houver. Se o filtro de busca estiver definido, ele irá procurar a próxima faixa que corresponda ao campo e valor fornecidos. Caso contrário, ele retorna a próxima faixa válida, ignorando as lápides.- Returns:
- A próxima faixa válida, ou
nullse não houver mais faixas válidas. - Throws:
EOFException- Se o fim do arquivo for alcançado.IOException- Se ocorrer um erro de leitura no arquivo.ClassNotFoundException- Se ocorrer um erro ao ler a classe da faixa.
-
nextValidBinaryTrackReader
Retorna o próximo leitor de faixa válido do banco de dados. Um leitor de faixa válido é aquele que não é uma lápide (registro deletado). O método continua buscando até encontrar um leitor de faixa válido.- Returns:
- Um
BinaryTrackReaderpara a próxima faixa válida. - Throws:
EOFException- Se o fim do arquivo for alcançado.IOException- Se ocorrer um erro de leitura no arquivo.
-
nextBinaryTrackReader
Retorna o próximo leitor de faixa, independentemente de ser válido ou não (pode ser uma lápide). Este método lê o próximo registro do arquivo, mas não verifica se ele é uma faixa válida.- Returns:
- Um
BinaryTrackReaderpara a próxima faixa, ounullse o registro for inválido (lápide). - Throws:
EOFException- Se o fim do arquivo for alcançado.IOException- Se ocorrer um erro de leitura no arquivo.
-
returnToSegmentStart
Retorna o ponteiro do arquivo ao início do segmento atual durante a intercalação balanceada, necessário para que o iterador não descarte o primeiro registro do próximo segmento- Throws:
IOException- Se ocorrer um erro ao posicionar o ponteiro no arquivo.
-
truncate
Trunca o arquivo, removendo todos os dados, exceto o UUID. Este método apaga todos os registros e reinicia os contadores do banco de dados mantendo apenas o identificador único do banco de dados.- Throws:
IOException- Se ocorrer um erro ao truncar o arquivo.
-
isFinished
public boolean isFinished()Verifica se o ponteiro do arquivo chegou ao final. Este método verifica se a posição do ponteiro de leitura no arquivo é igual ao comprimento do arquivo, indicando que não há mais dados para serem lidos.- Returns:
truese o ponteiro de leitura estiver no final do arquivo,falsecaso contrário.
-
updateHeader
Atualiza o cabeçalho do banco de dados no arquivo, incluindo informações como o UUID, o último ID, as flags e o número de faixas e espaços. Este método sobrescreve as informações do cabeçalho no início do arquivo.- Throws:
IOException- Se ocorrer um erro de leitura ou escrita ao atualizar o cabeçalho no arquivo.
-
listFilePaths
Retorna um array contendo os caminhos de todos os arquivos associados a este banco de dados, incluindo o arquivo de dados e quaisquer arquivos de índice.- Returns:
- Um array de strings com os caminhos dos arquivos associados ao banco de dados.
-
setFilter
Define o filtro de busca a ser utilizado para operações de pesquisa. Este filtro pode ser usado para buscar faixas que correspondam a um campo e valor específicos.- Parameters:
searchFilter- O filtro de busca a ser aplicado.
-
setFilter
Define o filtro de busca baseado em um campo e um valor específicos.- Parameters:
field- O campo da faixa a ser filtrado.value- O valor que o campo deve ter para que a faixa seja retornada.
-
getFilter
Retorna o filtro de busca atual.- Returns:
- O filtro de busca atualmente definido, ou
nullse não houver filtro.
-
clearFilter
public void clearFilter()Limpa o filtro de busca atual. Após chamar este método, nenhum filtro será aplicado nas buscas. -
iterator
Retorna um iterador para percorrer as faixas armazenadas no banco de dados. O iterador percorre as faixas em sequência, respeitando a ordem de leitura dos registros no arquivo. Durante a iteração, as faixas que correspondem ao filtro de busca (se definido) serão retornadas.- Specified by:
iteratorin interfaceIterable<Track>- Returns:
- Um iterador para as faixas armazenadas no banco de dados.
- Throws:
RuntimeException- Se houver um erro ao posicionar o ponteiro no primeiro registro ou ao obter a próxima faixa.
-
getUUID
-
getLastId
public int getLastId()Retorna o último ID inserido no banco de dados.- Returns:
- O último ID inserido.
-
setLastId
Define o último ID inserido no banco de dados e atualiza o cabeçalho.- Parameters:
lastId- O último ID a ser definido.- Throws:
IOException- Se ocorrer um erro ao atualizar o cabeçalho.
-
getNumTracks
public int getNumTracks()Retorna o número de faixas válidas no banco de dados.- Returns:
- O número de faixas válidas.
-
getNumSpaces
public int getNumSpaces()Retorna o número de espaços usados no banco de dados, incluindo os com lápides.- Returns:
- O número de espaços usados.
-
getFilePath
Retorna o caminho para o arquivo de banco de dados.- Returns:
- O caminho do arquivo de banco de dados.
-
getDefaultFileExtension
Retorna a extensão de arquivo padrão utilizada para o banco de dados.- Returns:
- A extensão de arquivo padrão.
-
isSegmentFinished
public boolean isSegmentFinished()Verifica se o segmento atual de faixas foi completamente processado.- Returns:
truese o segmento foi processado,falsecaso contrário.
-
hasPrimaryIndex
public boolean hasPrimaryIndex()Verifica se o banco de dados possui um índice.- Returns:
truese o banco de dados estiver indexado,falsecaso contrário.
-
hasBTreeIndex
public boolean hasBTreeIndex()Verifica se o banco de dados utiliza um índice do tipo Árvore B.- Returns:
truese o índice for do tipo Árvore B,falsecaso contrário.
-
hasDynamicHashIndex
public boolean hasDynamicHashIndex()Verifica se o banco de dados utiliza um índice do tipo Hash.- Returns:
truese o índice for do tipo Hash,falsecaso contrário.
-
hasInvertedListIndex
public boolean hasInvertedListIndex()Verifica se o banco de dados utiliza um índice de Lista Invertida.- Returns:
truese o índice for de Lista Invertida,falsecaso contrário.
-
setBTreeIndex
Configura o uso de um índice do tipo Árvore B no banco de dados.- Parameters:
value-truepara habilitar o índice Árvore B,falsepara desabilitar.- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo.
-
setBTreeIndex
Configura o uso de um índice do tipo Árvore B no banco de dados com uma ordem específica.- Parameters:
value-truepara habilitar o índice Árvore B,falsepara desabilitar.order- A ordem da Árvore B.- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo.
-
setDynamicHashIndex
Configura o uso de um índice do tipo Hash Dinâmica no banco de dados.- Parameters:
value-truepara habilitar o índice Hash Dinâmica,falsepara desabilitar.- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo.
-
setDynamicHashIndex
Configura o uso de um índice do tipo Hash Dinâmica no banco de dados com uma capacidade de bucket específica.- Parameters:
value-truepara habilitar o índice Hash Dinâmica,falsepara desabilitar.bucketCapacity- A capacidade do bucket para a tabela hash.- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo.
-
readInvertedIndexes
Lê os índices invertidos para o nome, álbum e artista fornecidos.- Parameters:
name- O nome da faixa a ser lido no índice invertido.album- O nome do álbum a ser lido no índice invertido.artist- O nome do artista a ser lido no índice invertido.- Returns:
- Um array de inteiros contendo os IDs das faixas que correspondem aos critérios.
- Throws:
IOException- Se ocorrer um erro de leitura no arquivo.
-
resultsIntersection
private static int[] resultsIntersection(int[]... arrays) Encontra a intersecção de N arrays, podendo incluir arrays nulos ou vazios.- Parameters:
arrays- Arrays de inteiros que serão processados para encontrar a intersecção.- Returns:
- Um array de inteiros contendo os elementos que estão presentes em todos os arrays fornecidos, ignorando aqueles que são nulos ou vazios.
-
invertedIndexSplit
Divide os campos de nome, álbum e artista de uma faixa em partes menores, filtrando palavras com mais de 3 caracteres e que correspondem a letras.- Parameters:
t- A faixa a ser dividida.- Returns:
- Um array de strings contendo as partes divididas do nome, álbum e artista.
-
insertInvertedIndexes
Insere índices invertidos para uma faixa no banco de dados.- Parameters:
t- A faixa para a qual os índices serão criados.- Throws:
IOException- Se ocorrer um erro de E/S durante a operação.
-
deleteInvertedIndexes
Remove índices invertidos de uma faixa no banco de dados.- Parameters:
t- A faixa para a qual os índices serão removidos.- Throws:
IOException- Se ocorrer um erro de E/S durante a operação.
-
setInvertedListIndex
Configura o uso de índices de lista invertida no banco de dados.- Parameters:
value-truepara habilitar os índices de lista invertida,falsepara desabilitar.- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo.
-
disableIndex
Desabilita todos os índices no banco de dados.- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo.
-
reindex
Reindexa o banco de dados, recriando o índice atual.- Throws:
IOException- Se ocorrer um erro de leitura ou escrita no arquivo.
-
isOrdered
public boolean isOrdered()Verifica se o banco de dados está ordenado.- Returns:
truese os registros no banco de dados estiverem ordenados por ID,falsecaso contrário.
-
setOrdered
Define o estado de ordenação do banco de dados.- Parameters:
value-truepara marcar o banco de dados como ordenado,falsepara marcar como não ordenado.- Throws:
IOException- Se ocorrer um erro ao atualizar o cabeçalho do arquivo.
-